您的位置:首页 > 编程语言 > C语言/C++

C++学习之const详解篇

2016-01-15 18:37 387 查看
一、常数据成员有两种:基本类型的和自定义类类型的。

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是一个常量,不能再指向别的地址,而指向的地址存储的内容可变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: