(基本常识)C++中const与引用——面试常问

作者:求一个demo

版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

内容通俗易懂,没有废话,文章最后是面试常问内容(建议通过标题目录学习)

废话不多说,我们直接开始------>>>>>>

一、const关键字

        1、特点:

        ①用于定义常量,表示不可修改的值。

        ②可以应用于变量、函数参数、函数返回值、成员函数等。mutable修饰的成员变量可以在const成员函数中被修改。

class MyClass {
private:mutable int value;
public:void modifyValue() const {value = 10; // 正确:可以在 const 成员函数中修改 mutable 成员变量}
};

        ③提高代码安全性和可读性。

        2、示例:

// 1. const变量
const int MAX_SIZE = 100;
// MAX_SIZE = 200; // 错误:不能修改const变量// 2. const指针
int value = 10;
const int* ptr1 = &value; // 指向const int的指针
// *ptr1 = 20; // 错误:不能通过ptr1修改值
ptr1 = nullptr; // 可以修改指针本身int* const ptr2 = &value; // const指针,指向int
*ptr2 = 20; // 可以修改指向的值
// ptr2 = nullptr; // 错误:不能修改指针本身// 3. const成员函数
class MyClass {
public:int getValue() const { // const成员函数,承诺不修改对象状态return value;// value = 10; // 错误:不能在const成员函数中修改成员变量}
private:int value = 0;
};

二、引用

        1、特点:

        ①引用是给变量取个别名,必须初始化,且不能重新绑定。

        ②没有独立的内存空间,与被引用变量共享同一内存。

        ③比指针更安全,不能为null。

        ④常用于函数参数传递和返回值。

        2、示例:

int main() {int x = 10;int& ref = x; // ref是x的引用ref = 20; // 修改ref等同于修改xstd::cout << x; // 输出20int y = 30;// ref = y; // 不是重新绑定,而是把y的值赋给ref(即x)// 引用作为函数参数auto swap = [](int& a, int& b) {int temp = a;a = b;b = temp;};int a = 1, b = 2;swap(a, b); // 直接修改原变量std::cout << a << " " << b; // 输出2 1
}

三、const引用

        1、特点:

        ①不能通过引用修改被引用的对象。

int num = 10;
const int& ref = num;
ref = 20; // 错误,不能通过const引用修改被引用的对象
num = 20; // 正确,直接通过变量名可以修改

        ②可以绑定到临时对象、右值。

const int& ref1 = 5; // 合法,将const引用绑定到字面量5
const int& ref2 = int(10); // 合法,将const引用绑定到临时对象
int num = 10;
int& ref3 = num; // 合法
int& ref4 = 5; // 错误,普通引用不能绑定到右值

        ③常用于函数参数,避免不必要的拷贝同时防止修改。(下面第二条进行了详细解释)

#include <iostream>
#include <string>
using namespace std;void printString(const string& str) {cout << str << endl;
}
int main() {string s = "Hello, World!";printString(s);return 0;
}

        2、注意:普通函数使用引用传递是为了避免对象拷贝,而拷贝构造函数使用引用传递是为了接收要被拷贝的对象,并且在函数体内部完成对象的拷贝操作。

#include <iostream>
using namespace std;class MyClass {
public:int* data;// 构造函数MyClass(int value) {data = new int(value);cout << "Constructor called." << endl;}// 拷贝构造函数MyClass(const MyClass& other) {data = new int(*(other.data));cout << "Copy constructor called." << endl;}// 析构函数~MyClass() {delete data;}
};// 使用const引用作为参数的普通函数
void func(const MyClass& obj) {// 函数内部操作cout << "Value in func: " << *(obj.data) << endl;
}int main() {MyClass obj(10);func(obj);return 0;
}

四、const、引用以及const引用的比较

        ①能否修改:const变量不能修改;引用可以修改,const 引用不能修改。

        ②能否重新绑定:const变量无绑定这一说;引用不能重新绑定;const引用不能重新绑定。

        ③是否需要初始化:const变量必须初始化;引用必须初始化;const引用必须初始化。

        ④能否绑定到临时对象:const变量无绑定这一说;引用不能绑定;const引用能绑定到临时对象。

        ⑤内存占用:const变量有独立内存;引用无独立内存;const引用无独立内存。

        ⑥主要用途:const变量用来定义常量;引用用来取别名、参数传递;const引用安全传递参数。

五、综合应用

