欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中多才多藝的 const

 更新時間:2021年09月26日 11:00:01   作者:干燥劑  
在C++中,關(guān)鍵字const可以用來修飾任何作用域內(nèi)的變量、函數(shù)參數(shù)、函數(shù)本體、函數(shù)返回值、成員函數(shù)、迭代器,也可以用來修飾指針本身和指針目標(biāo),可謂多才多藝,我們要詳細(xì)了解其內(nèi)部細(xì)節(jié),以及邏輯奧秘,讓這把多功能瑞士軍刀盡情發(fā)揮其作用,需要的朋友可以參考一下

1. 定義一個常全局變量

const int global = 100; // 初始化之后不可再賦值

這樣的global實際上是一個常量,這是C++用來取代宏定義的其中一種措施,const常量有類型檢測,提高編譯器的效率。

2. 定義常指針

這有兩個版本,分別是:

const int *p1 = &a; // p1不能修改它所指向的目標(biāo)
int const *p1 = &a; // p1的另一種等價形式
int *const p2 = &a; // p2本身不可修改

上述代碼中的p1經(jīng)常被用作函數(shù)參數(shù),用以限制指針的權(quán)限,在安全性方面功不可沒。p2用的很少,我們很少需要一個本身指向不可變的指針

3. 定義一個STL的常迭代器

這也有類似的兩個版本:

vector::const_iterator it1; // it1不能修改它所指代的目標(biāo)對象

const vector::iterator it2; // it2本身不可修改

由于迭代器實際上就是廣義指針,因此it1實際上相當(dāng)于上述代碼的p1,it2相當(dāng)于上述代碼的p2,同理it1用的較多,用來限制迭代器的權(quán)限。

4. 定義一個類的內(nèi)部常成員

包括常成員數(shù)據(jù)和常成員方法:

class text

{

     const int aconst = 100; // 常成員數(shù)據(jù),必須初始化

     void func(void) const; // 常成員方法,只能由常對象調(diào)用

     static int astatic;

};

類的常成員數(shù)據(jù)aconst,意味著類對象無法對其修改,這個很容易理解。至于類的常成員方法func就破費腦力了,語法上的理解是,func不能修改任何一個類對象的bit,這是顯而易見的,這也正是C++標(biāo)準(zhǔn)對const成員方法的定義。\

來近距離看看func方法的使用:

int text::astatic = 100; // 類外初始化靜態(tài)數(shù)據(jù)

void text::func(void) const // 類外定義const成員方法

{

astatic = 200; // 沒毛病,astatic不是對象數(shù)據(jù),此處可以被修改

aconst = 200; // 錯誤!const型函數(shù)不可修改類對象數(shù)據(jù)

}

定義如上的成員方法很重要,因為它明確地告訴了類的使用者,哪些函數(shù)可以修改類對象信息,哪些不會修改類對象信息。

func() 這樣的函數(shù)const成員方法,只能被常對象調(diào)用,以確保不違反權(quán)限緊縮原則,比如:

text t1; // 普通對象t1
const text t2; // const型對象t2
t1.func(); // 錯誤!普通對象不可調(diào)用常成員方法
t2.func(); 

注意:函數(shù)本體的const屬性是可以被視為重載的依據(jù)的,換句話說如果以上類text提供了non-const版本的func函數(shù),那么t1將會自動調(diào)用non-const那個版本。

以上陳述似乎平淡乏味,但考慮C++語法規(guī)定的這種bit-wise特性的常成員在處理類成員指針,并且指針指向類外部內(nèi)存時,情況也許會變得有趣。

5. bit-wise和logical-wise常特性

所謂bit-wise constness指的是類對象的內(nèi)部內(nèi)存意義上只讀約束,而loigcal-wise指的是邏輯意義上的只讀約束。編譯器沒有智能,它只能實現(xiàn)bit-wise意義上的約束,下面的例子討論const成員 operator[ ] 的表現(xiàn)可以幫助理解:

class text
{
     ... ...
     char &operator[ ](int pos) const;
private:
     char *p;
};

// const關(guān)鍵字保證了該成員方法只能被 const 對象調(diào)用
char &text::operator[ ](int pos) const
{
      return p[pos];
}

