c++的const

const在C++中是一個非常重要的關鍵字,用于定義不可變的變量、函數參數、成員函數等。它可以提高代碼的可讀性、安全性,并幫助編譯器進行優化。

  1. 定義常量

使用const定義不可變的變量:

const int MAX_SIZE = 100;
  1. 常量指針

指向常量的指針和常量指針有不同的用法:

const int* ptr1 = &MAX_SIZE; // 指向常量的指針
int* const ptr2 = &variable; // 常量指針
const int* const ptr3 = &MAX_SIZE; // 指向常量的常量指針
  1. 常量引用

常量引用用于避免不必要的復制,并且保證引用的值不會被修改:

void printValue(const int& value) {std::cout << value << std::endl;
}
  1. 常量成員函數

在類中,常量成員函數保證不會修改對象的成員變量:

class MyClass {
public:int getValue() const {return value;}private:int value;
};
  1. 常量對象

定義一個常量對象,這個對象只能調用其常量成員函數:

const MyClass obj;
obj.getValue();
  1. 常量成員變量

在類中定義常量成員變量,這些變量必須在構造函數的初始化列表中初始化:

class MyClass {
public:MyClass(int v) : value(v) {}const int value;
};
  1. 常量靜態成員變量

常量靜態成員變量在類中定義,但必須在類外初始化:

class MyClass {
public:static const int MAX_VALUE;
};const int MyClass::MAX_VALUE = 100;
  1. 常量函數參數

使用const修飾函數參數,表示參數在函數內部不會被修改:

void process(const int value) {// value 不能被修改
}
  1. 返回常量引用

返回常量引用以避免返回值被修改:

const std::string& getName() const {return name;
}
  1. 常量迭代器

使用常量迭代器來遍歷容器,確保元素不會被修改:

std::vector<int> vec = {1, 2, 3, 4};
for (std::vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << std::endl;
}
  1. constexpr

constexpr在C++11中引入,用于定義在編譯時計算的常量:

constexpr int getValue() {return 42;
}
constexpr int value = getValue();
  1. const_cast

const_cast用于移除或添加const屬性,但應謹慎使用,避免違反常量性:

void modify(const int& value) {int& nonConstValue = const_cast<int&>(value);nonConstValue = 100;
}

這是一個名為modify的函數,它接受一個常量引用類型的整數參數value。

在C++中,常量引用(const reference)是對一個常量的引用。使用常量引用的主要目的是防止引用的對象被修改,同時允許該對象通過引用的方式傳遞,以避免復制大的對象。常量引用主要用于函數參數和返回值。

常量引用的語法

常量引用的語法如下:

const int& ref = someInt;

在這個例子中,ref是一個對整數someInt的常量引用。通過ref,可以讀取someInt的值,但不能修改它。

使用常量引用的優點

  1. 防止修改:通過常量引用,可以確保函數不會修改傳遞給它的對象。例如:
    void printValue(const int& value) {
    std::cout << value << std::endl;
    // value = 10; // 這行代碼將導致編譯錯誤
    }

  2. 效率:常量引用可以避免對象的復制,尤其是對于大對象或自定義類型。通過引用傳遞而不是通過值傳遞,可以節省內存和時間。例如:
    void processLargeObject(const LargeObject& obj) {
    // 處理 obj 而不復制它
    }

  3. 兼容性:常量引用可以綁定到非常量對象和臨時對象,因此使用常量引用可以使函數更加通用。例如:
    void showValue(const int& value) {
    std::cout << value << std::endl;
    }

    int main() {int a = 5;const int b = 10;showValue(a); // 綁定到非常量對象showValue(b); // 綁定到常量對象showValue(15); // 綁定到臨時對象
    }
    

常量引用的限制

  1. 不可修改:通過常量引用,無法修改引用的對象。如果需要修改對象,則不能使用常量引用。
  2. 不能綁定到非常量指針:常量引用不能綁定到非常量指針,但可以綁定到非常量對象。

在C++中,int& value 和 int &value 實際上是完全相同的。兩者都是對整數類型的引用,并且語法上沒有區別。這種不同的書寫方式只是個人編碼風格的差異。更詳細地解釋一下。

引用的基本概念

引用(reference)是C++中的一種變量類型,允許創建對另一個變量的別名。定義一個引用時,使用&符號。例如:

int a = 10;
int& ref = a;

在這個例子中,ref是一個對整數變量a的引用,ref和a指向同一個內存位置,對ref的操作實際上是對a的操作。

不同書寫方式的對比

int& value

int& value = someVariable;

這種方式將&符號緊貼在類型int上,表示value是一個整數引用。很多程序員喜歡這種寫法,因為它清楚地表明了value的類型是“引用”。

int &value

int &value = someVariable;

這種方式將&符號緊貼在變量名value上,這在視覺上讓人覺得&是變量名的一部分。有些程序員更喜歡這種風格,因為他們認為它更直觀。

編譯器的處理

