最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ const的各種用法詳解

 更新時(shí)間:2023年04月23日 09:37:07   作者:COS  
const名叫常量限定符,用來(lái)限定特定變量,以通知編譯器該變量是不可修改的。習(xí)慣性的使用const,可以避免在函數(shù)中對(duì)某些不應(yīng)修改的變量造成可能的改動(dòng)。本文主要談?wù)刢onst的用法,感興趣的同學(xué)可以參考閱讀

C++作為一種面向?qū)ο蟮慕?jīng)典語(yǔ)言,它是非常的強(qiáng)大,它的每個(gè)部分都值得我們?nèi)ド钊肓私狻?/p>

const的基本概念:

const名叫常量限定符,用來(lái)限定特定變量,以通知編譯器該變量是不可修改的。習(xí)慣性的使用const,可以避免在函數(shù)中對(duì)某些不應(yīng)修改的變量造成可能的改動(dòng)。

下面我就const的用法來(lái)談?wù)劊?/p>

const的用法大致可分為以下幾個(gè)方面:

(1)const修飾基本數(shù)據(jù)類型

(2)const應(yīng)用到函數(shù)中

(3)const在類中的用法

(4)const修飾類對(duì)象,定義常量對(duì)象 

一、const修飾基本數(shù)據(jù)類型 

1.const修飾一般常量及數(shù)組  

  const int a=10;               等價(jià)的書寫方式:     int const a=10;
          const int arr[3]={1,2,3};                        int const arr[3]={1,2,3};

對(duì)于類似這些基本數(shù)據(jù)類型,修飾符const可以用在類型說(shuō)明符前,也可以用在類型說(shuō)明符后,其結(jié)果是一樣的。在使用這些常量的時(shí)候,只要不改變這些常量的值便好。  

2.const修飾指針變量*及引用變量&         

介紹本部分內(nèi)容之前,先說(shuō)說(shuō)指針和引用的一些基本知識(shí)。

指針(pointer)是用來(lái)指向?qū)嶋H內(nèi)存地址的變量,一般來(lái)說(shuō),指針是整型,而且一般的大家會(huì)接受十六進(jìn)制的輸出格式。
引用(reference)是其相應(yīng)變量的別名,用于向函數(shù)提供直接訪問(wèn)參數(shù)(而不是參數(shù)的副本)的途徑,與指針相比,引用是一種受限制的指針類型,或者說(shuō)是指針的一個(gè)子集,而從其功能上來(lái)看,似乎可以說(shuō)引用是指針功能的一種高層實(shí)現(xiàn)。

關(guān)于運(yùn)算符&和*:
在C++里,沿襲C中的語(yǔ)法,有兩個(gè)一元運(yùn)算符用于指針操作:&和*。按照本來(lái)的定義,&應(yīng)當(dāng)是取址符,*是指針?lè)簿褪钦f(shuō), &用于返回變量的實(shí)際地址,*用于返回地址所指向的變量,他們應(yīng)當(dāng)互為逆運(yùn)算。實(shí)際的情況也是如此。

在定義變量的引用的時(shí)候,&只是個(gè)定義引用的標(biāo)志,不代表取地址。

舉例:  

 #include<iostream.h>
  void main()
 {
      int a;  //a is an integer
      int *aPtr;  //aPtr is a pointer to an integer
  
     a=7;
     aPtr = &a;
     cout<<"Showing that * and & are inverses of "<<"each other.\n";
     cout<<"a="<<a<<"  *aPtr="<<*aPtr<<"\n";
     cout<<"&*aPtr = "<<&*aPtr<<endl;
     cout<<"*&aPtr = "<<*&aPtr <<endl;
 }

運(yùn)行結(jié)果: 

了解完指針和應(yīng)用的基本概念之后,下面繼續(xù)我們的話題。

const修飾指針(*):

const int* a = & [1]          //非常量數(shù)據(jù)的常量指針    指針常量
int const *a = & [2]          //非常量數(shù)據(jù)的常量指針     a is a pointer to the constant char variable
int* const a = & [3]          //常量數(shù)據(jù)的非常量指針指針常量 常量指針 a is a constant pointer to the (non-constant) char variable
const int* const a = & [4]    //常量數(shù)據(jù)的常量指針

