关于c++:C面试八股文static和const的关键字有哪些用法

1次阅读

共计 1656 个字符,预计需要花费 5 分钟才能阅读完成。

某日二师兄加入 XXX 科技公司的 C ++ 工程师开发岗位第 7 面:

面试官:C++ 中,staticconst 的关键字有哪些用法?

二师兄:satic关键字次要用在以下三个方面:1. 用在全局作用域,润饰的变量或者函数为动态的,限度在本文件内应用。2. 办法内润饰润饰动态局部变量,在第一次拜访的时候初始化。3. 内类润饰成员函数和成员变量,此函数或变量由类持有,而非类的对象持有。

二师兄:const关键字次要也有三个用处:1. 润饰函数参数,则在函数外部不能够批改此参数。2. 润饰类的成员办法,外表此办法不会更改类对象的任何数据。3. 润饰变量,表明变量不能够被修该。

面试官:当初两个指针,一个是 const int*, 另一个是int * const, 两者有什么区别?

二师兄:这要要看 const* 的地位,const在前称为常量指针,const在后称为指针常量。常量指针的指针局部可变,指针指向的内容不可变。指针常量则相同,指针指向的内容可变,指针不可变。

面试官:嗯,那么你晓得顶层 const 和底层 const 吗?

二师兄:额。。。不晓得。。。

面试官:晓得 constexpr 关键字的作用吗?

二师兄:理解一些。constexpr关键字润饰的变量具备编译器求值的性能。润饰的函数是否在编译器求值要取决于传入的参数是不是编译器确定的,这属于元编程的领域。

面试官:嗯,那你晓得 constevalconstinit这两个关键字的作用吗?

二师兄:额。。。理解过一些,遗记了。

面试官:好的,回去等告诉吧。

让咱们来复盘一下今日二师兄的体现:

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 不能被疏忽。

你晓得 constevalconstinit这两个关键字的作用吗?

还记得 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++!(狗头)

正文完
 0