C++共享数据的保护-const

 对于需要共享又要防止被修改的数据因该声明为常量;

1. 常对象

 常对象的数据成员的值在整个生存期间都不会被改变,所以常对象必须初试化,然后不能被更新

class A
{
public:
	……
	A(int a,int b):x(a),y(b){}
	……
private:
	int x,y;
};
const A a(3,4);

【属性】常对象不能被赋值的两种保护:
(1)一般用对象.数据成员=值的方式,但是限制其不能这样赋值。
(2)类中用成员函数访问去更改值,而语法规定:不能通过常对象调用普通成员函数
而常对象唯一的对外接口是:
(3)调用常成员函数


2. 常成员函数

类型说明符 函数名(参数表) const { }

(1)因为不管是否是常常对象调用常成员函数,都会将该对象视作常对象,那么此时的常成员函数是不能修改对象的数据成员的值。
(2)const可以被视为重载的区分:(一般如果对象为非常对象调用这两个重载函数,优先调用非常成员函数)

void print();
void print() const;

扩展理解
非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);唯一的例外是对于mutable修饰的成员。
总结:

  1. 非const对象/const对象------>const成员函数
  2. const的对象(只能)---->const成员函数
  3. 非const成员函数(只被)<------非const对象

  一般对于不需修改操作的成员函数尽量声明为const成员函数,以防止产生const对象无法调用该成员函数的问题


3.常数据成员

类中声明常数据成员后就不能在类成员函数或者外面对象访问赋值。只能通过初始化列表初始化。

class A{
public:
	A(int i);
private:
	const int a;
	static const int b; //静态常数据成员
}
A::A(int i) : a (i){}
const int A::b = 10;

【注意】类的静态变量和常量都是在类内声明,类外赋值的。但静态常量如果是整形和枚举类型可以直接在类内指定其值,此时编译器会将所有的A::b替换为10(但如果出现如给b取地址,需要分配空间,得专门定义A::b)


4. 常引用

常引用引用的对象不能被更新。如果常引用作参数,不会对原实参进行修改;

非常引用(绑定)—> 普通对象
常引用(绑定)—>常对象/普通对象----->(当作)常对象

 函数中无需改变其值的参数,不宜用普通引用方式传递,会使得常对象无法传入,可以传值或者常引用,传值会产生大量拷贝,传常引用更佳:复制构造函数一般用常引用传递
例如:

void func(char *a){........}
int main(){
	char *a="hello world!";
	func(a);
	return 0;
}
//调用func时,无法将字符常量转为char*,所以func()改为
void func(const char *a){........}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值