(基本常識)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.pswp.cn/news/899084.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899084.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899084.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java并發編程 什么是分布式鎖 跟其他的鎖有什么區別 底層原理 實戰講解

目錄 一、分布式鎖的定義與核心作用 二、分布式鎖與普通鎖的核心區別 三、分布式鎖的底層原理與實現方式 1. 核心實現原理 2. 主流實現方案對比 3. 關鍵技術細節 四、典型問題與解決方案 五、總結 六、具體代碼實現 一、分布式鎖的定義與核心作用 分布式鎖是一種在分布…

案例:使用網絡命名空間模擬多主機并通過網橋訪問外部網絡

案例目標 隔離性&#xff1a;在同一臺物理機上創建兩個獨立的網絡命名空間&#xff08;模擬兩臺主機&#xff09;&#xff0c;確保其網絡配置完全隔離。內部通信&#xff1a;允許兩個命名空間通過虛擬設備直接通信。外部訪問&#xff1a;通過宿主機的網橋和 NAT 規則&#xff…

AF3 Rotation 類解讀

Rotation 類(rigid_utils 模塊)是 AlphaFold3 中用于 3D旋轉 的核心組件,支持兩種旋轉表示: 1?? 旋轉矩陣 (3x3) 2?? 四元數 (quaternion, 4元向量) ?? 設計目標: 允許靈活選擇 旋轉矩陣 或 四元數 封裝了常用的 旋轉操作(組合、逆旋轉、應用到點上等) 像 torch.…

DeepSeek面試——模型架構和主要創新點

本文將介紹DeepSeek的模型架構多頭潛在注意力&#xff08;MLA&#xff09;技術&#xff0c;混合專家&#xff08;MoE&#xff09;架構&#xff0c; 無輔助損失負載均衡技術&#xff0c;多Token 預測&#xff08;MTP&#xff09;策略。 一、模型架構 DeepSeek-R1的基本架構沿用…

【web3】

檢測錢包是否安裝 方法一 // npm install metamask/detect-provider import detectEthereumProvider from metamask/detect-provider// 檢測錢包是否安裝 const isProvider await detectEthereumProvider() if(!isProvider) {proxy.$modal.msgError("請安裝錢包")…

husky的簡介以及如果想要放飛自我的解決方案

husky 是一個 Git Hooks 管理工具&#xff0c;它的主要作用是 在 Git 提交&#xff08;commit&#xff09;、推送&#xff08;push&#xff09;等操作時執行自定義腳本&#xff0c;比如代碼檢查&#xff08;Lint&#xff09;、單元測試&#xff08;Test&#xff09;、格式化代碼…

JVM之類的加載過程

加載 這一階段是將類的字節碼從外部存儲&#xff08;如磁盤&#xff09;加載到JVM的內存中。加載時&#xff0c;JVM會根據類的全限定名&#xff08;包括包名和類名&#xff09;查找相應的字節碼文件&#xff08;.class文件&#xff09;&#xff0c;并將其讀入內存。 鏈接 鏈接…

Java Collection API增強功能系列之六 改進的 ConcurrentHashMap:歸約、搜索、計數與 Set 視圖詳解

Java 8 改進的 ConcurrentHashMap&#xff1a;歸約、搜索、計數與 Set 視圖詳解 Java 8 對 ConcurrentHashMap 進行了重大優化&#xff0c;不僅提升了并發性能&#xff0c;還引入了許多函數式編程方法&#xff0c;使其在處理高并發場景時更加高效和靈活。本文將深入解析 Concu…

AI生成移動端貪吃蛇游戲頁面,手機瀏覽器打開即可玩

貪吃蛇游戲可計分&#xff0c;可穿墻&#xff0c;AI生成適配手機瀏覽器的游戲&#xff0c;代碼如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <meta name"viewport" …

【動手學深度學習】#4 深度學習計算

主要參考學習資料&#xff1a; 《動手學深度學習》阿斯頓張 等 著 【動手學深度學習 PyTorch版】嗶哩嗶哩跟李牧學AI 概述 為了實現更復雜的網絡&#xff0c;我們需要研究比層更高一級的單元塊&#xff0c;在編程中由類表示。通過自定義層和塊&#xff0c;我們能更靈活地搭建網…

