中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于c++ const指針與指向const指針的簡介

發布時間:2020-07-03 09:33:38 來源:億速云 閱讀:145 作者:清晨 欄目:開發技術

這篇文章主要介紹關于c++ const指針與指向const指針的簡介,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

const指針的定義:

  const指針是指針變量的值一經初始化,就不可以改變指向,初始化是必要的。其定義形式如下:

type *const 指針名稱;

  聲明指針時,可以在類型前或后使用關鍵字const,也可在兩個位置都使用。例如,下面都是合法的聲明,但是含義大不同:

const int * pOne;    //指向整形常量 的指針,它指向的值不能修改

int * const pTwo;    //指向整形的常量指針 ,它不能在指向別的變量,但指向(變量)的值可以修改。

const int *const pThree;  //指向整形常量 的常量指針 。它既不能再指向別的常量,指向的值也不能修改。

理解這些聲明的技巧在于,查看關鍵字const右邊來確定什么被聲明為常量 ,如果該關鍵字的右邊是類型,則值是常量;如果關鍵字的右邊是指針變量,則指針本身是常量。下面的代碼有助于說明這一點:

const int *p1; //the int pointed to is constant

int * const p2; // p2 is constant, it can't point to anything else

const指針和const成員函數

可以將關鍵字用于成員函數。例如:

class Rectangle

{

   pubilc:

    .....

    void SetLength(int length){itslength = length;}

    int GetLength() const {return itslength;} //成員函數聲明為常量

    .....

   private:

    int itslength;

    int itswidth;

};

當成員函數被聲明為const時,如果試圖修改對象的數據,編譯器將視為錯誤。

如果聲明了一個指向const對象的指針,則通過該指針只能調用const方法(成員函數)。

示例聲明三個不同的Rectangle對象:

Rectangle* pRect = new Rectangle;

const Rectangle * pConstRect = new Rectangle;   //指向const對象

Rectangle* const pConstPtr = new Rectangle;// pConstRect是指向const對象的指針,它只能使用聲明為const的成員函數,如GetLength()。

const指針和指向const的指針

       當使用帶有const的指針時其實有兩種意思。一種指的是你不能修改指針本身的內容,另一種指的是你不能修改指針指向的內容。聽起來有點混淆一會放個例子上來就明白了。

      先說指向const的指針,它的意思是指針指向的內容是不能被修改的。它有兩種寫法。

      const int* p; (推薦)

      int const* p;

      第一種可以理解為,p是一個指針,它指向的內容是const int 類型。p本身不用初始化它可以指向任何標示符,但它指向的內容是不能被改變的。

      第二種很容易被理解成是p是一個指向int的const指針(指針本身不能被修改),但這樣理解是錯誤的,它也是表示的是指向const的指針(指針指向的內容是不能被修改的),它跟第一種表達的是一個意思。為了避免混淆推薦大家用第一種。

      再說const指針,它的意思是指針本身的值是不能被修改的。它只有一種寫法

      int* const p=一個地址; (因為指針本身的值是不能被修改的所以它必須被初始化)

      這種形式可以被理解為,p是一個指針,這個指針是指向int 的const指針。它指向的值是可以被改變的如*p=3;

      還有一種情況是這個指針本身和它指向的內容都是不能被改變的,請往下看。

      const int* const p=一個地址;

      int const* const p=一個地址;

       看了上面的內容是不是有點暈,沒關系,你不用去背它,用的多了就知道了,還有個技巧,通過上面的觀察我們不難總結出一點規律,是什么呢?這個規律就是: 指向const的指針(指針指向的內容不能被修改)const關健字總是出現在*的左邊而const指針(指針本身不能被修改)const關健字總是出現在*的右邊,那不用說兩個const中間加個*肯定是指針本身和它指向的內容都是不能被改變的。有了這個規則是不是就好記多了。

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 #include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
  int a=3;
  int b;
  
  /*定義指向const的指針(指針指向的內容不能被修改)*/ 
  const int* p1; 
  int const* p2; 
  
  /*定義const指針(由于指針本身的值不能改變所以必須得初始化)*/ 
  int* const p3=&a; 
  
  /*指針本身和它指向的內容都是不能被改變的所以也得初始化*/
  const int* const p4=&a;
  int const* const p5=&b; 
  
   p1=p2=&a; //正確
   *p1=*p2=8; //不正確(指針指向的內容不能被修改)
  
   *p3=5; //正確
   p3=p1; //不正確(指針本身的值不能改變) 
  
   p4=p5;//不正確 (指針本身和它指向的內容都是不能被改變) 
   *p4=*p5=4; //不正確(指針本身和它指向的內容都是不能被改變) 
   
  return 0; 
}

