1. 程式人生 > >c++中的常量,常物件,常引用,常指標

c++中的常量,常物件,常引用,常指標

 

 所謂常量是指在程式執行中值始終不可改變的量。而常物件是指他的資料成員在物件的整個生存週期內不能改變。這也意味著不能用常物件去呼叫普通的成員函式,因為有可能會改變常物件的資料成員,所以便有了常成員函式。如果一個物件被宣告為常物件,他只能呼叫常成員函式。普通物件也能呼叫常成員函式,但是會被視為常物件,即不能改變資料成員的值。

  c++中用引用作形參來對實參進行操作而提高效率,但是有時不希望對實參進行更改或者傳遞的是常物件,這時就應該採用常引用的方式。

 常引用宣告方式:const  型別識別符號  &引用名 = 目標變數名;

  • 一旦引用被初始化為一個物件,就不能被指向到另一個物件。指標可以在任何時候指向到另一個物件。
  • 所以不存在引用常量的說法

  用這種方式宣告的引用,不能通過引用對目標變數的值進行修改,從而使引用的目標成為const,達到了引用的安全性。

#include<iostream>
using namespace std;
int main()
{
    int a=10,b=12;
    int const &p=a;//const int &p=a;常量引用,引用是個常量,一旦引用被初始化為一個物件,就不能被指向到另一個物件。
   // p=b;//報錯assignment of read-only reference 'p',p為只讀變數
    //p=a;//也報錯,assignment of read-only reference 'p',反正不能有引用指向的語句
    a=13;
    cout<<p<<endl;//13;值可以改變
    //p=13;
    //cout<<p<<endl;//報錯assignment of read-only reference 'p',不能通過p改變值
    return 0;
}

  常量指標又叫常指標,指的是宣告的一個指標變數是一個常量,不允許發生改變,也就是該指標不能指向其他地址。但是該指標所指的物件是可以發生改變的。

#include<iostream>
using namespace std;
int main()
{
    int a=10,b=12;
    int *const p=&a;//const和int的位置不能互換
    //常量指標,該指標是個常量,顧名思義指標不能指向其他的地址,但指標所指向的地址中的內容可以改變
    a=13;
    cout<<*p<<endl;//13
    *p=15;
    cout<<*p<<endl;//15
  //  p=&b;//報錯指標不能指向其他的地址
    //cout<<*p<<endl;
    return 0;
}

  指向常量的指標,也叫指標常量,顧名思義,該指標變數指向的是一個常量,指標所指的常量不允許改變,但是該指標可以指向其他地址。

#include<iostream>
using namespace std;
int main()
{
    int a=10,b=12;
    int const *p=&a;//等同於const int *p=&a;const和int位置可以互換;
    //指標常量,指向常量的指標,所指地址的內容不能通過指標改變,指標可以改變所指的地址
    a=13;
    cout<<*p<<endl;//13
    a=b;
    cout<<*p<<endl;//12
    //*p=14;//報錯不能通過指標改變值,但可以通過其他方式改變a的值
   //cout<<*p<<endl;
    p=&b;//12
    cout<<*p<<endl;
    return 0;
}
#include<iostream>
using namespace std;
int main()
{

    int const a=13;
    int *p=a;//報錯 invalid conversion from 'int' to 'int*' [-fpermissive]|
    //因為它消除了a的const屬性
    return 0;
}
通過*的位置來記憶
如int * const a = &b; 後面是a,則說明a不能修改!為常量指標
int const * a = &b;後面是*a則說明*a不可被修改!為指標常量