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关键字的主要内容,如果未能解决你的问题,请参考以下文章