0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++中const以及this指針的使用

C語(yǔ)言編程學(xué)習(xí)基地 ? 來(lái)源:C語(yǔ)言編程學(xué)習(xí)基地 ? 作者:C語(yǔ)言編程學(xué)習(xí)基地 ? 2021-09-23 11:39 ? 次閱讀

const

作用

修飾變量,說(shuō)明該變量不可以被改變;

修飾指針,分為指向常量的指針(pointer to const)和自身是常量的指針(常量指針,const pointer);

修飾引用,指向常量的引用(reference to const),用于形參類(lèi)型,即避免了拷貝,又避免了函數(shù)對(duì)值的修改;

修飾成員函數(shù),說(shuō)明該成員函數(shù)內(nèi)不能修改成員變量。

const 的指針與引用

指針

指向常量的指針(pointer to const)

自身是常量的指針(常量指針,const pointer)

引用

指向常量的引用(reference to const)

沒(méi)有 const reference,因?yàn)橐弥皇菍?duì)象的別名,引用不是對(duì)象,不能用 const 修飾

(為了方便記憶可以想成)被 const 修飾(在 const 后面)的值不可改變,如下文使用例子中的 p2、p3

const 使用

// 類(lèi)class A{private: const int a; // 常對(duì)象成員,可以使用初始化列表或者類(lèi)內(nèi)初始化 public: // 構(gòu)造函數(shù) A() : a(0) { }; A(int x) : a(x) { }; // 初始化列表 // const可用于對(duì)重載函數(shù)的區(qū)分

int getValue(); // 普通成員函數(shù) int getValue() const; // 常成員函數(shù),不得修改類(lèi)中的任何數(shù)據(jù)成員的值

}; void function(){ // 對(duì)象 A b; // 普通對(duì)象,可以調(diào)用全部成員函數(shù) const A a; // 常對(duì)象,只能調(diào)用常成員函數(shù) const A *p = &a; // 指針變量,指向常對(duì)象 const A &q = a; // 指向常對(duì)象的引用 // 指針 char greeting[] = “Hello”; char* p1 = greeting; // 指針變量,指向字符數(shù)組變量

const char* p2 = greeting; // 指針變量,指向字符數(shù)組常量(const 后面是 char,說(shuō)明指向的字符(char)不可改變) char* const p3 = greeting; // 自身是常量的指針,指向字符數(shù)組變量(const 后面是 p3,說(shuō)明 p3 指針自身不可改變) const char* const p4 = greeting; // 自身是常量的指針,指向字符數(shù)組常量

} // 函數(shù)void function1(const int Var); // 傳遞過(guò)來(lái)的參數(shù)在函數(shù)內(nèi)不可變void function2(const char* Var); // 參數(shù)指針?biāo)竷?nèi)容為常量void function3(char* const Var); // 參數(shù)指針為常量void function4(const int& Var); // 引用參數(shù)在函數(shù)內(nèi)為常量 // 函數(shù)返回值

const int function5(); // 返回一個(gè)常數(shù)const int* function6(); // 返回一個(gè)指向常量的指針變量,使用:const int *p = function6();int* const function7(); // 返回一個(gè)指向變量的常指針,使用:int* const p = function7();

static

作用

修飾普通變量,修改變量的存儲(chǔ)區(qū)域和生命周期,使變量存儲(chǔ)在靜態(tài)區(qū),在 main 函數(shù)運(yùn)行前就分配了空間,如果有初始值就用初始值初始化它,如果沒(méi)有初始值系統(tǒng)用默認(rèn)值初始化它。

修飾普通函數(shù),表明函數(shù)的作用范圍,僅在定義該函數(shù)的文件內(nèi)才能使用。在多人開(kāi)發(fā)項(xiàng)目時(shí),為了防止與他人命名空間里的函數(shù)重名,可以將函數(shù)定位為 static。

修飾成員變量,修飾成員變量使所有的對(duì)象只保存一個(gè)該變量,而且不需要生成對(duì)象就可以訪問(wèn)該成員。

修飾成員函數(shù),修飾成員函數(shù)使得不需要生成對(duì)象就可以訪問(wèn)該函數(shù),但是在 static 函數(shù)內(nèi)不能訪問(wèn)非靜態(tài)成員。

this 指針

this 指針是一個(gè)隱含于每一個(gè)非靜態(tài)成員函數(shù)中的特殊指針。它指向調(diào)用該成員函數(shù)的那個(gè)對(duì)象。

