【C++ 面试 - 基础题】每日 3 题(七)
✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
19. C++ 中 const 和 static 的作用
static
-
不考虑类的情况
-
隐藏。所有不加 static 的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用。
-
-
默认初始化为 0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区。
-
静态变量在函数内定义,始终存在,且只进行一次初始化,具有记忆性,其作用范围与局部变量相同,函数退出后仍然存在,但不能使用。
-
考虑类的情况
-
static 成员变量:只与类关联,不与类的对象关联。定义时要分配空间,不能在类声明中初始化,必须在类定义体外部初始化,初始化时不需要标示为 static;可以被非 static 成员函数任意访问。
-
static 成员函数:不具有 this 指针,无法访问类对象的非 static 成员变量和非 static 成员函数;不能被声明为 const、虚函数和 volatile;可以被非 static 成员函数任意访问。
-
从面向过程角度回答
-
static 修饰全局变量
-
在符号表中,符号的作用域就从 globle 变成了 local(static 修饰函数也会这样)。
-
-
static 修饰局部变量
-
局部变量本身不产生符号,通过 ebp - 偏移量 来访问。
-
注意:全局变量、静态全局变量、静态局部变量都在静态存储区分配空间,而局部变量在栈分配空间。
两个编译单元相同名字的 static 函数会报错吗?
不会,因为 static 具有隐藏特性。
存储区域
-
由 static 修饰的变量存储在虚拟内存空间的数据区,而非静态成员变量一般存放在堆区或者栈区(全局变量和常量也存放在数据区)。
-
由 static 修饰的函数以及非静态函数都存在于存储在虚拟地址空间的代码区。
const
-
不考虑类的情况
-
const 常量在定义时必须初始化,之后无法更改。
-
const 形参可以接收 const 和非 const 类型的实参,例如:
// i 可以是 int 型或者 const int 型 void fun(const int& i){ //... }
-
-
考虑类的情况
-
const 成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其 const 数据成员的值可以不同,所以不能在类中声明时初始化。
-
const 成员函数:const 对象不可以调用非 const 成员函数;非 const 对象都可以调用;不可以改变非 mutable(用该关键字声明的变量可以在 const 成员函数中被修改)数据的值。
void Print() const{//实现 }
-
补充一点 const 相关:const 修饰变量也是与 static 有一样的隐藏作用。只能在该文件中使用,其他文件不可以引用声明使用。因此在头文件中声明 const 变量是没问题的,因为即使被多个文件包含,链接性都是内部的,不会出现符号冲突。
const 替换特性
编译过程中,把出现常量名字的地方,用常量的值进行替换。
const int a = 10;
int* p = (int)*a;
*p = 20;
cout<< a << " " << *p << endl;
上面输出结果是 10 20,这是因为 a 在编译过程中会被替换成 10。
const 和 static 的区别
面向过程:
-
const:全局变量、局部变量、形参变量,且不能修饰函数。
-
static:全局变量、局部变量,且可以修饰函数。
面向对象:
-
const:常方法、成员变量,函数调用依赖对象即有 this 指针。
-
static:静态方法、成员变量,函数调用不依赖对象即没有 this 指针。
20. final 和 override 关键字
override
当在父类中使用了虚函数时候,你可能需要在某个子类中对这个虚函数进行重写,以下方法都可以:
class A
{virtual void foo();
}
class B : public A
{void foo(); //OKvirtual void foo(); // OKvoid foo() override; //OK
}
如果不使用 override,当你手一抖,将 foo() 写成了 f00() 会怎么样呢?结果是编译器并不会报错,因为它并不知道你的目的是重写虚函数,而是把它当成了新的函数。如果这个虚函数很重要的话,那就会对整个程序不利。所以,override 的作用就出来了,它指定了子类的这个虚函数是重写的父类的,如果你名字不小心打错了的话,编译器是不会编译通过的:
class A
{virtual void foo();
};
class B : public A
{virtual void f00(); //OK,这个函数是B新增的,不是继承的virtual void f0o() override; //Error, 加了override之后,这个函数一定是继承自A的,A找不到就报错
};
final
当不希望某个类被继承,或不希望某个虚函数被重写,可以在类名和虚函数后添加 final 关键字,添加 final 关键字后被继承或重写,编译器会报错。例子如下:
class Base
{virtual void foo();
};class A : public Base
{void foo() final; // foo 被override并且是最后一个override,在其子类中不可以重写
};class B final : A // 指明B是不可以被继承的
{void foo() override; // Error: 在A中已经被final了
};class C : B // Error: B is final
{
};
21. vo latile、mutable 和 explicit 关键字的用法
(1)volatile
主要用于告诉编译器不要对其所修饰的变量进行优化,因为这些变量可能会在程序执行过程中被外部因素改变,而编译器不应该假定它们的值是稳定的。
-
volatile的作用:-
volatile主要用于修饰变量,告诉编译器不要对该变量进行优化。这通常用于描述一些可能会被外部因素(如硬件、操作系统、其他线程等)更改的变量。
-
-
使用场景:
-
硬件寄存器:
volatile可用于描述与硬件寄存器通信的变量,因为这些变量的值可能在编译器无法预测的时间被硬件更改。 -
多线程编程:在多线程环境中,一个线程修改的变量可能会被另一个线程读取,这时
volatile可以确保对变量的读取和写入不会被优化掉,比如不要从各自的寄存器中读取该变量。 -
信号处理器中使用:在信号处理器中,被信号处理函数修改的变量应该声明为
volatile,以确保编译器不会对它们进行优化。
-
-
不足之处:
-
volatile仅告诉编译器不要对变量进行优化,但它并不能解决多线程并发问题。在多线程环境中,还需要使用更强大的同步机制(如互斥锁、条件变量等)来确保线程安全性。 -
volatile并不适用于所有情况,因为它仅告诉编译器不要优化,但不提供同步机制。如果需要精确的同步和互斥,应该使用其他多线程编程工具。
-
示例
volatile int hardwareRegister; // 描述硬件寄存器的变量void signalHandler(int sig) {volatile bool flag = true; // 信号处理器中的变量// ...
} 总之,volatile 关键字用于告诉编译器不要对变量进行优化,通常用于描述那些可能被外部因素改变的变量。在多线程环境中,它应该与其他同步机制一起使用来确保线程安全性。但需要注意,volatile 并不是解决多线程问题的最终解决方案,更复杂的同步机制可能需要用于确保数据一致性。
(2)mutable
mutable 的中文意思是 “可变的,易变的”,跟 constant(既 C++ 中的 const)是反义词。在 C++ 中,mutable 也是为了突破 const 的限制而设置的。被 mutable 修饰的变量,将永远处于可变的状态,即使在一个 const 函数中。我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成 const 的。但是,有些时候,我们需要在 const 函数里面修改一些跟类状态无关的数据成员,那么这个函数就应该被 mutable 来修饰,并且放在函数后后面关键字位置。
注意:mutable 只能作用于类的非静态和非常量数据成员。
样例
class person
{int m_A;mutable int m_B;//特殊变量 在常函数里值也可以被修改
public:void add() const//在函数里不可修改this指针指向的值 常量指针{m_A=10;//错误 不可修改值,this已经被修饰为常量指针m_B=20;//正确}
}class person
{int m_A;mutable int m_B;//特殊变量 在常函数里值也可以被修改
}
int main()
{const person p;//修饰常对象 不可修改类成员的值p.m_A=10;//错误,被修饰了指针常量p.m_B=200;//正确,特殊变量,修饰了mutable
}
(3)explicit
explicit 关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换,注意以下几点:
-
explicit 关键字只能用于类内部的构造函数声明上。
-
explicit 关键字作用于单个参数的构造函数。
-
被 explicit 修饰的构造函数的类,不能发生相应的隐式类型转换。
相关文章:
【C++ 面试 - 基础题】每日 3 题(七)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...
Java面试题精选:消息队列(一)
1、为什么使用消息队列 问题用意: 其实就是想问一下消息队列有哪些使用场景,你项目中什么业务场景用到了消息队列,有什么技术挑战。使用MQ后给你带来了什么好处 规范回答: 消息队列的常见使用场景很多,但比较核心的…...
宝塔面板启用 QUIC 与 Brotli 的完整教程
环境 系统:Ubuntu 22.04.4 LTS x86_64 宝塔版本:7.7.0 (可使用本博客提供的一键安装优化脚本) nginx版本:1.26.1 开放UDP端口 注意:在你的服务器商家那里也要开放443 udp端口 sudo ufw allow 443/udp然后重新加载 UFW 以使新…...
Linux 进程调度(二)之进程的上下文切换
目录 一、概述二、上下文切换的实现1、context_switch2、switch_mm3、switch_to 三、观测进程上下文切换 一、概述 进程的上下文切换是指在多任务操作系统中,当操作系统决定要切换当前运行的进程时,将当前进程的状态保存起来,并恢复下一个要…...
Oracle事物临时表
在Oracle数据库中,事务临时表是一种特殊的表类型,主要用于存储在事务处理过程中产生的临时数据。这些表的数据只对当前会话或事务可见,并且在事务结束时会自动清除。 事务临时表的特点 生命周期: 事务临时表中的数据在事务提交或…...
看图学sql之sql的执行顺序
学完前面的内容,我们已经掌握了基本的sql语法了,那我们学的 select, distinct, from, where,group by, having, order by, limit 他们具体的执行顺序是什么样的呢? 语法: SELECT distinct column1, column2 FROM table1 join …...
百日筑基第四十五天-从JAVA8走到JAVA9
JAVA9新特性 Java 9发布于 2017 年 9 月 21 日 。 快速创建不可变集合 增加了List.of()、Set.of()、Map.of() 和 Map.ofEntries()等工厂方法来创建不可变集合(有点参考 Guava 的味道): List.of("Java", "C"); Set.of…...
力扣第五十七题——插入区间
内容介绍 给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区…...
跟《经济学人》学英文:2024年08月03日这期 India’s economic policy will not make it rich
India’s economic policy will not make it rich A new World Bank report takes aim at emerging-market growth plans 原文: The developing world has fallen back in love with economic planning. As protectionism sweeps the West, poor countries are n…...
js 深拷贝、浅拷贝深度解析
赋值操作: let obj{a:1,b:[1,2,3],c:{m:2}}let newObjobjnewObj.a2newObj.b.push(4)newObj.c.m3console.log(obj,newObj); 将一个对象赋值给一个变量,其实就是将这个对象在栈内存中的引用地址复制给了这个变量,这两个对象指向堆内存中的同一个…...
CSS文本两端对齐
背景 如果我们要写了列表或表单类的样式,名称长短不一,但是想要两端对齐,如下面这样的: 你是怎么写的? 是这样的吗,在HTML里调整加空格: <ul><li>用户名</li><li>账 …...
C#中的foreach和自定义比较
在C#中foreach不能修改集合里面的值 在C#中,使用 foreach 循环遍历集合时,通常不建议修改集合中的元素,因为 foreach 循环是针对集合的枚举器进行操作的,而枚举器通常不支持修改集合中的元素。如果尝试在 foreach 循环中修改集合…...
有序转化数组(LeetCode)
题目 给你一个已经 排好序 的整数数组 和整数 、 、 。对于数组中的每一个元素 ,计算函数值 ,请 按升序返回数组 。 解题 在时间复杂度为解决问题 def sortTransformedArray(nums, a, b, c):def f(x):return a * x * x b * x cn len(nums)result…...
大数据信用报告查询有什么作用?怎么选择查询平台?
随着互联网的快速发展,人们的金融行为越来越多地依赖于网络平台。然而,网络上的金融交易存在着一定的风险,为了有效地防范这些风险,金融机构采用了大数据技术进行风险控制,下面,小易大数据平台将详细介绍大…...
import cv2ModuleNotFoundError: No module named ‘cv2‘
import cv2 ModuleNotFoundError: No module named cv2 (base) PS D:\CAMERA-D861T\LabelImg> pip3 install cv2 ERROR: Could not find a version that satisfies the requirement cv2 (from versions: none) ERROR: No matching distribution found for cv2 办法1 试了无…...
[Modbus] Modbus协议开发-基本概念(一)
历史 ModBus官网是Modicon(Modicon早年已被施耐德收购)公司为其PLC通讯而开发的一种通讯协议。 概述 通过Modbus协议,控制器之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。 优点 免费、好用、成熟…...
爬虫代理的使用:提升爬虫效率
爬虫代理的基本概念 爬虫代理,简单来说,就是位于客户端和目标服务器之间的一个中转站。当爬虫发起请求时,不是直接发送给目标服务器,而是先发送给代理服务器,再由代理服务器转发给目标服务器。目标服务器响应后&#…...
【gcc】基于gpt和python的流程和延迟梯度分析
Core Flow and Algorithm Concepts of GCC (Google Congestion Control) 【TWCC 】基于gpt和python简化分析webrtc拥塞控制论文: Analysis and Design of the Google Congestion Contro for Web Real-time Communication (WebRTC)参考大神的理解发送码率(send bitrate)影响了网…...
前端CSS总结
目录 前言 正文 CSS基础介绍: CSS选择器: 元素选择器: id和class选择器: 后代选择器和群组选择器: 盒子模型 content: padding: border: margin: 字体样式 …...
Linux/C 高级——指针函数
1.概念 本质是函数,函数的返回值为指针。类比着指针数组。 指针数组:本质是数组,数组中存放指针。 数据类型 *数组名[元素个数]; int a[2][3]; int *arr[2] {a[0],a[1]}; //*(*(arri)j) *(arr[i]j) arr[i][j] 2.定义格式 格式: 数…...
智能对话式开发:通过快马平台AI模型将你的想法直接变为cloud code应用
智能对话式开发:通过快马平台AI模型将你的想法直接变为cloud code应用 最近在尝试用AI辅助开发一个天气查询小工具,整个过程让我深刻体会到cloud code与AI结合的强大之处。传统开发需要自己写代码、调试、部署,而现在只需要用自然语言描述需…...
Go语言的消息队列应用
Go语言的消息队列应用 1. 消息队列简介 消息队列是一种在分布式系统中用于异步通信的组件,它允许不同的服务之间通过消息进行通信,而不需要直接相互调用。消息队列可以解耦系统组件,提高系统的可靠性、可扩展性和弹性。 消息队列的优势 解耦&…...
综合能源系统中的经济-碳协调:最优调度和灵敏度分析【IEEE33节点】附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…...
计算机毕业设计:Python二手车市场数据分析及价格预测平台 Django框架 可视化 线性回归 数据分析 机器学习 深度学习 AI 大模型(建议收藏)✅
博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...
工程师实现TVA与MES系统无缝对接的实操要点
AI智能体视觉检测系统(TVA)与MES系统对接,是实现汽车零部件焊接点检测数据闭环管理的关键,作为负责对接工作的工程师,需熟悉两个系统的接口规范、数据传输协议,规范完成对接部署与调试,避免出现…...
3分钟突破网盘限速!Baiduwp-PHP实现百度网盘链接高速解析
3分钟突破网盘限速!Baiduwp-PHP实现百度网盘链接高速解析 【免费下载链接】baiduwp-php A tool to get the download link of the Baidu netdisk / 一个获取百度网盘分享链接下载地址的工具 项目地址: https://gitcode.com/gh_mirrors/ba/baiduwp-php 在数字…...
CLIProxyAPI + OpenCode
LIProxyAPI一键安装,# https://help.router-for.me/cn/introduction/quick-start.html curl -fsSL https://raw.githubusercontent.com/brokechubb/cliproxyapi-installer/refs/heads/master/cliproxyapi-installer | bashGo 代码 🤔,有环境直接源码编译…...
魔兽争霸3游戏性能优化全攻略:从卡顿到流畅的实战指南
魔兽争霸3游戏性能优化全攻略:从卡顿到流畅的实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 当你在魔兽争霸3的团战关键时刻&…...
YimMenu:GTA V安全防护与体验增强解决方案
YimMenu:GTA V安全防护与体验增强解决方案 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu Yi…...
手柄优化与跨平台适配:DS4Windows让PS手柄在PC上焕发新生
手柄优化与跨平台适配:DS4Windows让PS手柄在PC上焕发新生 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 在PC游戏世界中,找到一款得心应手的控制器配置工具往往比…...