無論使用哪種風格,編譯器都會以相同的方式處理它們。int& value 和 int &value 都表示一個對整數類型的引用,二者之間沒有任何功能上的差異。以下兩個例子是完全等價的:

int a = 10;
int& ref1 = a;  // 引用聲明方式1
int &ref2 = a;  // 引用聲明方式2ref1 = 20;
std::cout << a << std::endl;  // 輸出20
ref2 = 30;
std::cout << a << std::endl;  // 輸出30

綜合實例

下面是一個綜合使用const的例子:

#include <iostream>
#include <vector>class MyClass {
public:MyClass(int v) : value(v) {}int getValue() const {return value;}const std::vector<int>& getValues() const {return values;}void addValue(const int& v) {values.push_back(v);}private:const int value;std::vector<int> values;
};int main() {const MyClass obj(10);std::cout << obj.getValue() << std::endl;obj.addValue(1); // 常量對象調用非常量成員函數是允許的,因為非常量成員函數不修改常量成員變量const std::vector<int>& values = obj.getValues();for (std::vector<int>::const_iterator it = values.begin(); it != values.end(); ++it) {std::cout << *it << std::endl;}return 0;
}

在這個綜合實例中,展示了如何在類中使用const關鍵字來定義常量成員變量、常量成員函數、常量參數和常量引用。通過這些實踐,可以編寫出更加健壯和高效的C++代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40036.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40036.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40036.shtml

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

相關文章

【ARMv8/v9 GIC 系列 5 -- GIC GICD_CTRL 使用詳細介紹】

文章目錄 GICD_CTRLGICD_CTLR 寄存器結構RWP&#xff08;Register Write Pending&#xff09;E1NWF&#xff08;Enable 1 of N Wakeup Functionality&#xff09;DS&#xff08;Disable Security&#xff09; 親和性路由&#xff08;Affinity Routing&#xff09;ARE_NSARE_S 中…

【java計算機畢設】服裝生產管理系統java MySQL springboot vue html maven項目設計源代碼+萬字文檔

目錄 1項目功能 2項目介紹 3項目地址 1項目功能 【java計算機畢設】服裝生產管理系統java MySQL springboot vue html maven項目代碼文檔 2項目介紹 系統功能&#xff1a; 服裝生產管理系統包括管理員、用戶兩種角色。 管理員功能包括個人中心模塊用于修改個人信息和密碼&a…

【UE5.3】筆記6-創建可自由控制Pawn類

搭建場景 搭建一個場景&#xff1a;包含地板、圍墻。可以根據喜好加一些自發光的效果。 增加食物 創建食物藍圖類&#xff0c;在場景里放置一些食物以供我們player去吃掉獲取分值。 創建可控制的layer 我們先右鍵創建一個藍圖繼承自pawn類&#xff0c;起名BP_Player&#xf…

Python-算法編程100例-二分法(入門級)-業務負載分配

題目&#xff1a; 現有一個服務器集群&#xff08;服務器數量為 serverNum&#xff09;&#xff0c;和一批不同類型的任務&#xff08;用數組 tasks 表示&#xff0c;下標表示任務類型&#xff0c;值為任務數量&#xff09;。 現需要把這批任務都分配到集群的服務器上&#x…

2024年在WordPress中創建銷售活動的專家級優惠券方法

2024年在WordPress中創建銷售活動的專家級優惠券方法 今天我想和大家分享一些關于如何在WordPress網站上使用專家級優惠券工具來創建銷售活動的經驗。對于已經在電商領域有一定經驗的店主&#xff0c;利用專家級優惠券不僅能吸引顧客&#xff0c;還能顯著增加銷量。在這篇文章…

【Linux】線程封裝與互斥(萬字)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 目錄 文章目錄 前言 C多線程的用法 對原生線程進行一次封裝 理解pthread線程 Linux線程互斥 進程線程間的互斥相關背景概念 互斥量mutex 操作共享變量會有問題的售票…

[go-zero] goctl 生成api和rpc

文章目錄 1.goctl 概述2.go-zero 需要安裝的組件3.生成 api4.生成 rpc 1.goctl 概述 goctl支持多種rpc&#xff0c;較為流行的是google開源的grpc&#xff0c;這里主要介紹goctl rpc protoc的代碼生成與使用。protoc是grpc的命令&#xff0c;作用是將proto buffer文件轉化為相…

探討命令模式及其應用

目錄 命令模式命令模式結構命令模式適用場景命令模式優缺點練手題目題目描述輸入描述輸出描述題解 命令模式 命令模式是一種行為設計模式&#xff0c; 它可將請求轉換為一個包含與請求相關的所有信息的獨立對象。 該轉換讓你能根據不同的請求將方法參數化、 延遲請求執行或將其…

《亞馬遜搬運亞馬遜產品》配合跟賣采集爬取跟賣店鋪高質量