可以參考《Effective c++》Item21上的做法,

如果const位于星號(hào)*的左側(cè),則const就是用來(lái)修飾指針?biāo)赶虻淖兞浚粗羔樦赶驗(yàn)槌A浚?/p>

如果const位于星號(hào)的右側(cè),const就是修飾指針本身,即指針本身是常量。

因此,[1]和[2]的情況相同,都是指針?biāo)赶虻膬?nèi)容為常量,這種情況下不允許對(duì)內(nèi)容進(jìn)行更改操作,如不能*a = 3 ;

[3]為指針本身是常量,而指針?biāo)赶虻膬?nèi)容不是常量,這種情況下不能對(duì)指針本身進(jìn)行更改操作,如a++是錯(cuò)誤的;

[4]為指針本身和指向的內(nèi)容均為常量。   

const修飾引用(&):

 int const &a=x;
   const int &a=x;
   int &const a=x;//這種方式定義是C、C++編譯器未定義,雖然不會(huì)報(bào)錯(cuò),但是該句效果和int &a一樣。   

這兩種定義方式是等價(jià)的,此時(shí)的引用a不能被更新。如:a++ 這是錯(cuò)誤的。   

二、const應(yīng)用到函數(shù)中  

1.作為參數(shù)的const修飾符

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

其實(shí),不論是參數(shù)還是返回值,道理都是一樣的,參數(shù)傳入時(shí)候和函數(shù)返回的時(shí)候,初始化const變量
1修飾參數(shù)的const,如 void fun0(const A* a ); void fun1(const A& a);
 調(diào)用函數(shù)的時(shí)候,用相應(yīng)的變量初始化const常量,則在函數(shù)體中,按照const所修飾的部分進(jìn)行常量化,如形參為const A* a,

則不能對(duì)傳遞進(jìn)來(lái)的指針的內(nèi)容     進(jìn)行改變,保護(hù)了原指針?biāo)赶虻膬?nèi)容;如形參為const A& a,則不能對(duì)傳遞進(jìn)來(lái)的引用對(duì)象進(jìn)行改變,

保護(hù)了原對(duì)象的屬性。
[注意]:參數(shù)const通常用于參數(shù)為指針或引用的情況; 
2修飾返回值的const,如const A fun2( ); const A* fun3( );
這樣聲明了返回值后,const按照"修飾原則"進(jìn)行修飾,起到相應(yīng)的保護(hù)作用。

const Rational operator*(const Rational& lhs, const Rational& rhs)
{
return Rational(lhs.numerator() * rhs.numerator(),
lhs.denominator() * rhs.denominator());
}

返回值用const修飾可以防止允許這樣的操作發(fā)生:

Rational a,b;
Radional c;
(a*b) = c;

一般用const修飾返回值為對(duì)象本身(非引用和指針)的情況多用于二目操作符重載函數(shù)并產(chǎn)生新對(duì)象的時(shí)候。

類中的成員函數(shù):A fun4()const; 其意義上是不能修改所在類的的任何變量。 

三、類中定義常量(const的特殊用法) 

在類中實(shí)現(xiàn)常量的定義大致有這么幾種方式實(shí)現(xiàn): 

1.使用枚舉類型 

class test
{
     enum { SIZE1 = 10, SIZE2 = 20}; // 枚舉常量
     int array1[SIZE1];  
     int array2[SIZE2];
};

2.使用const 

不能在類聲明中初始化const數(shù)據(jù)成員。以下用法是錯(cuò)誤的,因?yàn)轭惖膶?duì)象未被創(chuàng)建時(shí),編譯器不知道SIZE的值是什么。 

  class test
  {
        const int SIZE = 100;     // 錯(cuò)誤,企圖在類聲明中初始化const數(shù)據(jù)成員
        int array[SIZE];          // 錯(cuò)誤,未知的SIZE
  };

