临县薛清爱葬礼全集,潮流语录,人民的名义全集下载资源
本文主要介绍const修饰符在c++中的主要用法,下面会从两个方面进行介绍:类定义中使用const、非类定义中使用const
非类定义中使用const是指:在除了类定义以外的场景中使用const。
const int a = 1; //定义一个常量,不可以修改 int b = 2; //定义一个普通变量,可以修改 const int &b = a; //定义一个常量引用,不可以通过引用b修改a,底层const const int *p = &a; //定义一个普通变量,p可以修改,但是不可以通过p修改所指向的对象a,底层const int * const q = &b; //定义一个常量指针,q不可以修改,但是可以通过q修改所指向的对象b,顶层const const int * const s = &a; //定义一个常量指针,s不可以修改,同时不可以通过s修改所指向的对象a,靠右的是顶层const,靠左的是底层const
顶层const:变量本身是个常量
底层const:变量所指向的对象是个常量
用于声明引用的const都是底层const
int fun1(const int a); //定义一个常量形参 const int fun2(int a); //等同于'int fun1(const int a);'因为函数返回的是返回值的副本 const int& fun3(int &a); //返回常量引用,不会进行对象的拷贝(注意:不要返回局部对象的引用或者指针) const int& fun4(int a); //这实际上是一种错误的声明方式,该函数可能会返回局部对象的引用或者指针
tips:
class test{ public: test():a(10){} void display(); private: const int a; };
问题:
类定义中不能赋值,类定义外部也不能赋值,但是又必须赋值,这可如何是好?
解决方案:
class test{ public: test():a(10){} void display(); private: const int a; //static const int a; }; //const int test::a = 5;
class test{ public: //下面是display函数的两个重载版本 void display(); //一个普通成员函 void display() const; //一个const成员函数。 private: const int a; };
tips:
成员函数都有一个额外的隐式参数this,this的值是调用该函数的对象地址,因此this是一个指针。
普通成员函数的this指针类型是:test* const this
const成员函数的this指针类型是:const test* const this
test t1; const test t2; t1.display(); //调用void display() t2.display(); //调用void display() const
因为两个函数的this指针类型不同,所以display有两个重载函数。
作用:
为了在函数体内禁止修改对象,可以通过定义const成员函数来实现。
others:
下图是截自c++ primer中的片段,请重点关注两个display函数的返回值:
display 普通成员函数的返回值是:普通引用
display const成员函数的返回值是:常量引用
造成返回值不同的原因就是:this指针类型不同
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论