C++之几个最常
1.同类对象间的数据共享——静态成员
静态数据成员
声明静态数据成员要采用关键字static;
类静态数据成员的定义和初始化
定义:static 数据类型 成员名;
初始化:数据类型 类名::静态数据成员名=初始值;
注意静态数据成员必须在文件作用域的某个地方用类名限定符对静态数据成员定义并初始化。
class Student
{
private:
int num;
char name[];
public:
static int count;//用于计数的静态变量(这里就是用来计数学生的个数的)
Student(){count++;}
Student(char*,int _num=0);
~Student(){count--;}
};
int Student::count=0;//在类外用类名限定符初始化;
访问这个静态数据成员的方式:
Student::count;或 Student stu[2]; stu[0].count==stu[1].count;
同全局变量相比,使用静态数据成员的优势。
(1)静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。
(2)可以实现信息的隐藏,保证了信息的安全性。
总结:对于静态数据成员,在程序中只能提供一个定义,这就意味着静态成员不应该被放在头文件中,
或者是包含inline函数定义的文件中。由于静态成员在类中只有一份定义,在其对象中没有拷贝,因此
静态成员不依托于类对象的存在而存在。因此在没有实体对象的时候,我们访问静态数据成员的时候需
要通过域操作符::来访问。
静态函数成员
静态函数的声明在类中也用关键字static声明。
在上面的成员函数里加上static int GetCount(){return count;}
访问方式:Student::GetCount();
静态函数成员的目的:如果上面那个静态变量不是公有的,那么就不能直接Student::count;这样访问
了,这是不允许的,所以需要留出一个访问出口来访问这个静态变量。
注:静态成员函数可以直接访问该类的静态数据和函数成员。而访问非静态数据成员必须通过参数传递
方式得到对象名,然后通过对象名访问。
总结:静态成员函数和静态成员数据一样,在类对象中只有一份拷贝,对静态函数的调用可以通过类对
象实例,如stu[0].GetCount()。或者像上面那种方式。一般来说,静态成员函数主要用于对静态数据
成员进行维护雨数据共享。
2.常引用
常引用简单来说就是在引用时加一个const修饰符,保证引用访问时不更改该对象。
例如:void Compare(const int& x,const int& y);
常引用一般出现在函数参数表内,用以在函数调用对象的时候保证对象的数据不被更改。一旦更改择会
报错。
例如:
void Compare(const int& x,const int& y);
{
if(x==y)->if(x=y);//有赋值发生x的值改变了,则会报错。
}
3.常成员
类中有时候需要用到某些常量,这些常量如果定义为全局常量,这样的类显然不适合代码移植,所以在
类中定义为类的常成员,就可以很方便的移植了。
class Circlecal
{
private:
double Radius;
const double PI;//常量的定义
public:
Circlecal(double r=0):PI(3.1415)//常量的初始化
{
Radius=r;
}
}
上述是求圆的面积的简洁类定义,PI就是那个常量。
注意常量的初始化只能在初始化列表中给出。
如果像上述则PI在每一个对象都有一份拷贝,造成了数据的冗长,静态常成员数据可以解决这个问题。
如static const double PI;其初始化与静态成员初始化相同,需要在非头文件中初始化。
常成员函数
在普通的函数后面加上const就是一个常成员函数了;
class Circlecal
{
private:
double Radius;
const double PI;//常量的定义
public:
Circlecal(double r=0):PI(3.1415)//常量的初始化
{
Radius=r;
}
double DetR()const;//声明常函数,用于返回圆的半径
}
double Circlecal::GetR()const//定义常函数的时候不可将const省去
{
Radius=3;//错误!不可以改变Radius的值
return Radius;
}
总结:常成员函数不能更新对象的数据成员,也不能够调用任何非常成员函数虽然如此,如果该类中含
有指针,那么在常成员函数中就能修改指针指向的对象,而编译器不会检查到这种错误。
4.常对象
常对象就是对象在生存期内不可更改的对象。
#include <iostream>
#include <cmath>
#include<iomanip>
using namespace std;
class CircleCal
{
private:
double Radius; //定义半径
static const double PI;//静态常成员数据的定义
public:
CircleCal(){};
CircleCal(double);
double Cal(); //声明计算面积函数
double GetR() const;
double GetR();
~CircleCal(){};
};
const double CircleCal::PI=3.1415;//静态常成员数据的初始化
CircleCal::CircleCal(double r):Radius(r){};
double CircleCal::Cal()
{
return pow(Radius,2)*PI;
}
double CircleCal::GetR() const
{
cout<<"const function is loaded"<<endl;
return Radius;
}
double CircleCal::GetR()
{
cout<<"normal function is loaded"<<endl;
return Radius;
}
int main()
{
const CircleCal R1(2.5); //定义CircleCal的常对象R1
// const CircleCal R2; //错误!R2必须被初始化
// cout<<setw(4)<<R1.Cal()<<endl; //错误!R1不能调用非const成员函数
cout<<"the Radius of R is: "
<<setw(4)<<R1.GetR()<<endl;
}
常对象首先需要被初始化,然后使用,在使用过程中,常对象只能调用常成员函数,因为一切调用非常
成员函数都被视为是危险的,即便这个非常成员函数并没有修改成员数据。一般来说,如果需要有常对
象的访问,编写常函数是很重要的。
5.常指针与指针常量
常指针格式:
const 数据类型 *指针名
如const int *p
常指针即:不能通过该指针的间接引用改变所指向的值;但是指针所指变量本身可以改变,指针变量也
可以被不同地址赋值。
指针常量格式:
数据类型 *const 指针名=初始地址
如int *const p=&a
这种指针定义时候就被初始化,以后所存地址都不能改变,但是可以通过间接引用改变所指变量的值
注意:是字符串常量存放在内存中,有自己的固定首地址,也就是说如果把字符串常量的首地址看成是
指针的话,那么该指针既是常指针(值不变)又是指针常量(首地址固定)
另外字符串常量可以又数组或者字符指针方式表示:
用数组表示:
char str_array[]="china";//数组名是指针常量
char *str_ptr="china";//字符指针是常指针
C++之几个最常的更多相关文章
- JavaScript 字符串实用常操纪要
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- C++常考面试题汇总
c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...
- OCP考点实战演练02-日常维护篇
本系列宗旨:真正掌握OCP考试中所考察的技能,坚决不做Paper OCP! 实验环境:RHEL 6.4 + Oracle 11.2.0.4 OCP考点实战演练02-日常维护篇 1.数据库体系结构和AS ...
- c/c++常见面试题
1. C中static有什么作用 (1)隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命 ...
- C++点滴----关于类常成员函数
关于C++中,类的常成员函数 声明样式为: 返回类型 <类标识符::>函数名称(参数表) const 一些说明: 1.const是函数声明的一部分,在函数的实现部分也需要加上const ...
- Node.js开发者最常范的10个错误
目录 前言 1 不使用开发工具 1.1 自动重启工具 1.2 浏览器自动刷新工具 2 阻塞event loop 3 频繁调用回调函数 4 圣诞树结构的回调(回调的地狱) 5 创建一个大而完整的应用程序 ...
- C#新手常犯的错误
虽然这篇post的标题是新手常犯的错误,实际上很多有经验的程序员也经常犯这些错误,我整理了一下,就当是笔记.1.遍历List的错误,比如如下代码: List<String> strList ...
- Windows XP系统下添加任务计划常出现问题解决办法
Windows XP系统下添加任务计划常出现问题解决办法 计划任务就是让电脑在指定的时间内执行指定的动作(计划动作),这些动作可以是一个程序,也可以是一个批处理,但是至少是可以运行的(通俗一些就是双击 ...
- [Linux]在linux中,常常用到ctrl和其他按键组合,常用的有哪些及意义呢
在linux中,常常用到ctrl和其他按键组合,常用的有哪些及意义呢? Ctrl+c 结束正在运行的程序 Ctrl+d 结束输入或退出shell Ctrl+s 暂停屏幕输出[锁住终端] Ctrl+q ...
- ASP.NET常见面试题及答案(130题)
1.C#中 property 与 attribute(抽像类)的区别,他们各有什么用处,这种机制的好处在哪里?答:property和attribute汉语都称之为属性.不过property是指类向外提 ...
随机推荐
- PostMan如何做Post请求测试
首先要下载 一个Postman的软件,我这里没有下载地址,据说要翻 墙 下面是使用postman模拟post请求的步骤 我这里请求的API地址和请求的参数都是乱填写的,使用的时候请自行替换你们需要的A ...
- vue搭建app, M端项目流程
思路:安装sass预处理嵌套css,flex布局,flexible手机淘宝适配和fastclick移动300s延迟 打开cmd,使用命令行 1.切换盘符:e: 2.使用vue建立一个项目,具体请看我的 ...
- 初识中间件Kafka
初识中间件Kafka Author:SimplelWu 什么是消息中间件? 非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件 关注于数据的发送和接 ...
- 使用token做认证
对当前用户,使用base64加密token,再解密token,但是不如JWT加密安全 import time import base64 import hmac def generate_token( ...
- java中的static
1.静态方法 在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: 1. 它们仅能调用其他的static 方法. 2· 它们只能访问s ...
- 【lamba】java 8的新特性
看到lamba表达式用起来还不错,找了几篇文章学习下: 所以结合之前两个反编译的结果可以看到,lamdba表达式运行整体思路大致如下: 1. lamdba表达式被编译生成当前类的一个私有静态方法 2. ...
- Jenkins Vue项目自动构建以及构建后续操作
Jenkins在linux上的安装教程:http://www.ityouknow.com/springboot/2017/11/11/springboot-jenkins.html 另外,关于在win ...
- Cocos Creator Animation 组件
使用脚本控制动画 Animation 组件 Animation 组件提供了一些常用的动画控制函数,如果只是需要简单的控制动画,可以通过获取节点的 Animation 组件来做一些操作. 播放 var ...
- CentOS6.x 下 /etc/security/limits.conf 被改错的故障经历
Intro 我司本小厂,每个员工都是身兼数职,所以开发人员直接登录线上服务器改东西是常态.有些开发人员,自持水平较高(的确水平也是较高,但缺乏对系统的敬畏),所以总是越俎代庖,改一些本身应该是线上运维 ...
- UOJ#424. 【集训队作业2018】count 多项式,FFT,矩阵
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ424.html 题解 主席太神仙了! 首先我们把题意转化成:对所有挺好序列建 笛卡尔树,有多少笛卡尔树互不 ...