正確的使用const實(shí)現(xiàn)方法為:const數(shù)據(jù)成員的初始化只能在類構(gòu)造函數(shù)的初始化表中進(jìn)行。 

class A
 {…
        A(int size);      // 構(gòu)造函數(shù)
        const int SIZE ; 
 };
 A::A(int size) : SIZE(size)    // 構(gòu)造函數(shù)的初始化表
{
      …
}
//error 賦值的方式是不行的
A::A(int size)
{
     SIZE=size;
}
void main()
{
    A  a(100); // 對(duì)象 a 的SIZE值為100
    A  b(200); // 對(duì)象 b 的SIZE值為200
}

注意:對(duì)const成員變量的初始化,不能在變量聲明的地方,必須在類的構(gòu)造函數(shù)的初始化列表中完成,即使是在構(gòu)造函數(shù)內(nèi)部賦值也是不行的。

具體原因請(qǐng)參見(jiàn) 【初始化列表和賦值的區(qū)別】 

3.使用static const 

通過(guò)結(jié)合靜態(tài)變量來(lái)實(shí)現(xiàn):

#include<iostream.h> 
class Year
{ 
private:
 int y; 
public:
 static int const Inity;
public: 
 Year()
 {
  y=Inity;
 }
 };
int const Year::Inity=1997;//靜態(tài)變量的賦值方法,注意必須放在類外定義
void main()
{
 cout<<Year.Inity<<endl;//注意調(diào)用方式,這里是用類名調(diào)用的。
}

到這里就把在類中定義常量的方法都陳列出來(lái)了。 

四、const定義常量對(duì)象,以及常量對(duì)象的用法

class test
{
public:
    test():x(1)
    {
        y=2;
    }
    ~test()
    {}
    void set(int yy)
    {
        y=yy;
    }
    int getx() const
    {
        return x;
    }
//protected:
    const int x;
    int y;
};
void main()
{
 const test t;
 t.set(33);//error
 t.getx();
}

常量對(duì)象只能調(diào)用常量函數(shù),別的成員函數(shù)都不能調(diào)用。 

五、使用const的一些建議  

<1>要大膽的使用const,這將給你帶來(lái)無(wú)盡的益處,但前提是你必須搞清楚原委;
<2> 要避免最一般的賦值操作錯(cuò)誤,如將const變量賦值,具體可見(jiàn)思考題;
<3> 在參數(shù)中使用const應(yīng)該使用引用或指針,而不是一般的對(duì)象實(shí)例,原因同上;
<4> const在成員函數(shù)中的三種用法(參數(shù)、返回值、函數(shù))要很好的使用;
<5>不要輕易的將函數(shù)的返回值類型定為const;
<6>除了重載操作符外一般不要將返回值類型定為對(duì)某個(gè)對(duì)象的const引用; 

參考資料:

(1)繼續(xù)C++——指針,引用和常量限定符const           

http://blog.csdn.net/jarodwen/archive/2006/12/19/1449568.aspx  

(2)C++中const用法總結(jié)                                         

http://lanmh.iteye.com/blog/796410

(3)常量函數(shù)、常量引用參數(shù)、常量引用返回值[C++]    

http://www.cnblogs.com/JCSU/articles/1045801.html

(4)const使用詳解                                                   

http://www.vckbase.com/document/viewdoc/?id=412

(5)c/c++中const用法總結(jié)                               

http://www.newsmth.net/pc/pccon.php?id=10002714&nid=359712

(6)高質(zhì)量C++/C編程指南                                    http://fanqiang.chinaunix.net/a4/b2/20020717/060200270.html

(7) Effective C++筆記—構(gòu)造函數(shù)賦值VS初始化列表  http://blog.csdn.net/lifeisbetter/archive/2009/12/29/5099085.aspx

(8)初始化列表與構(gòu)造函數(shù)內(nèi)賦值