當(dāng)對(duì)一個(gè)對(duì)象調(diào)用成員函數(shù)時(shí),編譯程序先將對(duì)象的地址賦給 this 指針,然后調(diào)用成員函數(shù),每次成員函數(shù)存取數(shù)據(jù)成員時(shí),都隱式使用 this 指針。

當(dāng)一個(gè)成員函數(shù)被調(diào)用時(shí),自動(dòng)向它傳遞一個(gè)隱含的參數(shù),該參數(shù)是一個(gè)指向這個(gè)成員函數(shù)所在的對(duì)象的指針。

this 指針被隱含地聲明為: ClassName *const this,這意味著不能給 this 指針賦值;在 ClassName 類(lèi)的 const 成員函數(shù)中,this 指針的類(lèi)型為:const ClassName* const,這說(shuō)明不能對(duì) this 指針?biāo)赶虻倪@種對(duì)象是不可修改的(即不能對(duì)這種對(duì)象的數(shù)據(jù)成員進(jìn)行賦值操作);

this 并不是一個(gè)常規(guī)變量,而是個(gè)右值,所以不能取得 this 的地址(不能 &this)。

在以下場(chǎng)景中,經(jīng)常需要顯式引用 this 指針:

為實(shí)現(xiàn)對(duì)象的鏈?zhǔn)揭茫?/p>

為避免對(duì)同一對(duì)象進(jìn)行賦值操作;

在實(shí)現(xiàn)一些數(shù)據(jù)結(jié)構(gòu)時(shí),如 list。

寫(xiě)在最后:對(duì)于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開(kāi)始!

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7594

    瀏覽量

    135862
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3565

    瀏覽量

    93536
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4277

    瀏覽量

    62323

原文標(biāo)題:C++基礎(chǔ)語(yǔ)法梳理:const,static以及 this 指針

