C++ 关键字const

2023-09-06 0 303

const的涵义

const,即constant,有维持不变的原意。C++用它来抒发维持不变的语法。

const促进作用

const主要就用作三个地方性:

抒发式表述(表述自抒发式,常第一类,常核心成员抒发式)抒发式(润色codice,模块,核心成员抒发式)

const的益处:

类别检查和。const自抒发式与#define 宏表述差别是const自抒发式具备类别的,能展开类别检查和,而#define宏表述而已数组代替,无法展开类别检查和。

特别注意点:

①虽然const表述的自抒发式,先期无法对该自抒发式展开抒发式操作方式,故须要const润色的抒发式要调用。

②或许const表述的抒发式不容更动。

操作方式符和const

当中操作方式符抒发式分成top-levelconst和low-levelconst,如下表所示。

const int *ptr; // low-level const,即对准自抒发式的操作方式符 int const *ptr; // 同上,而已读法相同 int * const ptr; // top-level const,即操作方式符这类是自抒发式const int * const ptr; // 既是low-level也是top-level const,ptr是对准自抒发式的操作方式符自抒发式
注:对准自抒发式的操作方式符没明确规定其所称第一类要是两个自抒发式,即”对准自抒发式“是操作方式符的一厢情愿,还能通过其他方式对其所称的抒发式展开修改。

总结来说:

const位于*的左边为low-levelconst,即对准自抒发式 。

const位于*的右边 top-levelconst,即操作方式符这类是自抒发式 。

另外STL迭代器系以操作方式符为根据塑造出来,所以迭代器的促进作用类似于T*操作方式符。故

声明迭代器为const就像声明操作方式符为const一样(即声明了两个T* const操作方式符),表示这个迭代器不得改变其对准。 如果希望迭代器所称的东西不容被改动(即希望STL模拟两个const T*操作方式符),则应该用const_iterator。
std::vector<int> vec; const std::vector<int>::iterator iter = vec.begin(); *iter = 100; // ok. iter++; // error, iter is const. std::vector<int>::const_iterator cIter = vec.begin(); *iter = 100; // error, cIter is a iterator to const iter++; // ok.

抒发式和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,能防止通过操作方式符修改实参。例如下表所示面的抒发式

char* strcpy(char* strDestination, const char* strSource);

上述抒发式的实现参考C/C++数组

类和const

数据核心成员也能表述为const,此时须要通过调用列表展开调用。

const抒发式默认为文件私有

非const润色的全局抒发式默认为extern,要使const抒发式能够在其他文件访问,要在文件中显式地指定为extern

// 非const润色的全局抒发式 // file1.cpp int a; // file2.cpp #include <iostream>extern int a; int main() { std::cout << a; } // const润色的全局抒发式 // file1.cpp extern const int a = 20; // file2.cpp#include <iostream>extern const int a; int main() { std::cout << a; }

待补充….

const用法的最佳实践须要在使用中才能了解,笔者目前实践不多,等先期实践后再补充。

(两个const都能玩出这么多花样,不愧是C++,orz)

参考

C++那些事

Effective C++

更多学习资源

cppreference.com

CPlusPlus

gcc

C++ Core Guidelines

Bjarne Stroustrup 的 C++ 风格与技术 FAQ(中文版)

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务