C++里的常对象,常成员及其之间的“混乱”关系

常对象,在定义对象前加一个const,就可以定义常对象了。

比如有这样一个类Class_A,可以 Class_A const A或者const Class_A A 这样定义一个常对象A。

①常对象中的所有数据成员都是const,因此必须有初值,无论什么情况下,常对象中的数据成员都不能被修改。

②除了合成的默认构造函数默认析构函数外,也不能调用对象的非const型的成员函数



然而,在实际的编程当中,我们有时候还是需要修改常对象中的某个数据成员的值的,这时可以将数据成员声明为mutable(可变的)来修改它的值。

声明的形式为:mutable 数据成员类型 数据成员名列表;//可变的数据成员声明

mutable是C++关键字,表示可变的数据成员,即使对象被定义为常对象。


常成员有两种,一种是常数据成员,另一种就是常成员函数啦。

常数据成员的声明方式为:const 数据成员类型 数据成员名列表;//常数据成员声明

①无论是成员函数,还是非成员函数,都不允许修改常数据成员的值。

②常数据成员只能通过构造函数初始化列表进行初始化。


常成员函数的声明方式,如果是在类体内声明的话,一般形式为:

class 类名{ //类体

...

返回类型 函数名( 形式参数列表 ) const  //常成员函数定义

{

函数体;

}

...

};

如果是在类体外声明的话,则需要在类体内和类体外都加上const:

class 类名{  //类体

...

返回类型 函数名(类型1 参数名1,类型2 参数名2,...) const;

...

};

返回类型 类名::函数名(形式参数列表)const  //常成员函数外部定义

{

函数体

}

注意:const是在函数头和函数体之间

不能写成 const 返回类型 函数名(类型1 参数名1,类型2 参数名2,...);

这种写法表示函数返回值只读(如返回只读引用)


啰里啰嗦说了很多形式上很简单的东西,我们来探讨一些有意思的东西吧?

有同学会问:

我定义一个const对象,和定义一个非const的对象,而这个非const的对象里的所有数据成员都是const的,那么这两个对象在实际的使用当中,是否等价呢?

答案是否定的!它们并不是这种简单地包含关系,而是两种不同的编程用法、技巧

下面是cosnt限定访问表格:



总结:

  1. 在一个类中,如果有些数据成员的值允许修改,另一些数据成员的值不允许修改,那么可以将一部分数据成员声明为const(常数据成员),使得其值不能修改。而普通的成员函数可以修改普通的数据成员,但只能访问常数据成员的值。
  2. 如果要求所有数据成员的值都不允许改变,可以将对象声明为const的(常对象),那么只能用const成员函数访问数据成员,且不能修改其值。这样,数据成员无论如何也不会被修改。
  3. 如果定义了一个常对象,只能调用其中的const成员函数,而不能调用非const成员函数。如果需要访问对象中的数据成员,可以将对象中所有的成员函数都声明为const成员函数,但应确保在函数中不会修改对象中的数据成员。
  4. 常对象中的成员函数不一定是常成员函数。如果在常对象中的成员函数未加const声明,C++把它作为非常成员函数处理。
  5. 常成员函数不能调用另一个非常成员函数。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值