Const:C++常对象,常变量,常成员函数
本文目录 3 个章节
Const:C++常对象,常变量,常成员函数
# Const:C++常对象,常变量,常成员函数
创建时间:2020/1/16 16:45
用const修饰的声明数据成员称为常数据成员
- 任何函数都不能对常数据成员赋值。
- 构造函数对常数据成员进行初始化时也只能通过初始化列表进行。(只有此一种方法)
- 常数据成员在初始化时必须赋值或称其必须初始化.
- 如果类有多个默认构造函数必须都初始化常数据成员。
Notes:
- 不能对常数据成员在类中初始化,要通过类的构造函数,只有静态常量才能这样初始化。
string str1 = "test";
string str2 = "test";
用const修饰的声明声明成员函数称为常成员函数
声明:<类型标志符>函数名(参数表)const;
说明:
1. const是函数类型的一部分,在实现部分也要带该关键字。 2. const关键字可以用于对重载函数的区分。 3. 常成员函数不能更新任何数据成员,也不能调用该类中没有用const修饰的成员函数,只能调用常成员函数和常数据成员。
Notes:
- const是函数类型的一部分,在实现部分也要带该关键字。
- 常对象只能调用常成员函数。
- 普通对象可以调用全部成员函数
- 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针
- 在C++中,this指针被隐含地声明为: X * const this,这意味着不能给this 指针赋值
- 在X类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作)
- 由于this并不是一个常规变量,所以,不能取得this的地址
string str1 = "test";
string str2 = "test";
对于c++的成员函数(当然不是静态成员函数),都会含有一个隐藏的参数 int GetValue()函数,在编译后会变成:
int GetValue(A * const this); //不能修改this变量,但可以修改this指向的内容,即:this是常量指针。
int GetValue()const ,编译后是:
int GetValue(const A* const this);
this指针的出现就解释了,所有类A的对象都是公用一套代码模版,为什么各个对象在调用成员函数的时候不会乱套。 C++为成员函数提供了一个名字为this的指针,这个指针称为自引用指针。每当创建一个对象时,系统就把this指针初始化为指向该对象。每当调用一个成员函数时,系统就自动把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时,C++编译器将根据成员函数this指针所指向的对象来确定应该引用哪一个对象的数据成员。通常情况下,this指针是隐含存在的,也可以将其显示的表示出来(即如上例中的 this->mValue。不过this指针只能在类中使用)
用const修饰的定义对象称为常对象
常对象是指对象的数据成员的值在对象被调用时不能被改变。常对象必须进行初始化,且不能被更新。不能通过常对象调用普通成员函数,但是可以通过普通对象调用常成员函数。常对象只能调用常成员函数。
以下两种声明完全一样没有任何区别: const <类名> <对象名> <类名> const <对象名>
总结:
既要使数据能在一定范围内共享,又要保证它不被任意修改,这时可以使用const。 对于const int * pa,指的是不能通过改变 * pa 的值来改变pa指向的变量的值,但可以通过改变pa指向的变量的值来改变 * pa的值。设置为常引用,还是可以改变实际的值。 指向常变量的指针变量:const 类型名 * 指针变量名;
- 如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它,而不能用一般的(指向非const型变量的)指针变量指向它。
- 指向常变量的指针变量除了可以指向常变量外,还可以指向未被声明为const的变量。此时不能通过此指针变量改变该变量的值
- 如果函数的形参是指向非const型变量的指针,实参只能用指向非const变量的指针,而不能用指向const变量的指针
在C++面向对象程序设计中,经常用常指针和常引用作函数参数。这样既能保证数据安全,使数据不能被随意修改,在调用函数时又不必建立实参的拷贝。用常指针和常引用作函数参数,可以提高程序运行效率。