以上就是C++ const的各種用法詳解的詳細(xì)內(nèi)容,更多關(guān)于C++ const用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言圖書借閱系統(tǒng)源碼

    C語(yǔ)言圖書借閱系統(tǒng)源碼

    這篇文章主要為大家分享了C語(yǔ)言圖書借閱系統(tǒng)源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C語(yǔ)言中字符串和數(shù)字的相互轉(zhuǎn)換實(shí)現(xiàn)代碼

    C語(yǔ)言中字符串和數(shù)字的相互轉(zhuǎn)換實(shí)現(xiàn)代碼

    以下是對(duì)C語(yǔ)言中字符串和數(shù)字的相互轉(zhuǎn)換實(shí)現(xiàn)代碼進(jìn)行了分析介紹,需要的朋友可以參考下
    2013-07-07
  • 深入講解Socket原理

    深入講解Socket原理

    這篇文章深入的講解Socket原理,并附帶實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-12-12
  • OpenCV圖像處理之圖像拼接詳解

    OpenCV圖像處理之圖像拼接詳解

    本文主要介紹了如何使用C++?OpenCV實(shí)現(xiàn)圖像景拼接,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定的幫助,感興趣的可以了解一下
    2022-08-08
  • C++引用和指針的區(qū)別你知道嗎

    C++引用和指針的區(qū)別你知道嗎

    這篇文章主要為大家介紹了C++引用和指針的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>
    2022-01-01
  • C++ Eigen庫(kù)實(shí)現(xiàn)最小二乘擬合的示例代碼

    C++ Eigen庫(kù)實(shí)現(xiàn)最小二乘擬合的示例代碼

    Eigen 是一個(gè)線性算術(shù)的 C++ 模板庫(kù),功能強(qiáng)大、快速、優(yōu)雅以及支持多平臺(tái),本文主要為大家介紹了C++利用Eigen庫(kù)實(shí)現(xiàn)最小二乘擬合的示例代碼,希望對(duì)大家有所幫助
    2023-07-07
  • 詳解C++內(nèi)存的代碼區(qū),全局區(qū),棧區(qū)和堆區(qū)

    詳解C++內(nèi)存的代碼區(qū),全局區(qū),棧區(qū)和堆區(qū)

    這篇文章主要為大家介紹了C++內(nèi)存的代碼區(qū),全局區(qū),棧區(qū)和堆區(qū),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • 用C語(yǔ)言實(shí)現(xiàn)單鏈表的各種操作(二)

    用C語(yǔ)言實(shí)現(xiàn)單鏈表的各種操作(二)

    本篇文章是對(duì)用C語(yǔ)言實(shí)現(xiàn)單鏈表的各種操作進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言常用標(biāo)準(zhǔn)頭文件使用實(shí)例

    C語(yǔ)言常用標(biāo)準(zhǔn)頭文件使用實(shí)例

    在C的系列語(yǔ)言程序中,頭文件(通常擴(kuò)展名為.h)被大量使用,它通常包含函數(shù)、變量、結(jié)構(gòu)體等的聲明和定義,以及一些宏定義和類型定義,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言常用標(biāo)準(zhǔn)頭文件使用的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • C++中內(nèi)存池和內(nèi)存分配區(qū)Arena概念詳解

    C++中內(nèi)存池和內(nèi)存分配區(qū)Arena概念詳解

    在 C++ 中,內(nèi)存分配區(qū)(Arena)通常指的是預(yù)先分配的一大塊連續(xù)內(nèi)存空間,這種方法的主要目的是提高內(nèi)存分配和釋放的效率,下面就跟隨小編一起了解一下C++中內(nèi)存池和內(nèi)存分配區(qū)Arena相關(guān)概念吧
    2023-12-12

最新評(píng)論

合江县| 玛曲县| 娱乐| 会宁县| 大理市| 浦江县| 波密县| 获嘉县| 汕头市| 玉林市| 永平县| 南充市| 交口县| 康平县| 宁海县| 绥滨县| 汝城县| 卢氏县| 大石桥市| 武宣县| 石首市| 赤峰市| 合水县| 运城市| 旬邑县| 措美县| 霍城县| 锡林浩特市| 射洪县| 南昌县| 隆尧县| 桂东县| 乌苏市| 呼和浩特市| 黑河市| 绿春县| 莱西市| 山丹县| 汪清县| 南京市| 永顺县|