C/C++中各个位置的const关键字

Posted 狱典司

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++中各个位置的const关键字相关的知识,希望对你有一定的参考价值。

这里写目录标题

Ⅰconst修饰函数

常函数 — 成员函数名后加const

常函数是个只读函数,具有如下特点:

① 不能改变类中的成员变量;

② 不能调用非const成员函数。

如果在编写该const成员函数时,不慎修改了数据成员,或者调用了其他非const成员函数,编译器将指出错误,这就提高了代码健壮。

为什么通过值拷贝的方式捕获的外部变量是只读的?

按照C++标准,lambda表达式的operator()默认是const的,一个const成员函数是无法修改成员变量值的。
mutable 选项的作用就在于取消 operator () 的 const 属性。

【注意】普通成员函数才有常函数。

C++中构造函数,静态成员函数,析构函数,全局成员函数都不能是常成员函数。

① 构造成员函数的用途是对对象初始化,成员函数主要是用来被对象调用的,如果构造函数被设置成const,就不能更改成员变量,失去了其作为构造函数的意义。同理析构函数。

② 全局成员函数和静态成员函数static其函数体内部没有this指针,所以也不能是常成员函数

函数前加const

(1) 出现在返回值前面,函数返回值是一个常量。但是该返回值既可以赋值给一个常量,也可以赋值给普通变量

const int fun1(); //
int a; a=fun1();  // 正确,可以赋值给一个普通变量
const int b=fun1();  // 正确,可以赋值给一个常量

(2) 返回常内容指针,如const int *fun2( int &a ); 函数返回指针只可以赋值给常内容指针,不能赋值给普通指针。

const int *fun2( int &a );
int *q, c=5; 
const int *pValue; 
pValue=fun2( c );  	 // 正确,可以赋值给一个常内容指针
q=fun2(c); 			 // 错误,不可以赋值给一个普通指针

(3) **函数返回常指针。**与返回常量类似,可以将结果赋值给常指针、常内容指针或者普通指针

int * const fun3(int &a); 
int a=6;
int * const pValue = fun3(a);  	//正确,可以将结果赋值给常指针
const int *r=fun3(a); 			//正确,可以将结果赋值给常内容指针
int *q =fun3(a);				//正确,可以将结果赋值给普通指针

Ⅱ 修饰引用

遵循如下规则:
① 常引用可以是普通变量的引用;不能通过常引用来改变变量的值。

② 常引用也可以是常量的引用;一般引用不能作为常量的引用。

int a=3;
const int b=5;
const int &c=a; //正确,常引用可以是普通变量的引用,也可以是常量的引用。
const int &d=b; //正确,常引用可以是普通变量的引用,也可以是常量的引用
a=10;  			//正确
c=11;  			//错误,不能通过常引用来改变变量的值。
int &e=b; 		//错误,一般引用不能作为常量的引用

Ⅲ 修饰指针

常内容指针(不允许解指针)

例如 const char *pContent,是常内容指针;

指针变量所指地址的内容无法改变,但指针变量(指向地址)可以改变

char s1[100],s2[100];
const char *pContent=s1;
pContent=s2;  					 //正确,指针变量可以改变
pContent[0]='a'; *pContent='a';  //错误,指针变量所指内容无法改变

常指针

例如char const *pContent,是常指针;

指针变量所指地址的内容可以改变,但指针变量(指向地址)不能改变

char s1[100],s2[100];
char * const pContent=s1;
*pContent='a';  	//正确,指针变量所指内容可以改变
pContent=s2;  		//错误,指针变量无法改变

常内容常指针

例如const char* const pContent,是常内容常指针;

指针变量所指地址的内容不能改变,但指针变量(指向地址)也不能改变

har s1[100]="1234",s2[100];
const char* const pContent=s1;
s1[0]='a'; s2[0]='1';  
pContent[0]='x';  		//错误,指针变量所指内容无法改变
pContent=s2; 			//错误,指针变量无法改变
cout<<s1; cout<<s2  

以上是关于C/C++中各个位置的const关键字的主要内容,如果未能解决你的问题,请参考以下文章

C/C++中const关键字详解

C/C++指针

C/C++中const关键字详解

C/C++类和对象类中常用的关键字总结

C++ | const修饰的变量

const 在 C/C++ 中提供啥样的优化?