聊聊C++关键字const
面试的时候被问到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在函数名前面的时候修饰的是函数返回值.
上一篇: C语言.const修饰的作用
下一篇: javaer学c++: const关键字
推荐阅读
-
C++中const关键字用法总结
-
C++中的const的简单用法
-
了解javascript中let和var及const关键字的区别
-
C++ const常量对象、常量成员函数和常引用
-
C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)
-
C++高级编程之对象模型、const、new和delete及其重载讲解
-
C++雾中风景10:聊聊左值,纯右值与将亡值
-
php类中的$this,static,final,const,self这几个关键字使用方法
-
C++入门之new和delete关键字、静态成员属性与函数、this指针使用介绍
-
C++关键字总结【新手必学】