突破编程_C++_面试(基础知识(一))

1 面试题1:static的用法

static 关键字可用于修饰全局函数和全局变量、函数的局部变量、类数据成员和类函数。
(1)修饰全局函数和全局变量:只能在本代码文件中使用。
(2)修饰函数的局部变量:有默认值0。始终驻留在全局数据区,直到程序运行结束。但其作用域仍为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。
(3)修饰类数据成员和类函数:不依赖于类对象的存在而存在。 static 类函数不可以使用 this 指针,同时 static 类函数也不能声明为虚函数

1.1 作用1:保持变量内容的持久

定义为 static 的变量会在程序刚开始运行时就完成初始化,这也是唯一的一次初始化。定义为 static 的变量在程序的运行过程中存储在静态数据区( C++ 的内存包括栈区、堆区、全局区(静态区)、BSS段、文字常量区以及程序代码区)。特别是对于静态局部变量而言,该变量也是始终驻留在全局数据区,直到程序运行结束。

static int s_val = 0;			// 静态全局变量 int main()
{static int val2 = 0;		// 静态局部变量 return 0;
}

上面代码中的 s_valval2 的声明周期均是整个程序运行过程。

1.2 作用2:隐藏

当同时编译多个文件时,被 static 关键字修饰全局函数和全局变量只能在本代码文件中使用,而所有未加 static 前缀的全局变量和函数都具有全局可见性。
该功能在 C 代码中更为常见,用于实现类似 C++ 中的私有成员变量以及私有成员函数的特性。

1.3 作用3:默认初始化为0

C++ 的内存分布中的两个区域:全局区(静态区)与 BSS 段。这两个区域所有的字节默认值都是0x00。
(1)全局区(静态区): 全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量又放在相邻的另一块区域中。程序结束后由系统释放。
(2)BSS段 :通常是指用来存放程序中未初始化的全局变量、静态变量(全局变量未初始化时默认为 0 )的一块内存区域。

1.4 作用4: static 修饰类数据成员和类函数

(1)static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(2)static 成员函数属于整个类所拥有,这个函数不接收 this 指针,并且只能访问类的 static 成员变量。
(3)static 成员函数不能被 virtual 修饰(即不能为虚函数)。

2 面试题2:const 关键字的作用

使用 const 关键字可以创建命名常量,即具有特定名称的常量变量。const 修饰符用于表示变量的值是不可修改的。例如:

const int val1=1;   

2.1 const 关键字修饰函数入参

设计函数参数的有一个原则是:能用 const 的就用 const(方便调用) 。比如创建一个用于打印字符串的函数。从这个需求来看,这个函数有一个字符串的入参,在其函数体中,只要读入这个字符串入参即可,无需对其修改。如果设计一个按值传递的函数,如下:

void printStr(string& str)		//采用引用的原因是避免值传递带来的拷贝过程,从而造成性能损失
{printf("%s\n",str.c_str());
}  

这样就会带来另外两个问题,第一:该函数只需要读入字符串的入参,并不用对其做修改,而按引用的传递,赋予了这个函数不应该有的权限。第二:不方便调用,比如有如下调用方式:

void printStr(string& str)
{printf("%s\n",str.c_str());
}int main()
{printStr("hello");			//错误:由于字符串 "hello" 是 const 类型,所以这里编译会报错。return 0;
}

因此,最合理的设计就是使用 const 关键字:

void printStr(const string& str)
{printf("%s\n", str.c_str());
}

2.2 const 关键字修饰指针

对指针来说,可以指定指针本身为 const ,也可以指定指针所指的数据为 const ,或二者同时指定为 const 。两者区别如下:
如果 const 位于*的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量。例如:

int a=1;
const int * ptr = &a;		//等同于 int const * ptr = &a;
*ptr = 2;					//错误:不能通过指针来修改变量的值

如果 const 位于*的右侧, const 就是修饰指针本身,即指针本身是常量。例如:

int a = 1;
int b = 2;
int * const ptr = &a;
ptr = &b;					//错误:不能修改指针的指向

2.3 const 关键字在类中的作用

使用 const 关键字修饰的类的成员函数,表明其是一个常函数,可以访问非 const 数据成员,也可以访问 const 数据成员。但是 const 成员函数不能修改类的成员变量,另外类的常对象只能访问类的常成员函数。如下为样例代码:

#include <iostream>
using namespace std;class Student
{
public:Student() {}~Student() {}public:void sayHello() const{m_name = "zhangsan";				//错误: 不能修改类的成员变量printf("%s\n", m_name.c_str());}string getName(){return m_name;}private:string m_name;
};int main()
{Student st;st.sayHello();const Student st2;string name = st2.getName();			//错误: const 对象不能调用非 const 成员函数return 0;
}

2.4 const 与 define 定义常量的区别

(1)处理阶段
const 常量是一个Run-Time的概念,他在程序中确确实实的存在可以被调用、传递。
define 常量是预处理器预处理阶段完成的,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。
(2)定义不同
define 是宏定义,它最大的特点就是语义替换,它定义的常量值没有类型限定,不做运算,也不做类型检查,在宏出现的地方直接展开。例如:

#define VAL 1+1 //我们预想的 VAL 值是 2 ,我们这样使用 VAL 
double a = VAL/2; //我们预想的a的值是1,可实际上 VAL 的值是 2
//实际上就是 a = 1+1/1 = 2

const 是关键字,其实就是一个只读变量,不能更改,它会在编译时检查数据类型。
(3)存储方式
const 常量存在于程序的数据段。
define 常量存在于程序的代码段。
const 定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝。
就空间效率而言:const 优于 define。
总结上述区别:一般推荐使用const关键字定义常量,因为它具有类型限制,更安全、更可读、更易于维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/658663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程代码案例之线程池

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构&#xff0c;javaee等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 创建线程池 public class Poo…

Xmind文件转CSV、Excel文件

不知道小伙伴们有没有发现&#xff0c;新版Xmind文件转Excel是收费的功能。因为自己不经常使用Xmind&#xff0c;收到一个这样的文件&#xff0c;需要转换成Excel&#xff0c;也不不值得破解或者付费。在github上有一个工具XMind2TestCase&#xff0c;非常不错&#xff0c;可以…

网安人必看!CISP家族顶流证书攻略

网络安全已成为当今的热门领域&#xff0c;证书在职业发展中的重要性不言而喻。但是&#xff0c;证书市场五花八门&#xff0c;选择适合自己的证书可是个大问题。别担心&#xff0c;今天我们就来聊聊CISP家族的几个热门认证&#xff0c;让你在网络安全领域的发展更加顺利&#…

openssl3.2 - helpdoc - P12证书操作

文章目录 openssl3.2 - helpdoc - P12证书操作概述笔记/doc/html/man1/CA.pl.htmlCA.pl -newcaCA.pl -newreqCA.pl -signCA.pl -pkcs12 "My Test Certificate"/doc/html/man1/openssl-pkcs12.html备注END openssl3.2 - helpdoc - P12证书操作 概述 D:\3rd_prj\cryp…

在虚拟环境中导出和安装requirements.txt文件

背景&#xff1a; ​ 一般在项目开放完成后&#xff0c;我们需要把项目工程所需要的虚拟环境依赖包导出&#xff0c;以便在服务器上进行安装和配置&#xff0c;这时候我们一般将所需要的python相关库导出一个txt文件&#xff0c;后续在服务器上之前pip安装即可。 措施&#x…

【HarmonyOS 4.0 应用开发实战】TypeScript入门之接口详讲

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

Nicn的刷题日常之带空格直角三角形图案

1.题目描述 描述 KiKi学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“*”组成的带空格直角三角形图案。 输入描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示直角三角形直角边的长度&am…

测试环境搭建整套大数据系统(二:安装jdk,mysql)

一&#xff1a;安装JDK 参考 https://blog.csdn.net/weixin_43446246/article/details/123328558 二&#xff1a;安装mysql 1.因为我们安装cdh6.3.2。cdh支持的是5.6和5.7版本的mysql。 2. 步骤 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.…

idea项目中如何引入jar包

idea项目中如何引入jar包 在 idea 中创建项目时&#xff0c;常要求配置环境&#xff0c;此时便会引入各种 jar 包&#xff0c;下面将为大家介绍如何引入本地 jar 包。 1、打开项目&#xff0c;选择file->project structure&#xff0c;或者使用快捷键CtrlAltShiftS。 2、…

RT-Thread:STM32的PB3,PB4 复用IO配置为GPIO

说明&#xff1a;在使用 STM32F103CBT6 配置了 PB3 为IO&#xff0c;测试时发现读取这个IO的电平时钟是0&#xff0c;即便单管脚上的电平是1&#xff0c;读取的数据任然是0,查规格书后发现PB3,PB4是JTAG复用口&#xff0c;要当普通IO用需要配置。 配置工具&#xff1a;STM32Cu…

【C++进阶08】哈希的应用(位图and布隆过滤器)

一、位图 1.1 位图的概念 面试题 给40亿个不重复的无符号整数&#xff0c;没排过序 给一个无符号整数&#xff0c;如何快速判断一个数是否在 这40亿个数中。【腾讯】 能想到的解决思路&#xff1a; 遍历&#xff0c;时间复杂度O(N)排序(O(NlogN)) 利用二分查找: logN放到哈…

242. 有效的字母异位词(力扣)(C语言题解)

✨欢迎来到脑子不好的小菜鸟的文章✨ &#x1f388;创作不易&#xff0c;麻烦点点赞哦&#x1f388; 所属专栏&#xff1a;刷题 我的主页&#xff1a;脑子不好的小菜鸟 文章特点&#xff1a;关键点和步骤讲解放在 代码相应位置 前提&#xff1a; 看本文章之前&#xff0c;建…

FFmpeg和Monibuka拉取rtsp(大华摄像头)视频流时未进行URLCode编码导致提示404等报错

场景 Monibucav4(开源流媒体服务器)在Windows上搭建rtmp服务器并实现拉取rtsp视频流以及转换flv播放&#xff1a; Monibucav4(开源流媒体服务器)在Windows上搭建rtmp服务器并实现拉取rtsp视频流以及转换flv播放_monibuca 搭建流媒体服务-CSDN博客 Nginx搭建RTMP服务器FFmpeg…

PyTorch 之 nn.Parameter

文章目录 使用方法&#xff1a;为什么使用 nn.Parameter&#xff1a;示例使用&#xff1a; 在 PyTorch 中&#xff0c;nn.Parameter 是一个类&#xff0c;用于将张量包装成可学习的参数。它是 torch.Tensor 的子类&#xff0c;但被设计成可以被优化器更新的参数。通过将张量包装…

【附代码】Python 静态变量的实现方法(可多线程)

文章目录 类变量单例模式 作者&#xff1a;小猪快跑 基础数学&计算数学&#xff0c;从事优化领域6年&#xff0c;主要研究方向&#xff1a;MIP求解器、整数规划、随机规划、智能优化算法 静态变量&#xff08;Static Variable&#xff09;在计算机编程领域指在程序执行前系…

Hadoop生态系统中一些关键组件的详细解析

1. Hadoop核心组件 HDFS&#xff08;Hadoop Distributed File System&#xff09;: 分布式文件存储系统。提供高吞吐量的数据访问&#xff0c;非常适合用于大规模数据集。有高容错性&#xff0c;通过在多个节点间复制数据块来实现。 MapReduce: 一种编程模型&#xff0c;用于在…

Airflow原理浅析

⭐️ airflow基本原理 Apache Airflow 是一个开源的工作流自动化工具&#xff0c;它用于调度和管理复杂的数据工作流。Airflow 的原理基于有向无环图&#xff08;DAG&#xff09;的概念&#xff0c;它通过编写和组织任务的有向图来描述工作流程。 以下是 Apache Airflow 的一…

Linux第40步_移植ST公司uboot的第1步_创建配置文件_设备树_修改电源管理和sdmmc节点

ST公司uboot移植分两步走&#xff1a; 第1步&#xff1a;完成“创建配置文件&#xff0c;设备树&#xff0c;修改电源管理和sdmmc节点&#xff0c;以及shell脚本和编译”。 第2步“完成”修改网络驱动、USB OTG设备树和LCD驱动&#xff0c;以及编译和烧写测试“。 移植太复杂…

pgsql的查询语句有没有走索引

使用EXPLAIN ANALYZE命令&#xff1a; EXPLAIN ANALYZE [ ( option [, ...] ) ]statement示例&#xff1a; EXPLAIN ANALYZE SELECT * FROM employees WHERE age > 30;在执行计划中&#xff0c;如果看到索引扫描&#xff08;Index Scan&#xff09;或位图堆扫描&#xff0…

【c语言】简单贪吃蛇的实现

目录 一、游戏说明 ​编辑 二、地图坐标​ ​编辑 三、头文件 四、蛇身和食物​ 五、数据结构设计​ 蛇节点结构如下&#xff1a; 封装一个Snake的结构来维护整条贪吃蛇&#xff1a;​ 蛇的方向&#xff0c;可以一一列举&#xff0c;使用枚举&#xff1a; 游戏状态&a…