C++学习之const详解篇

本文深入解析C++中常数据成员的初始化方式及常成员函数的特性,包括基本类型常数据成员、常对象数据成员的初始化,常成员函数不能修改数据成员的原因,对象常指针和常引用的限制,以及常成员函数与普通成员函数的互为重载。文章还详细解释了常对象、常指针和常引用如何调用常成员函数,并指出了一种特殊情况下的读写权限问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、常数据成员有两种:基本类型的和自定义类类型的。

const类型的数据成员的初始化只能通过初始化列表来初始化,不管类型是基本类型还是自定义的类类型:如下代码所示:

1.基本类型常数据成员


初始化:


2.常对象数据成员:


初始化:



二、常成员函数:

定义


正确实现:



疑问??

常成员函数为什么不能修改数据成员的值呢?

原因就是虽然我们看到的changeX()没有参数,但是实际上changeX()是有一个默认的参数Coordinate *this的。如果在函数后面加了const使函数变成了常成员函数,那么该常成员函数默认的就会有一个const Coordinate*this的参数,如下面代码所示。const标明 this是一个常量,因此它不能被更改,所以常成员函数不能修改数据成员的值。


互为重载:与常成员函数同名的普通成员函数与该常成员函数互为重载。


问题来了!!!


答案是调用普通成员函数,怎么才会调用常成员函数呢?

如果定义的是常对象,调用的时候调用的就是常成员函数!


三、对象的常指针和常引用

对象的常指针和对象的常引用也只能调用常成员函数。





一种特殊情况:

下面这种情况指针是常量,指针所指向的对象不是常量, 仍然有读写权限,所以下面的调用虽然有普通成员函数都没有问题。但是因为是常指针,指针不能再指向其他地址,所以会出错。

但是非常对象调用常成员函数不会报错,因为常成员函数只要求一个只读权限的参数,而该对象既能读也能写,完全符合要求。


三、最后总结:

(1)常对象只能调用常成员函数,不管普通成员函数有没有修改数据成员的值都不能调用。因为普通成员函数有个默认参数Coordinate * this,是具有读写权限的,而常对象去调用的时候,this就代表了该常对象的地址,而此时这个对象是常对象只有读的权限,如果用常对象去调用非常成员函数,也即普通成员函数,那么就会报如下的error:不能将“this”指针从“const coordinate“转换为Coordinate*。如果调用常成员函数,那么常成员函数的参数即为

const Coordinate * this,参数也是只读权限,和常对象一样,就不会报错了。

(2)对象的常指针和对象的常引用也只能调用常成员函数

(3)非常对象可以却可以调用常成员函数

(3)常成员函数的本质是内部使用常this指针

(4)常成员函数内使用数据成员时,不能改变数据成员的值

(5)常成员函数内可以调用普通的数据成员

(6)常成员函数不能调用普通成员函数

注意:

1)const Coordinate*p

2)Coordinate const*p

3)Coordinate * const p

前两种形式等同,都表明这个指针p所指向的对象是常量,不能再改变;最后一种标明指针p是一个常量,不能再指向别的地址,而指向的地址存储的内容可变。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值