        示例:

#include <iostream>
#include <string>
using namespace std;class Student {
public:// const引用参数,避免拷贝同时防止修改Student(const string& name) : name(name) {}// const成员函数,承诺不修改对象状态const string& getName() const { return name; }// 返回const引用,避免拷贝同时防止外部修改const string& getConstRefName() const { return name; }// 返回普通引用,允许外部修改string& getRefName() { return name; }private:string name;
};void printStudent(const Student& s) {cout << "Student: " << s.getName() << "\n";// s.getRefName() = "NewName"; // 错误:s是const引用
}int main() {const string name = "Alice";Student s(name);printStudent(s);// 通过引用修改s.getRefName() = "Bob";printStudent(s);// 尝试通过const引用修改const string& nameRef = s.getConstRefName();// nameRef = "Charlie"; // 错误:不能通过const引用修改// 临时对象printStudent(Student("Temp"));
}

六、constexpr与const区别

        1、constexpr

        (1)介绍:constexpr是C++11新特性,用于定义编译器常量和能在编译期求值的函数。

        (2)特点:

                ①表示值或函数在编译期就能确定。

                ②可用于变量、函数、构造函数等。

                ③C++17引入了if constexpr编译期条件判断。

        (3)用途:

                ①在编译期完成计算,而不是在运行期

constexpr int factorial(int n) {return (n <= 1) ? 1 : n * factorial(n - 1);
}constexpr int fact5 = factorial(5);  // 编译时计算120
// 等价于直接写 constexpr int fact5 = 120;

                ②比#define宏更加安全。

constexpr int MAX_SIZE = 100;  // 替代 #define MAX_SIZE 100
int buffer[MAX_SIZE];          // 可用于数组大小

                ③可以在编译期构造和初始化对象

class Point {
public:constexpr Point(double x, double y) : x(x), y(y) {}constexpr double getX() const { return x; }
private:double x, y;
};constexpr Point origin(0.0, 0.0);  // 编译期构造
constexpr double x = origin.getX(); // 编译期调用成员函数

        (4)示例:

constexpr int size = 10;  // 编译期常量
int arr[size];           // 可用于数组大小// constexpr函数
constexpr int factorial(int n) {return n <= 1 ? 1 : n * factorial(n - 1);
}constexpr int fact5 = factorial(5);  // 编译期计算

        2、constexpr和const区别

        ①求值时机:const运行时常量(也可以是编译期确定);constexpr必须是编译期确定。

        ②初始化要求:const必须初始化;constexpr必须用常量表达式初始化,可以定义数组、结构体。

        ③函数应用:const不能保证编译期求值;constexpr可以在编译期求值。

        ④指针使用:const可以修饰指针本身或指向的内容;constexpr必须指向编译期确定的内存。

        ⑤主要用途:const运行时常量,保证不变性,不能作为模板参数;constexpr编译期计算,可以作为模板参数。

#include <iostream>
using namespace std;int main()
{constexpr int num = 1 + 2 + 3;//constexpr也可换成const,这样下面url[num]也不报错int url[num] = {1,2,3,4,5,6};//如果上面不写constexpr,直接url[num],则会显示num不可用做常量couts<< url[1] << endl;return 0;
}

七、校招面试常问内容

1、const的作用的用法?

        ①定义常量:const int MAX = 100。

        ②保护函数参数不被修改:void func(const int other)。

        ③保护类成员不被修改:const成员函数。

        ④保护指针指向的内容:const char* p或char* const p。

2、const指针与指针const的区别?

const int* p1;    // 指向const int的指针,指针可变,内容不可变
int const* p2;    // 同上,等价写法
int* const p3;    // const指针,指向int,指针不可变,内容可变
const int* const p4;  // 指向const int的const指针,都不可变

3、const成员函数的作用是什么?能修改成员变量吗?

        ①不修改对象状态。

        ②不能修改非mutable成员变量

        ③可以被const对象调用。

4、指针和引用的区别?

        ①指针有自己的一块空间,而引用只是一个别名。
        ②使用sizeof看一个指针的大小,x32环境下4字节,x64环境下8字节;而引用则是引用对象的大小。
        ③指针在使用时可以指向其他对象,而引用只能是一个对象的引用,不能改变;指针有多级指针,而引用没有多级引用。
        ④指针和引用的++含义不同,指针++为整个类型++,引用++只是单纯+1.
        ⑤如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏。(因为返回动态内存分配的对象时,指针可以为null而引用不可以。如果使用动态分配的内存,当返回的引用超出作用域,无法释放内存,造成内存泄漏,而指针可以通过delete释放)
        ⑥作为参数传递的时候,指针需要被解引用才能对对象进行操作,而直接对引用的修改都会改变引用所指向的对象。(*解引用,然后才能访问对象,因为指针指向内存,引用指向对象)

5、为什么函数参数常用const引用?

