1. 程式人生 > >c++ const類成員函式

c++ const類成員函式

我們知道,在C++中,若一個變數宣告為const型別,則試圖修改該變數的值的操作都被視編譯錯誤。例如,

  1. constchar blank = ‘’;  
  2. blank = ‘\n’;  // 錯誤

        面向物件程式設計中,為了體現封裝性,通常不允許直接修改類物件的資料成員。若要修改類物件,應呼叫公有成員函式來完成。為了保證const物件的常量性,編譯器須區分不安全與安全的成員函式(即區分試圖修改類物件與不修改類物件的函式)。例如,

  1. const Screen blankScreen;  
  2. blankScreen.display();   // 物件的讀操作
  3. blankScreen.set(‘*’);    // 錯誤:const類物件不允許修改

        在C++中,只有被宣告為const的成員函式才能被一個const類物件呼叫。

        要宣告一個const型別的類成員函式,只需要在成員函式引數列表後加上關鍵字const,例如,

  1. class Screen {  
  2. public:  
  3.    char get() const;  
  4. };  

        在類體之外定義const成員函式時,還必須加上const關鍵字,例如

  1. char Screen::get() const {  
  2.    return _screen[_cursor];  
  3. }  

        若將成員成員函式宣告為const,則該函式不允許修改類的資料成員。例如,

  1. class Screen {  
  2. public:  
  3. int ok() const {return _cursor; }  
  4. int error(intival) const { _cursor = ival; }  
  5. };  

        在上面成員函式的定義中,ok()的定義是合法的,error()的定義則非法。

        值得注意的是,把一個成員函式宣告為const可以保證這個成員函式不修改資料成員,但是,如果據成員是指標,則const成員函式並不能保證不修改指標指向的物件,編譯器不會把這種修改檢測為錯誤。例如,

  1. class Name {  
  2. public
    :  
  3. void setName(const string &s) const;  
  4. private:  
  5.     char *m_sName;  
  6. };  
  7. void setName(const string &s) const {  
  8.     m_sName = s.c_str();      // 錯誤!不能修改m_sName;
  9. for (int i = 0; i < s.size(); ++i)   
  10.     m_sName[i] = s[i];    // 不好的風格,但不是錯誤的
  11. }  

        雖然m_Name不能被修改,但m_sName是char *型別,const成員函式可以修改其所指向的字元。

        const成員函式可以被具有相同引數列表的非const成員函式過載,例如,

  1. class Screen {  
  2. public:  
  3. char get(int x,int y);  
  4. char get(int x,int y) const;  
  5. };  

        在這種情況下,類物件的常量性決定呼叫哪個函式。

  1. const Screen cs;  
  2. Screen cc2;  
  3. char ch = cs.get(0, 0);  // 呼叫const成員函式
  4. ch = cs2.get(0, 0);     // 呼叫非const成員函式

小結:

1)const成員函式可以訪問非const物件的非const資料成員、const資料成員,也可以訪問const物件內的所有資料成員;

2)非const成員函式可以訪問非const物件的非const資料成員、const資料成員,但不可以訪問const物件的任意資料成員;

3)作為一種良好的程式設計風格,在宣告一個成員函式時,若該成員函式並不對資料成員進行修改操作,應儘可能將該成員函式宣告為const 成員函式。

相關推薦

c++ const成員函式

我們知道,在C++中,若一個變數宣告為const型別,則試圖修改該變數的值的操作都被視編譯錯誤。例如, constchar blank = ‘’;   blank = ‘\n’;  // 錯誤         面向物件程式設計中,為了體現封裝性,通常不允許直接

C++的const成員函式

我們知道,在C++中,若一個變數宣告為const型別,則試圖修改該變數的值的操作都被視編譯錯誤。例如, constchar blank = ‘’;   blank = ‘\n’;  // 錯誤         面向物件程式設計中,為了體現封裝性,通常不允許直接

c++用成員函式作為執行緒函式

參考:https://www.cnblogs.com/rangozhang/p/4468754.html https://blog.csdn.net/YuHengZuo/article/details/78565723 當我們建立執行緒的時候 執行緒處理函式如果是類裡面的成員函式會報錯,需要

C++中成員函式的過載、覆蓋和隱藏的區別,超清楚!

1.成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 2.覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同;

C++的成員函式的思考,static,成員函式指標。

