const的涵义
const,即constant,有维持不变的原意。C++用它来抒发维持不变的语法。
const促进作用
const主要就用作三个地方性:
抒发式表述(表述自抒发式,常第一类,常核心成员抒发式)抒发式(润色codice,模块,核心成员抒发式)const的益处:
类别检查和。const自抒发式与#define 宏表述差别是const自抒发式具备类别的,能展开类别检查和,而#define宏表述而已数组代替,无法展开类别检查和。特别注意点:
①虽然const表述的自抒发式,先期无法对该自抒发式展开抒发式操作方式,故须要const润色的抒发式要调用。
②或许const表述的抒发式不容更动。
操作方式符和const
当中操作方式符抒发式分成top-levelconst和low-levelconst,如下表所示。
总结来说:
const位于*的左边为low-levelconst,即对准自抒发式 。
const位于*的右边 top-levelconst,即操作方式符这类是自抒发式 。
另外STL迭代器系以操作方式符为根据塑造出来,所以迭代器的促进作用类似于T*操作方式符。故
声明迭代器为const就像声明操作方式符为const一样(即声明了两个T* const操作方式符),表示这个迭代器不得改变其对准。 如果希望迭代器所称的东西不容被改动(即希望STL模拟两个const T*操作方式符),则应该用const_iterator。抒发式和const
1.const润色抒发式codice ,通常用作codice为引用的情形,为了避免返回后被修改。
Q:什么时候返回引用更好?
A:返回引用一定要保证返回后第一类依然存在,故一般模块是引用时且要返回模块此时返回引用更好。2.const润色核心成员抒发式,表明该核心成员抒发式不会修改non-static数据核心成员。原因能理解为由const润色核心成员抒发式的this操作方式符将变为const T * const 类别(普通核心成员抒发式为T * const), 故
如果用const润色抒发式后,该抒发式将无法修改数据核心成员,否则将报错。 const核心成员抒发式只能调用const核心成员抒发式,否则将报错。为什么呢?其实能这样理解,每个普通核心成员函数的this操作方式符是没low-levelconst限定的,故无法接收const核心成员抒发式的const T * const 操作方式符,这是不安全的。但是能访问static核心成员。 Note:
①常第一类只能访问const核心成员抒发式,故为了能够正确使用常第一类,我们应该将不会修改数据核心成员的抒发式设为const。普通第一类既能访问const核心成员抒发式也能访问普通核心成员抒发式。
②constURL能用作对重载抒发式的区分,虽然this操作方式符类别变了,或许抒发式签名相同,故能由const区分三个抒发式。
各种情形其实都能通过this操作方式符的类别来分析!!!3.const润色模块 ,通常用作pass-by-reference用以避免拷贝,但又不想抒发式修改实参,此时能用const润色模块。
另一种情况就是传递操作方式符时加const,能防止通过操作方式符修改实参。例如下表所示面的抒发式
上述抒发式的实现参考C/C++数组。
类和const
数据核心成员也能表述为const,此时须要通过调用列表展开调用。
const抒发式默认为文件私有
非const润色的全局抒发式默认为extern,要使const抒发式能够在其他文件访问,要在文件中显式地指定为extern
待补充….
const用法的最佳实践须要在使用中才能了解,笔者目前实践不多,等先期实践后再补充。
(两个const都能玩出这么多花样,不愧是C++,orz)
参考
更多学习资源
C++ Core Guidelines