首页 > 编程语言 >C++面试八股文:static和const的关键字有哪些用法?

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

时间:2023-06-12 22:55:19浏览次数:58  
标签:const int 修饰 C++ 关键字 static 求值 指针

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

某日二师兄参加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尝试使用这两个关键字。

标签:const,int,修饰,C++,关键字,static,求值,指针
From: https://www.cnblogs.com/bujidao1128/p/17476319.html

相关文章

  • C++面试八股文:了解位运算吗?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第12面:面试官:了解位运算吗?二师兄:了解一些。(我很熟悉)面试官:请列举以下有哪些位运算?二师兄:按位与(&)、按位或(|)、按位异或(^),按位取反(~)、左移(<<)和右移(>>)。面试官:好的。那你知道位运算有什么优势吗?二师兄:优势主要有两点:1.速度快。2.节......
  • c++ create daemonizeMe
    daemonizeMe//Copyright(c)2017DeepAggarwal#include<getopt.h>#include<grp.h>#include<pwd.h>#include<stdlib.h>#include<syslog.h>#include<sys/stat.h>#include<sys/types.h>#include<unistd.h>#include......
  • C++采用Daemon进行后台程序的部署
    文章目录一、如何采用Daemon进行后台程序的部署1.创建子进程2.终止父进程3.创建新的会话4.改变当前工作目录5.重设文件权限掩码6.关闭不需要的文件描述二.代码示例 一、如何采用Daemon进行后台程序的部署在C++中,如果要让一个程序一直在后台运行并且和......
  • 【C++】STL常用容器总结之十二:string类
    13、string类声明string类本不是STL的容器,但是它与STL容器有着很多相似的操作,因此,把string放在这里一起进行介绍。之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完......
  • c++中string类的源代码
    一:回顾(1)c++中的string类是在面试中和笔试中经常考的题目;工程代码免费下载 string类的自行实现(2)c++中的string类和fstream类合起来是处理外部数据的利器;(3)string类经常用到findfind_first_offind_first_not_offind_last_offind_last_not_ofsubstrreplace等,以及联合使用来达......
  • C++ operator关键字(重载操作符)
    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。  这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)......
  • C++ 运算符重载讲解与经典实例
    C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作。例如: classcomplex{public:complex(doubler=0.0,doubleI=0.0){real=r;imag=I;}voiddisplay();private:doublereal;doubleimag;};comple......
  • C++面试八股文:如何在堆上和栈上分配一块内存?
    C++面试八股文:如何在堆上和栈上分配一块内存?某日二师兄参加XXX科技公司的C++工程师开发岗位6面:面试官:如何在堆上申请一块内存?二师兄:常用的方法有malloc,new等。面试官:两者有什么区别?二师兄:malloc是向操作系统申请一块内存,这块内存没有经过初始化,通常需要使用memset手......
  • (一)、C++学习随笔:指针
    北京时间2023年6月11日22点53分,天气总体晴,温度适宜。没写随笔差不多一年了,也从佛山的广发银行、美的外包跳槽到了深圳坂田这边的华为OD,JAVA或许是干的不太愿意深入了,想学习下C++。今天学习到C++的重点之一:指针,鄙人不才,记忆力不太好,所谓的好记性不如烂笔头,把学到的指针知识都记录下......
  • 《C++》C转C++基础2
    跳转语句break、continue、goto。数组一维数组、二维数组创建、赋值、访问同C。函数定义、声明、调用同C,代过。指针变量指针、数组指针、结构体指针同C,代过。结构体结构体、结构体数组、结构体指针同C,代过......