C++中的static和const的关键字用法详解
某日二师兄参加XXX科技公司的C++工程师开发岗位第7面:
面试官:C++中,
static
和const
的关键字有哪些用法?二师兄:
satic
关键字主要用在以下三个方面:1.用在全局作用域,修饰的变量或者函数为静态的,限制在本文件内使用。2.方法内修饰修饰静态局部变量,在第一次访问的时候初始化。3.内类修饰成员函数和成员变量,此函数或变量由类持有,而非类的对象持有。二师兄:
const
关键字主要也有三个用途:1.修饰函数参数,则在函数内部不可以修改此参数。2.修饰类的成员方法,表面此方法不会更改类对象的任何数据。3.修饰变量,表明变量不可以被修该。面试官:现在两个指针,一个是
const int*
,另一个是int * const
,两者有什么区别?二师兄:这要要看
const
和*
的位置,const
在前称为常量指针,const
在后称为指针常量。常量指针的指针部分可变,指针指向的内容不可变。指针常量则相反,指针指向的内容可变,指针不可变。面试官:嗯,那么你知道顶层
const
和底层const
吗?二师兄:额。。。不知道。。。
面试官:知道
constexpr
关键字的作用吗?二师兄:了解一些。
constexpr
关键字修饰的变量具有编译器求值的功能。修饰的函数是否在编译器求值要取决于传入的参数是不是编译器确定的,这属于元编程的范畴。面试官:嗯,那你知道
consteval
和constinit
这两个关键字的作用吗?二师兄:额。。。了解过一些,忘记了。
面试官:好的,回去等通知吧。
让我们来复盘一下今日二师兄的表现:
const
在前称为常量指针,const
在后称为指针常量。
这里的表述仁者见仁智者见智。但是在大名鼎鼎的《C++ Primer Edition 5》中文版中,const int*
被称为指向常量的指针,而int* const
则被称为常量指针。这种表述更容易理解两种指针的差异。
你知道顶层
const
和底层const
吗?
这里的顶层const
和底层const
概念主要是为了区分const
修饰的是变量本身还是变量指向的内容。
int i = 42; const int ci = 42;//顶层const const int* pi = &i; //磁层const,因为const修饰的是i所在的地址,不能通过pi去修改i,但是可以修改pi int* const pi2 = &i;//顶层const,因为pi2无法修改 const int& ri = i; //底层const,不能通过ri修改i
在传递参数时,顶层const
可以被忽略,而底层const
不能被忽略。
你知道
consteval
和constinit
这两个关键字的作用吗?
还记得constexpr
是否在编译时求值要取决于传入的参数吗?如果传入的参数是编译时确定的,constexpr
函数就会在编译时求值,反之则会在运行时求值。
constexpr int add(int a, int b) { return a+b; } constexpr int sum1 = add(1,2); //编译时求值 int a = 1, b = 2; int sum2 = add(a,b); //运行时求值
当使用consteval修饰函数和变量时,如果不能在编译时求值,则编译错误。
consteval int add(int a, int b) { return a+b; } constexpr int sum1 = add(1,2); //编译通过,在编译时求值 int a = 1, b = 2; int sum2 = add(a,b); //编译失败
constinit
关键字用于声明一个变量为常量初始化变量。使用constinit
可以保证静态变量的初始化顺序和线程安全性,从而避免竞争条件的发生。需要注意的是,constinit
关键字只能用于静态变量的初始化,不能用于动态变量的初始化。
需要注意的是,consteval和constinit关键字是C++20引入的, 小伙伴们可以在编译时加入-std=c++20
尝试使用这两个关键字。
到此这篇关于C++中的static和const的关键字用法详解的文章就介绍到这了,更多相关C++ static和const关键字用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
C++使用MySQL-Connector/C++连接MySQL出现LNK2019错误的解决方法
这篇文章主要介绍了C++使用MySQL-Connector/C++连接MySQL出现LNK2019错误的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-03-03C++编程使用findfirst和findnext查找及遍历文件实现示例
这篇文章主要为大家介绍了C++编程如何使用findfirst和findnext查找及遍历文件实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助2021-10-10关于读取popen输出结果时未截断字符串导致的命令行注入详解
这篇文章主要给大家介绍了关于读取popen输出结果时未截断字符串导致的命令行注入的相关资料,文中通过图文及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2018-03-03vscode C++开发环境配置步骤详解(教你如何用vscode编写写C++)
这篇文章主要介绍了vscode C++开发环境配置详细教程(教你如何用vscode编写写C++),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-03-03
最新评论