某日二师兄加入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
尝试应用这两个关键字。
好了,今日份面试到这里就完结了,小伙伴们,对于明天二师兄的面试,能打几分呢?
关注我,带你21天“精通”C++!(狗头)
发表回复