1.如果採取例項化,然後,在呼叫這個成員函式的時候總是帶上例項的名字呼叫,我覺得這很不科學,否則每次改變例項的名字,呼叫函式的時候也要跟著改變。2.class a{public:    void ss();}void tt(){    ss(); }void ss(){   

C++ const 引數 成員函式 規則

      看到const 關鍵字,C++程式設計師首先想到的可能是const 常量。這可不是良好的條件反射。如果只知道用const 定義常量,那麼相當於把火藥僅用於製作鞭炮。const 更大的魅力是它可以修飾函式的引數、返回值,甚至函式的定義體。 const 是constant 的縮寫,“恆定不變

C++ const 修飾成員函式

2 用const修飾函式的返回值如果給以“指標傳遞”方式的函式返回值加const修飾,那麼函式返回值(即指標)的內容不能被修改,該返回值只能被賦給加const 修飾的同類型指標。例如函式const char *GetString(void);如下語句將出現編譯錯誤:char *str = GetString(

C++筆記(七)——3:const修飾成員函式

一、const修飾的成員函式         由於成員函式可以任意訪問類內的任何資料成員,但當我們不願意讓成員函式修改資料成員時,我們可以用const修飾類的成員函式,一般形式為: class CName { private: ......

c++成員函式後邊加const是為什麼?

時間是讓人猝不及防的東西,晴是有風陰時有雨,爭不過朝夕,又念著往昔,偷走了青絲卻留住一個你   #include <iostream> #include <string> using namespace std; class Test { pub

C++中 執行緒函式為靜態函式成員函式作為回撥函式

 執行緒函式為靜態函式:   執行緒控制函式和是不是靜態函式沒關係,靜態函式是在構造中分配的地址空間,只有在析構時才釋放也就是全域性的東西,不管執行緒是否執行,靜態函式的地址是不變的,並不在執行緒堆疊中static只是起了一個裝飾的作用,所以二者並沒有必然的關係   執行緒也是一種

C++ 函式指標 指向成員函式

//A類與B類的定義 class A { public:   void Test()   {     cout << "A::Test()" << endl;   } }; &

C++----成員函式做友元函式

//成員函式做友元函式: //只讓visit1做building的好朋友(只有visit1能訪問building的私有屬性) class Building; class goodGay { public: goodGay(); void visit1(); void visit2();

《面向物件程式設計 C++》資料成員成員函式

類資料成員 C++類中有一種型別成員,屬於類本身,而不屬於類的物件,這種型別成員成為類成員,而屬於物件的成員成為物件成員或例項成員。可以使用關鍵字static來建立一個類成員。 static宣告與定義 class C { public: //... private:

當執行緒函式C++成員函式

很多時候我們在C++多執行緒開發時,都會或多或少遇到執行緒函式為C++類中的某個成員函式,此時可能會發生什麼呢?你有可能會雜麼做呢? 接下來我就為大家總結一下我在這方面走過的一個歷程 1.問題一 記得我在之前在寫一個udp傳輸檔案的程式時,我就第一次遇到了

C++子成員函式的覆蓋和隱藏例項詳解

https://www.jb51.net/article/117380.htm函式的覆蓋   覆蓋發生的條件:(1) 基類必須是虛擬函式(使用virtual 關鍵字來進行宣告) (2)發生覆蓋的兩個函式分別位於派生類和基類 (3)函式名和引數列表必須完全相同函式的隱藏   

C++ 過載運算子 運算子過載函式作為成員函式 過載運算子+

用運算子過載函式作為類成員函式的方法過載運算子+ 下面的例子來自於課本: #include <iostream> using namespace std; class Complex {

c++中的函式指標和成員函式指標

// // main.cpp // Demo // // Created by 杜國超 on 16/12/28. // Copyright © 2016年 杜國超. All rights reserved. // #include using namespace std; class MYCla

C++繼承詳解之二——派生成員函式詳解(函式隱藏、建構函式與相容覆蓋規則)

  在這一篇文章開始之前,我先解決一個問題。   在上一篇C++繼承詳解之一——初探繼承中,我提到了在派生類中可以定義一個與基類成員函式同名的函式,這樣派生類中的函式就會覆蓋掉基類的成員函式。   在譚浩強的C++程式設計這本書第十一章,351頁最下面有這麼

C++static成員,static成員函式

0.static修飾類中成員,表示類的共享資料 1.static類成員 在C++primer裡面說過,static類成員不像普通的類資料成員,static類資料成員獨立於一切類物件處在。static類資料成員是與類關聯的,但不與該類定義的物件有任何關係。這句話什麼意思?就是

簡單的C++委託 —— 用模板實現成員函式的回撥

template <class R, class P1, class P2>class IDelegate{public:virtual R Invoke(P1, P2) = 0;};template <class T, class R, class P1, class P2>clas