const用法小結:

const最常用的就是定義常量,除此之外,它還可以修飾函數的參數、返回值和函數的定義體。

1. const修飾函數的參數

如果參數作輸出用,不論它是什么數據類型,也不論它采用“指針傳遞”還是“引用傳遞”,都不能加const 修飾,否則該參數將失去輸出功能。

const 只能修飾輸入參數:
如果輸入參數采用“指針傳遞”,那么加const 修飾可以防止意外地改動該指針,起到保護作用。
將“const &”修飾輸入參數的用法總結如下:

(1)對于非內部數據類型的輸入參數,應該將“值傳遞”的方式改為“const 引用傳遞”,目的是提高效率。例如將void Func(A a) 改為void Func(const A &a)。

(2)對于內部數據類型的輸入參數,不要將“值傳遞”的方式改為“const 引用傳遞”。否則既達不到提高效率的目的,又降低了函數的可理解性。例如void Func(int x) 不應該改為void Func(const int &x)。

2. const 修飾函數的返回值

如果給以“指針傳遞”方式的函數返回值加const 修飾,那么函數返回值(即指針)的內容不能被修改,該返回值只能被賦給加const 修飾的同類型指針。例如函數

const char * GetString(void);

如下語句將出現編譯錯誤:

char *str = GetString();

正確的用法是

const char *str = GetString();

如果返回值不是內部數據類型,將函數A GetA(void) 改寫為const A & GetA(void)的確能提高效率。但此時千萬千萬要小心,一定要搞清楚函數究竟是想返回一個對象的“拷貝”還是僅返回“別名”就可以了,否則程序會出錯。
函數返回值采用“引用傳遞”的場合并不多,這種方式一般只出現在類的賦值函數中,目的是為了實現鏈式表達。
例如:

class A
{
A & operate = (const A &other); // 賦值函數
};
A a, b, c; // a, b, c 為A 的對象
a = b = c; // 正常的鏈式賦值
(a = b) = c; // 不正常的鏈式賦值,但合法

如果將賦值函數的返回值加const 修飾,那么該返回值的內容不允許被改動。上例中,語句 a = b = c 仍然正確,但是語句 (a = b) = c 則是非法的。

3. const修飾成員函數

關于Const函數的幾點規則:

  •  const對象只能訪問const成員函數,而非const對象可以訪問任意的成員函數,包括const成員函數.
  •  const對象的成員是不可修改的,然而const對象通過指針維護的對象卻是可以修改的.
  •  const成員函數不可以修改對象的數據,不管對象是否具有const性質.它在編譯時,以是否修改成員數據為依據,進行檢查.
  •  然而加上mutable修飾符的數據成員,對于任何情況下通過任何手段都可修改,自然此時的const成員函數是可以修改它的

以上是關于c++ const指針與指向const指針的簡介的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苍南县| 乐陵市| 江津市| 濮阳市| 遵化市| 哈巴河县| 临夏市| 乡城县| 梁山县| 山丹县| 浮梁县| 巧家县| 镶黄旗| 郓城县| 莫力| 慈溪市| 安阳市| 邵阳市| 聂拉木县| 屏东市| 青河县| 安新县| 杨浦区| 镇江市| 贵溪市| 葫芦岛市| 古田县| 沧州市| 吴忠市| 清远市| 衢州市| 温泉县| 常德市| 汾西县| 德格县| 宁化县| 甘肃省| 惠州市| 东乡| 南京市| 确山县|