上述代碼中,類text存儲真正字符串的地方是指針 p 指向的內(nèi)存區(qū)域,假設(shè)此時定義一個 const 型的常對象,那么它只能保證類內(nèi)部信息(也就是p本身)不被修改,卻無法保證其所指向的內(nèi)存區(qū)域的安全性。來看下面的代碼:

const text ct("abcd");

ct[0] = 'A'; // 一個被編譯器允許卻跟邏輯相悖的語句

此處ct是一個const型對象,從字面理解出發(fā),我們應(yīng)該認(rèn)為ct對象是一個常量,我們應(yīng)該無法通過任何方式修改其內(nèi)部信息,但可惜,ct里面的字符串信息實際上并不存在在類內(nèi)存區(qū)域中,于是就出現(xiàn)了可以對一個const型對象進行賦值的有趣現(xiàn)象。

解決以上問題也不難,可以改寫 operator[ ] 成員方法的返回值類型:

const char &operator[ ](int pos) const;

此時就再也不能對 ct[0] 賦值了,但這只是個個例,關(guān)鍵我們要掌握的內(nèi)容是:如果我們的類對象擁有成員指針,那么一般意義上的const成員方法只能保證bits-wise的常量性(即保證類對象內(nèi)部的內(nèi)存信息不被修改),但無法保證所謂的 logical-wise的常量性(即保證邏輯上哪些信息不被修改)。

到此這篇關(guān)于C++中的 const的文章就介紹到這了,更多相關(guān)C++中的const內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++編程中的命名空間基本知識講解

    C++編程中的命名空間基本知識講解

    這篇文章主要介紹了C++編程中的命名空間基本知識講解,包括對C++11中內(nèi)聯(lián)命名空間新特性的介紹,需要的朋友可以參考下
    2016-01-01
  • C++面試題之進制轉(zhuǎn)換的實例

    C++面試題之進制轉(zhuǎn)換的實例

    這篇文章主要介紹了C++面試題之進制轉(zhuǎn)換的實例的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這樣的知識,需要的朋友可以參考下
    2017-10-10
  • 解析如何在C語言中調(diào)用shell命令的實現(xiàn)方法

    解析如何在C語言中調(diào)用shell命令的實現(xiàn)方法

    本篇文章是對如何在C語言中調(diào)用shell命令的方法進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)獲取系統(tǒng)時間的方法小結(jié)

    C++實現(xiàn)獲取系統(tǒng)時間的方法小結(jié)

    這篇文章主要為大家詳細(xì)介紹了使用C++實現(xiàn)獲取系統(tǒng)時間的一些常用方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以了解下
    2024-03-03
  • C++中I/O模型之select模型實例

    C++中I/O模型之select模型實例

    這篇文章主要介紹了C++中I/O模型的select模型,實例講述了I/O模型的用法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • C++/C 回文字符串的實例詳解

    C++/C 回文字符串的實例詳解

    這篇文章主要介紹了C++ 回文字符串的實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++無符號整數(shù)溢出問題解析

    C++無符號整數(shù)溢出問題解析

    這篇文章主要介紹了C++無符號整數(shù)溢出探究,本文主要探討C/C++中無符號整數(shù)超過范圍后的計算問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Windows系統(tǒng)下使用C語言編寫單線程的文件備份程序

    Windows系統(tǒng)下使用C語言編寫單線程的文件備份程序

    這篇文章主要介紹了Windows系統(tǒng)下使用C語言編寫單線程的文件備份程序,文中給出了實現(xiàn)的幾個關(guān)鍵代碼片段,剩下的只要套上main和線程調(diào)用的相關(guān)函數(shù)即可,非常詳細(xì),需要的朋友可以參考下
    2016-02-02
  • C++關(guān)于字符的接收與輸出操作示例

    C++關(guān)于字符的接收與輸出操作示例

    這篇文章主要介紹了C++關(guān)于字符的接收與輸出操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • C++智能指針shared_ptr

    C++智能指針shared_ptr

    這篇文章主要介紹了C++智能指針shared_ptr,C++11中包括shared_ptr在內(nèi)的多種指針,都是模板類型,意味著使用者可以指定想要操作的類型下文從shared_ptr創(chuàng)建方式展開全文,介紹詳細(xì)具有一的參考價值,需要的小伙伴可以參考一下
    2022-03-03

最新評論