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是一个常量,不能再指向别的地址,而指向的地址存储的内容可变。
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是一个常量,不能再指向别的地址,而指向的地址存储的内容可变。
相关文章推荐
- C++ 中 const 使用
- 修练8年C++面向对象程序设计之体会
- 修练8年C++面向对象程序设计之体会
- C++历史段错误
- C语言中有string吗?
- C++语言学习资料大全分享 想要的速度下
- Effective C++(条款39-40)
- C++ vector的使用
- C++ Primer 5th Chapter 9 学习笔记
- C++中运算符重载
- c语言 数组名是常量指针
- MFC中ActiveX控件的使用
- C\C++ 使用do{...}while(0)进行宏定义的好处!!!
- 线程池的实现(c语言)
- 详解C++编程中标记语句与复合语句的写法
- 杨辉三角 C语言
- 魔方阵的实现 C语言
- C++ Primer 5th Chapter 8 学习笔记
- C++运行时获取类型信息的type_info类与bad_typeid异常
- C语言中的常用变量