const member function
在一个类方法的声明后加上关键字const
使这个function成为const function
.
当调用常函数时,传进去的this
指针是const T* this
.
关于常函数有以下需要注意:
- 常函数不能修改对象内容
- 常函数体内部调用的函数也不能修改对象内容
- const 对象只能调用常函数
- 非const对象可以调用非常函数
这些特性不用死记:
- 之所以加
const
就是因为这个方法不会(也不能)修改对象,所以如果在此类函数内尝试修改对象,在编译期就会报错 - const对象是不能修改的,所以他们只能调用常函数。事实上,如果尝试调用const对象里面的非常函数,会有
discard qualified error
。因为这样相当于将一个const T*
类型的指针赋给T*
类型的指针,当然是不允许的。 - 非const对象调用常函数时相当于将
T*
类型的指针赋值给一个const T*
类型的变量,当然是可以的
复制构造函数参数
当需要自定义赋值构造函数时,其参数常常定义为reference to const
,例如:
SomeClass::SomeClass(const SomeClass& another);
- 为什么是引用?
如果不是引用,而是传值,那么传递参数的时候也要调用复制构造函数,那不是陷入和无限的循环中吗?事实上赋值构造函数的定义就是接受一个参数为类对象引用的构造函数。 - 为什么是
const
如果没有const
,那么就无法根据一个常对象构造一个新的对象,因为一个non-const reference
无法引用一个常对象