如何在 Windows 上安裝并使用 Postman?

Postman 是一個功能強大的API測試工具&#xff0c;它可以幫助程序員更輕松地測試和調試 API。在本文中&#xff0c;我們將討論如何在 Windows 上安裝和使用 Postman。 Windows 如何安裝和使用 Postman 教程&#xff1f;

php寫入\查詢influxdb數據

namespace app\index\controller;use InfluxDB2\Client; use InfluxDB2\Model\WritePrecision; use InfluxDB2\Point;class Demo {/*** 顯示資源列表** return \think\Response*/public function index(){$token 你的TOKEN;$org zzlichi;$bucket initdb;$client new Client…

26考研——圖_圖的基本概念(6)

408答疑 文章目錄 一、圖的基本概念圖的定義非空性非線性結構 頂點和邊的表示頂點邊 有向圖 & 無向圖有向圖有向圖 G 1 G_1 G1? 的表示 無向圖無向圖 G 2 G_2 G2? 的表示 簡單圖 & 多重圖簡單圖多重圖 頂點的度、入度和出度頂點的度有向圖的度 路徑、路徑長度和回路…

面向對象軟件工程實踐軟件案例

智力運動-數字化思維訓練課程介紹 數字化思維訓練是科技賦能素質教育創新實踐項目&#xff0c;通過數字化信息化手段&#xff0c;深度融合優質原創智力運動教育課程資源&#xff0c;服務幼兒園與小學&#xff0c;提供信息時代校園素質教育教學解決方案。在《面向對象軟件工程》…

Linux學習筆記(應用篇一)

基于I.MX6ULL.MINI開發板 標準I/O庫鏈接目錄刪除文件正則表達式系統標識時間堆內存信號標準信號 進程進程組進程間通信線程互斥鎖線程安全 本文章是入門篇的概念&#xff0c;有點零散&#xff0c;后續需要補充復習 **inode&#xff08;索引節點&#xff09;**是 Linux 和 Unix …

Modbus RTU ---> Modbus TCP透傳技術實現(Modbus透傳、RS485透傳、RTU透傳)分站代碼實現、協議轉換器

文章目錄 Modbus RTU到Modbus TCP透傳技術實現1. 透傳技術概述1.1 透傳基本原理- 協議幀格式轉換- 地址映射與管理- 通信時序適配- 錯誤檢測與處理 2. 透傳網關硬件架構2.1 典型硬件結構- 微控制器/處理器(ARM、STM32等)- RS-485/RS-232收發器- 以太網控制器(如W5500)- 電源管理…

MySQL數據庫中常用的命令

登錄&#xff1a; mysql -u username -h ip地址 -P 端口 -p 密碼 mysql -u username -S /path/mysql.sock -P -p 用戶管理&#xff1a; select user,host from mysql.user;//查看數據庫中所用用戶信息 create user username%;//創建用戶 create user username% identifie…

醫學交互作用分析步驟和目的(R語言)

醫學交互作用分析的目的和用途&#xff08;R語言&#xff09; 醫學交互作用分析一直是醫學數據分析的組成部分&#xff0c;總結最近的一些認識。 目的&#xff1a; 在獨立危險因素鑒定的研究中&#xff0c;&#xff08;獨立危險因素的&#xff09;交互作用可以作為獨立危險因…

Javaweb后端登錄會話技術jwt令牌

jwt生成與校驗 是base4補位的 最后面是簽名&#xff0c;簽名不是base64&#xff0c;是通過簽名算法加密后來的 令牌長度不是固定的&#xff0c;長度取決于原始內容&#xff0c;載荷&#xff0c;大小 頭有&#xff0c;類型&#xff0c;簽名算法 base64可以對任意的二進制數據進…

Mybatis操作數據庫(注解+xml兩個方式)

文章目錄 1.個人回顧2.關于mybatis注解的說明3.字段和屬性不匹配的解決方案3.1第一個方案3.2第二個方案3.3第三個方案 4.xml路徑配置5.xml里面的字段映射 1.個人回顧 剛剛翻看了一下自己的這個之前寫的博客&#xff0c;上一次和這個javaee相關的博客還是去年寫的&#xff0c;也…