        ①避免拷贝大对象的开销。

        ②防止意外修改传入的参数。

        ③可以接受临时对象(右值)。

6、函数返回引用时,需要注意什么?

        ①绝不能返回局部变量的引用(局部变量在函数内部定义,函数结束空间后内存空间被释放。如果返回局部变量的引用,在函数外使用该引用,访问的是不存在的内存空间)。

        ②可以返回成员变量、静态变量或传入参数的引用(成员变量是类的一部分,静态变量在整个程序运行期间都存在,传入参数的生命周期在函数调用期间都有效)。

7、const引用的特点?

        ①可以绑定到右值(临时对象)。

        ②可以延长对象的生命周期。

最后,如有不足和错误的地方,期待私信指正!

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

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

相关文章

数据库与表的操作

1. SQL 分类 SQL 根据功能分为以下几类&#xff1a; **DDL **: 定义数据库对象&#xff08;库、表、列、索引等&#xff09; 常用语句&#xff1a;CREATE, DROP, ALTER, RENAME, TRUNCATE示例&#xff1a;CREATE TABLE t_user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHA…

2025年渗透测试面试题总结-某shopee -红队-Singapore(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 shopee -红队-Singapore 一、Linux提权方式扩展分析 二、入侵痕迹清除技术 三、真实IP发现技术 四、…

GeoChat : Grounded Large Vision-Language Model for Remote Sensing论文精读

GeoChat : Grounded Large Vision-Language Model for Remote Sensing 是一个针对遥感场景的llm&#xff0c;提供支持多任务对话&#xff08;对高分辨率遥感图像&#xff09;。也造了个数据集。 一些思考&#xff1a; 文中提到的局限性&#xff1a;小物体和多框预测较难。小物…

基于STM32的PID算法控制电机调速

一、制作目标 以STM32F103C8T6单片机作为主控&#xff0c;使用PID控制算法&#xff0c;控制TB6612FNG电机驱动板模块驱动直流减速电机&#xff08;带AB相编码器&#xff09;&#xff0c;实现任意设定转速的电机转速动态控制&#xff0c;类似于汽车的定速巡航功能&#xff0c;可…

系统思考—看见未来

感谢上海财经大学终身教育学院的持续邀请&#xff01;每个月&#xff0c;都会带着不同的思维火花&#xff0c;走进财大与学员们一起探索系统思考的奥秘。 这次为宜宾市的干部们带来了一场深刻的学习体验。通过系统思考&#xff0c;帮助大家从整体视角去发现问题、分析问题、解…

qwindowkit 编译教程

1、Windows编译及示例 1.1 下载源码 https://github.com/stdware/qwindowkit 1.2 cmake编译 1.3 VS构建 1.4 编译成功

HashMap的位操作是什么?HashSet 的 contains 方法复杂度是多少?红黑树简单讲一下?

一、HashMap 的位操作设计 HashMap 使用位运算优化哈希计算与索引定位&#xff0c;核心场景如下&#xff1a; 哈希扰动函数 计算键的哈希值时&#xff0c;将高16位与低16位异或&#xff1a; static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hash…

软件开发过程中常用的调试工具(gdb)

gdb 因为我们公司其中脚本中有rk的gdb调试工具脚本&#xff0c;内部只需要将其打开后进行编译即可&#xff1a; 需要将编译出来的cvr_app 第一种&#xff1a;使用gdb将app给跑起来&#xff1a;gdb cvr_app 然后在出现问题时&#xff1a; 输入bt&#xff0c;可以打印出当前…

S32K144外设实验(七):FTM输出多路互补带死区PWM

文章目录 1. 概述1.1 时钟系统1.2 实验目的2. 代码的配置2.1 时钟配置2.2 FTM模块配置2.3 输出引脚配置2.4 API函数调用1. 概述 互补对的PWM输出是很重要的外设功能,尤其应用再无刷电机的控制。 1.1 时钟系统 笔者再墨迹一遍时钟的设置,因为很重要。 FTM的CPU接口时钟为SY…

Qt6相对Qt5的主要提升(AI总结)

我&#xff1a; Qt 6 相对于5 有哪些新功能&#xff1f; Qt 6 相对于 Qt 5 有诸多新功能和改进&#xff0c;以下是主要的新增特性&#xff1a; 1. 架构和核心库的重构 模块化设计&#xff1a;Qt 6 采用了更加灵活的模块化设计&#xff0c;开发者可以按需引入必要的功能模块&a…

一文解读DeepSeek的安全风险、挑战与应对策略

引言 DeepSeek作为中国领先的AI大模型提供商&#xff0c;凭借其开源、低成本和高性能的优势&#xff0c;迅速在全球AI市场占据重要地位。然而&#xff0c;随着其应用范围的扩大&#xff0c;DeepSeek在数据安全、模型漏洞、网络攻击等方面面临严峻挑战。本文基于最新公开资料&am…

文生图语义识别插件使用(controlnet)

1. 插件下载(github) https://github.com/Mikubill/sd-webui-controlnet https://github.com/lllyasviel/ControlNet2. 模型下载(hugging face) https://github.com/Mikubill/sd-webui-controlnet/wiki/Model-download https://huggingface.co/bdsqlsz/qinglong_controlnet-l…

论华为 Pura X 折叠屏性能检测

在科技浪潮中&#xff0c;折叠屏手机以其创新形态掀起市场热潮。华为 Pura X 作为华为最新折叠手机&#xff0c;承载前沿科技与精湛工艺&#xff0c;成为行业焦点。它融合先进折叠屏技术与优质材质&#xff0c;致力于打破传统手机使用边界&#xff0c;为用户开启全新体验。但产…

多路转接Poll

在之前我们讲过select是最古老的多路转接方案&#xff0c;古老就意味着他不是很方便使用&#xff0c;他需要用户手动保存fd_set这个位图结构&#xff0c;来表示读写事件的关注与否或者就绪性。 而且由于fd_set的大小是固定的&#xff0c;这就意味着他能管理的套接字文件描述符是…

C语言贪吃蛇实现

When the night gets dark,remember that the Sun is also a star. 当夜幕降临时&#xff0c;请记住太阳也是一颗星星。 ————《去月球海滩篇》 目录 文章目录 一、《贪吃蛇》游戏介绍 二、WIN32部分接口简单介绍 2.1 控制台窗口大小设置 2.2 命令行窗口的名称的变更 2…

基于深度学习的图片识别系统(下)

文章目录 前言1.任务描述2.模型搭建3.代码解释3.1模型加载3.2加载数据3.3模型权重的保存3.4学习率3.5过拟合3.6训练模型3.7调试检查 4.结果分析5. 完整代码结语 前言 书接上回&#xff0c;我们已经完成数据预处理部分的内容&#xff0c;后续仍需要对表格进行裁剪&#xff0c;此…

再学:区块链基础与合约初探 EVM与GAS机制

目录 1.区块链是什么 2.remix ​3.账户​ ​4.以太坊三种交易​ 5.EVM 6.以太坊客户端节点 ​7.Gas费用 8.区块链浏览器 1.区块链是什么 只需要检验根节点 Merkel根是否有更改&#xff0c;就不用检查每个交易是否有更改。方便很多。 2.remix 3.账户 如果交易失败的话&…

Java 中装饰者模式与策略模式在埋点系统中的应用

前言 在软件开发中&#xff0c;装饰者模式和策略模式是两种常用的设计模式&#xff0c;它们在特定的业务场景下能够发挥巨大的作用。本文将通过一个实际的埋点系统案例&#xff0c;探讨如何在 Java 中运用装饰者模式和策略模式&#xff0c;以及如何结合工厂方法模式来优化代码…

HCIP_NOTE03_网络组成

网络组成 LAN MAN WAN 园区网 企业或机构内部的网络,分大中小型 行业园:企业园网 校园网 政务园 商业园 三层交换机 数据大量交换的局域网内部,转发效率高,有简单的路由功能 路由器 进出口网络,适用于复杂的网络环境,选路需求 无线网 信号传输稳定性差---- 电磁波易受干…

简记_单片机硬件最小系统设计

以STM32为例&#xff1a; 一、电源 1.1、数字电源 IO电源&#xff1a;VDD、VSS&#xff1a;1.8~3.6V&#xff0c;常用3.3V&#xff0c;去耦电容1 x 10u N x 100n &#xff1b; 内核电源&#xff1a;内嵌的稳压器输出&#xff1a;1.2V&#xff0c;给内核、存储器、数字外设…