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

詳細(xì)分析c++ const 指針與指向const的指針

 更新時(shí)間:2020年07月02日 15:13:51   作者:技術(shù)讓夢(mèng)想更偉大  
這篇文章主要介紹了c++ const 指針與指向const的指針的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

  最近在復(fù)習(xí)C++,指針這塊真的是重難點(diǎn),很久了也沒有去理會(huì),今晚好好總結(jié)一下const指針,好久沒有寫過博客了,記錄一下~

const指針的定義:

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

type *const 指針名稱;

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

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

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

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

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

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

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

const指針和const成員函數(shù)

可以將關(guān)鍵字用于成員函數(shù)。例如:

class Rectangle

{

  pubilc:

  .....

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

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

  .....

  private:

  int itslength;

  int itswidth;

};

當(dāng)成員函數(shù)被聲明為const時(shí),如果試圖修改對(duì)象的數(shù)據(jù),編譯器將視為錯(cuò)誤。

如果聲明了一個(gè)指向const對(duì)象的指針,則通過該指針只能調(diào)用const方法(成員函數(shù))。

示例聲明三個(gè)不同的Rectangle對(duì)象:

Rectangle* pRect = new Rectangle;

const Rectangle * pConstRect = new Rectangle;  //指向const對(duì)象

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

const指針和指向const的指針

       當(dāng)使用帶有const的指針時(shí)其實(shí)有兩種意思。一種指的是你不能修改指針本身的內(nèi)容,另一種指的是你不能修改指針指向的內(nèi)容。聽起來有點(diǎn)混淆一會(huì)放個(gè)例子上來就明白了。

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

      const int* p; (推薦)

      int const* p;

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

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

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

      int* const p=一個(gè)地址; (因?yàn)橹羔槺旧淼闹凳遣荒鼙恍薷牡乃运仨毐怀跏蓟?/p>

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

      還有一種情況是這個(gè)指針本身和它指向的內(nèi)容都是不能被改變的,請(qǐng)往下看。

      const int* const p=一個(gè)地址;

      int const* const p=一個(gè)地址;

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

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的指針(指針指向的內(nèi)容不能被修改)*/ 
 const int* p1; 
 int const* p2; 
 
 /*定義const指針(由于指針本身的值不能改變所以必須得初始化)*/ 
 int* const p3=&a; 
 
 /*指針本身和它指向的內(nèi)容都是不能被改變的所以也得初始化*/
 const int* const p4=&a;
 int const* const p5=&b; 
 
  p1=p2=&a; //正確
  *p1=*p2=8; //不正確(指針指向的內(nèi)容不能被修改)
 
  *p3=5; //正確
  p3=p1; //不正確(指針本身的值不能改變) 
 
  p4=p5;//不正確 (指針本身和它指向的內(nèi)容都是不能被改變) 
  *p4=*p5=4; //不正確(指針本身和它指向的內(nèi)容都是不能被改變) 
  
 return 0; 
}

const用法小結(jié):

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

1. const修飾函數(shù)的參數(shù)

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

const 只能修飾輸入?yún)?shù):
如果輸入?yún)?shù)采用“指針傳遞”,那么加const 修飾可以防止意外地改動(dòng)該指針,起到保護(hù)作用。
將“const &”修飾輸入?yún)?shù)的用法總結(jié)如下:

(1)對(duì)于非內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),應(yīng)該將“值傳遞”的方式改為“const 引用傳遞”,目的是提高效率。例如將void Func(A a) 改為void Func(const A &a)。

(2)對(duì)于內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),不要將“值傳遞”的方式改為“const 引用傳遞”。否則既達(dá)不到提高效率的目的,又降低了函數(shù)的可理解性。例如void Func(int x) 不應(yīng)該改為void Func(const int &x)。

2. const 修飾函數(shù)的返回值

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

const char * GetString(void);

如下語句將出現(xiàn)編譯錯(cuò)誤:

char *str = GetString();

正確的用法是

const char *str = GetString();

如果返回值不是內(nèi)部數(shù)據(jù)類型,將函數(shù)A GetA(void) 改寫為const A & GetA(void)的確能提高效率。但此時(shí)千萬千萬要小心,一定要搞清楚函數(shù)究竟是想返回一個(gè)對(duì)象的“拷貝”還是僅返回“別名”就可以了,否則程序會(huì)出錯(cuò)。
函數(shù)返回值采用“引用傳遞”的場(chǎng)合并不多,這種方式一般只出現(xiàn)在類的賦值函數(shù)中,目的是為了實(shí)現(xiàn)鏈?zhǔn)奖磉_(dá)。
例如:

class A
{
A & operate = (const A &other); // 賦值函數(shù)
};
A a, b, c; // a, b, c 為A 的對(duì)象
a = b = c; // 正常的鏈?zhǔn)劫x值
(a = b) = c; // 不正常的鏈?zhǔn)劫x值,但合法

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

3. const修飾成員函數(shù)

關(guān)于Const函數(shù)的幾點(diǎn)規(guī)則:

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

以上就是詳細(xì)分析c++ const 指針與指向const的指針的詳細(xì)內(nèi)容,更多關(guān)于c++ const 指針的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論