欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

聊聊C++关键字const

程序员文章站 2022-07-09 21:47:07
...

面试的时候被问到const关键字,我只说出了几条,没说全,感觉面试官很不满意,回去就恶补了一下,现在跟大家分享一下:
(1)const变量和对象一旦定义就不能改变,故必须初始化
(2)默认状况下,const对象只在文件内有效。如果想在多个文件共享const对象就必须在变量定义前加extern关键字
(3)const的引用:把引用绑定到const上就像绑定到其他对象上一样,称之为对常量的引用。与普通引用不同的是对常量的引用不能被用作修改他所绑定的对象

const int ci=1024;
const int &r1=ci;
r1=42;//错误,r1是对常量的引用
int &r2=ci;//错误:试图让非常量引用指向一个常量对象

(4)对const的引用可能引用一个非const的对象:

int i=42;
int &r1=i;//引用r1绑定对象i
const int &r2=i;//r2也绑定对象i,但不允许通过r2修改i的值,却可以通过r1修改i的值
r1=0;
r2=0;//错误,r2是一个常量引用

(5)指针和const:
指针是对象而常量不是,因此允许把指针本身定为常量 常量指针必须初始化而且一旦初始化就不能改变其指向。把*放在const前面说明指针是一个常量,即不变得是指针本身得值而非他所指向对象的值。指针本身是一个常量并不意味着不能通过指针修改他所指对象的值,这取决于所指对象的类型,如果所指对象为常量而无法修改。
(6)顶层const和底层const:
顶层const:可以表示任意对象是常量,对任何数据类型都适用
底层const:与引用和指针等复合类型的基本类型部分有关。指针类型既可以是顶层const也可以是底层const,而引用类型只存在底层const

int i=0;
int *const p1=&i;//不能改变p1的值,这是一个顶层const
const int ci=42;//不能改变ci的值,顶层const
const int *p2=&ci;//允许改变p2的值,底层const
const int *const p3=p2;//靠右的const是顶层const,靠左的const是底层const,导致既不能修改p3的值也不能通过p3修改其所指对象的值
const int &r=ci;//用于申明引用的const都是底层const

当执行对象拷贝时顶层const和底层const有区别:
执行对象拷贝时对顶层const不受影响,但对底层const有影响。拷入和拷出的对象必须有相同的底层const资格或两个数据类型可以转换。如:非常量可以转换为常量,反之不行

int *p=p3;//错误,p3包含底层const而p没有
p2=p3;//正确,p2和p3都有底层const
p2=&i;//正确,int *能转换成const int *
int &r=ci;//错误,普通int &不能绑定到int常量上
const int &r2=i;//正确,const int &可以绑定到普通int

(7)constexpr 和常量表达式
C++11新标准规定允许将变量声明为constexpr类型以便编译器来验证变量的值是否是常量表达式。声明为constexpr的变量必须用常量表达式去初始化

constexpr int mf=20;
constexpr int limit=mf+1;//mf+1是常量表达式
constexpr int sz=size();//只有当size()是一个constexpr函数时才正确

指针和constexpr
如果用constexpr定义了一个指针,则限定符仅对指针本身有效,与指针所指对象无关。constexpr把所定义的对象置为顶层const
(8)const形参和实参:
当形参有顶层const时,传递给他常量对象或非常量对象都是可以的。当我们不希望形参在函数中改变时就可以用const修饰形参
(9)const修饰函数:
声明一个成员函数的时候用const关键字是用来说明这个函数是 “只读(read-only)”函数,也就是说明这个函数不会修改任何数据成员(object)。 为了声明一个const成员函数, 把const关键字放在函数括号的后面。声明和定义的时候都应该放const关键字。
任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。当const在函数名前面的时候修饰的是函数返回值.

相关标签: const