亞馬遜高質量產品如何搬運&#xff1f;亞馬遜采集亞馬遜。 哈嘍大家好&#xff0c;大家講一下做亞馬遜是發貨、鋪貨這塊的功能。目前這款軟件做跟賣大家都知道&#xff0c;同時也支持做鋪貨。鋪貨可以采集國內的1688、淘寶、京東都可以采&#xff0c;采完之后也可以采速賣通&a…

周周星分享7.3—基于氣象大數據的自動站實況聯合預測

賽題 2024中國高校計算機大賽 — 大數據挑戰賽 經驗分享 大家好&#xff0c;我是掃地僧團隊的隊長&#xff0c;以前參加這樣打榜的比賽比較少&#xff0c;了解的打榜技巧不是太多&#xff0c;所以想從科研的角度給大家一點分享。 這次比賽主要從以下五個步驟進行&#xff1a…

Linux Doxygen快速生成文檔

此前寫過一篇編寫Doxygen格式的注釋以用于生成文檔,點擊以查閱, Doxygen常用語法與字段記錄,但是當時用的windows桌面版的doxygen,最近使用ubuntu編寫代碼想直接使用doxygen生成,故寫下此博客 Doxygen Doxygen是一個用于生成軟件文檔的工具&#xff0c;它可以從代碼中提取注釋…

(四)opengl函數加載和錯誤處理

#include <glad/glad.h>//glad必須在glfw頭文件之前包含 #include <GLFW/glfw3.h> #include <iostream>void frameBufferSizeCallbakc(GLFWwindow* window, int width, int height) {glViewport(0, 0, width, height);std::cout << width << &qu…

PHP多線程爬蟲:高效解析電商網頁內容

如何使用php多線程編寫高效的網頁爬蟲 隨著互聯網的發展和數據的不斷增長&#xff0c;網頁爬蟲成為了一種非常重要的工具。通過網頁爬蟲&#xff0c;我們可以自動地從各種網站上獲取大量的數據&#xff0c;并進行進一步的處理和分析。而PHP作為一種廣泛使用的編程語言&#xf…

Android高級面試_6_性能優化

Android 高級面試-7&#xff1a;網絡相關的三方庫和網絡協議等 1、網絡框架 問題&#xff1a;HttpUrlConnection, HttpClient, Volley 和 OkHttp 的區別&#xff1f; HttpUrlConnection 的基本使用方式如下&#xff1a; URL url new URL("http://www.baidu.com")…

SwanLinkOS首批實現與HarmonyOS NEXT互聯互通,軟通動力子公司鴻湖萬聯助力鴻蒙生態統一互聯

在剛剛落下帷幕的華為開發者大會2024上&#xff0c;伴隨全場景智能操作系統HarmonyOS Next的盛大發布&#xff0c;作為基于OpenHarmony的同根同源系統生態&#xff0c;軟通動力子公司鴻湖萬聯全域智能操作系統SwanLinkOS首批實現與HarmonyOS NEXT互聯互通&#xff0c;率先攻克基…

大模型與機器人精彩碰撞-7月5日晚上八點不見不散!

在瞬息萬變的科技時代&#xff0c;新興人工智能和機器人技術的結合正在引領新一輪的創新浪潮。你是否想成為未來科技的領航者&#xff1f;你是否想了解最前沿的AI與機器人技術&#xff1f;行麥科技重磅推出的“AIGC時代的生存法則”AI系列課&#xff0c;將為你揭開大模型與機器…

創建kset

1、kset介紹 2、相關結構體和api介紹 2.1 struct kset 2.2 kset_create_and_add kset_create_and_addkset_createkset_registerkobject_add_internalkobject_add_internal2.3 kset_unregister kset_unregisterkobject_delkobject_put3、實驗操作 #include<linux/module.…

【leetcode64-69二分查找、70-74棧、75-77堆】

二分查找[64-69] 時間復雜度O(log n)&#xff0c;要想到二分排序 35.搜索插入位置 class Solution:def searchInsert(self, nums: List[int], target: int) -> int:left 0right len(nums)-1while left < right: #左閉右閉mid (leftright)//2if nums[mid] < target…

【算法訓練記錄——Day39】

Day39——動態規劃Ⅱ 1.leetcode_62不同路徑2.leetcode_63不同路徑Ⅱ3.leetcode_343整數拆分4.leetcode_96不同的二叉樹搜索 1.leetcode_62不同路徑 思路&#xff1a;經典的動態規劃問題&#xff1a; dp[i][j]表示到達&#xff08;i&#xff0c;j&#xff09;位置時的不同路徑…

運維鍋總淺析云原生DevOps工具

本文從Tekton與Kubevela、Jenkins、GitLab CI的區別與聯系對常見的云原生DevOps工具進行對比分析&#xff0c;最后給出DevOps工具選型思路。希望對您有所幫助&#xff01; 一、DevOps簡介 DevOps是一種結合了軟件開發&#xff08;Development&#xff09;和IT運維&#xff08…