某日二师兄加入 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++!(狗头)