文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言和C++結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語(yǔ)言和C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?103次閱讀

    C語(yǔ)言指針運(yùn)算符詳解

    C語(yǔ)言中,當(dāng)你有一個(gè)指向數(shù)組某個(gè)元素的指針時(shí),你可以對(duì)該指針執(zhí)行某些算術(shù)運(yùn)算,例如加法或減法。這些運(yùn)算可以用來(lái)遍歷數(shù)組的元素,如ptr
    的頭像 發(fā)表于 10-30 11:16 ?122次閱讀

    ostream在c++的用法

    ostream 是 C++ 標(biāo)準(zhǔn)庫(kù)中一個(gè)非常重要的類(lèi),它位于 頭文件(實(shí)際上,更常見(jiàn)的是通過(guò)包含 頭文件來(lái)間接包含 ,因?yàn)?包含了 和 )。 ostream 類(lèi)及其派生類(lèi)(如 std::cout
    的頭像 發(fā)表于 09-20 15:11 ?416次閱讀

    C++實(shí)現(xiàn)類(lèi)似instanceof的方法

    函數(shù),可實(shí)際上C++沒(méi)有。但是別著急,其實(shí)C++中有兩種簡(jiǎn)單的方法可以實(shí)現(xiàn)類(lèi)似Java的instanceof的功能。 在 C++
    的頭像 發(fā)表于 07-18 10:16 ?499次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>實(shí)現(xiàn)類(lèi)似instanceof的方法

    Keil+C51對(duì)雙數(shù)據(jù)指針的直接利用

    Keil+C51對(duì)雙數(shù)據(jù)指針的直接利用
    發(fā)表于 06-18 10:15 ?0次下載

    鴻蒙OS開(kāi)發(fā)實(shí)例:【Native C++

    使用DevEco Studio創(chuàng)建一個(gè)Native C++應(yīng)用。應(yīng)用采用Native C++模板,實(shí)現(xiàn)使用NAPI調(diào)用C標(biāo)準(zhǔn)庫(kù)的功能。使用C標(biāo)準(zhǔn)庫(kù)hypot接口計(jì)算兩個(gè)給定數(shù)平方和的平
    的頭像 發(fā)表于 04-14 11:43 ?2449次閱讀
    鴻蒙OS開(kāi)發(fā)實(shí)例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023? 避免基于范圍的 for 循環(huán)中的錯(cuò)誤

    在前兩篇博客,我們?向您介紹了新的 MISRA C++ 標(biāo)準(zhǔn)?和?C++ 的歷史?。在這篇博客,我們將仔細(xì)研究以 C++
    的頭像 發(fā)表于 03-28 13:53 ?709次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環(huán)中的錯(cuò)誤

    C語(yǔ)言的指針用法

    C語(yǔ)言編程善用指針可以簡(jiǎn)化一些任務(wù)的處理,而對(duì)于一些任務(wù)(比如動(dòng)態(tài)內(nèi)存分配),必須要有指針才行的。也就是說(shuō)精通C
    發(fā)表于 03-05 14:22 ?305次閱讀
    <b class='flag-5'>C</b>語(yǔ)言的<b class='flag-5'>指針</b>用法

    c語(yǔ)言,c++,java,python區(qū)別

    操作系統(tǒng)、嵌入式系統(tǒng)等對(duì)性能要求較高的場(chǎng)景。C語(yǔ)言的語(yǔ)法相對(duì)簡(jiǎn)單,學(xué)習(xí)曲線較平緩,也是學(xué)習(xí)其他高級(jí)語(yǔ)言的入門(mén)語(yǔ)言。 C++C++是在C語(yǔ)言的基礎(chǔ)上進(jìn)行擴(kuò)展和改進(jìn)的一種編程語(yǔ)言。它支
    的頭像 發(fā)表于 02-05 14:11 ?2120次閱讀

    C++簡(jiǎn)史:C++是如何開(kāi)始的

    的 MISRA C++:2023 博客系列的第二部分。 在這篇博客,我們將深入探討 C++ 的歷史、編程語(yǔ)言多年來(lái)的發(fā)展歷程以及它的下一步發(fā)展方向。
    的頭像 發(fā)表于 01-11 09:00 ?513次閱讀
    <b class='flag-5'>C++</b>簡(jiǎn)史:<b class='flag-5'>C++</b>是如何開(kāi)始的

    C語(yǔ)言和C++那些不同的地方

    ++11標(biāo)準(zhǔn)。根據(jù)不同的標(biāo)準(zhǔn),它們的功能也會(huì)有所不同,但是越新的版本支持的編譯器越少,所以本文在討論的時(shí)候使用的C語(yǔ)言標(biāo)準(zhǔn)是C89,C++標(biāo)準(zhǔn)是C++99.我們來(lái)介紹
    的頭像 發(fā)表于 12-07 14:29 ?889次閱讀
    <b class='flag-5'>C</b>語(yǔ)言和<b class='flag-5'>C++</b><b class='flag-5'>中</b>那些不同的地方

    數(shù)組與指針不能混用的情況

    指針的基本概念。數(shù)組是一組相同類(lèi)型的元素的集合,而指針是一個(gè)變量,它存儲(chǔ)了一個(gè)地址,該地址指向內(nèi)存的某個(gè)位置。在 C/C++
    的頭像 發(fā)表于 12-07 13:46 ?558次閱讀

    如何選擇創(chuàng)建c語(yǔ)言和c++

    選擇創(chuàng)建 C 語(yǔ)言和 C++ 都需要綜合考慮多個(gè)因素。在決定使用哪種語(yǔ)言之前,我們需要對(duì)這兩種語(yǔ)言的特點(diǎn)、優(yōu)缺點(diǎn)、適用場(chǎng)景、學(xué)習(xí)成本等進(jìn)行全面的了解和對(duì)比。下面是關(guān)于選擇創(chuàng)建 C 語(yǔ)言和 C+
    的頭像 發(fā)表于 11-27 15:58 ?558次閱讀

    c++多行注釋快捷鍵

    C++,多行注釋?zhuān)ㄒ卜Q(chēng)為塊注釋?zhuān)┦且环N用于注釋大段代碼或多個(gè)語(yǔ)句的方法。當(dāng)你希望暫時(shí)禁用一些代碼或者解釋特定部分代碼的作用時(shí),多行注釋是非常有用的。 在C++,多行注釋以 /*
    的頭像 發(fā)表于 11-22 10:24 ?7936次閱讀

    探索C++的編程習(xí)慣與編程要點(diǎn)

    C++的類(lèi)可以分為帶指針數(shù)據(jù)成員與不帶指針數(shù)據(jù)成員兩類(lèi),complex就屬于不帶指針成員的類(lèi)。而這里要說(shuō)的字符串類(lèi)String,一般的實(shí)現(xiàn)會(huì)帶有一個(gè)char *
    的頭像 發(fā)表于 11-14 09:25 ?372次閱讀
    探索<b class='flag-5'>C++</b>的編程習(xí)慣與編程要點(diǎn)