const關鍵字

引言:數據隱藏保護了數據的安全性,同時數據共享又破壞了其安全性,對於既需要共享又需要防止改變的數據而言,這個時候,就應該聲明爲常量。const關鍵字的使用,在以下兩種情況下:

①基本數據類型中,作爲常量。一旦聲明爲常量之後,其值不可改變;

②對象中,作爲常對象。常對象只能訪問常成員函數,常成員函數成爲常對象唯一的對外接口。

一、在基本數據類型中

1.必須初始化:

const int x=5;

const int y;//非法

2.變量—>常量(不可改變):

const int x=5;

int y=0;

……

x=y;//非法(不能再次賦值)

y=x;//合法

 

二、在對象中

1.常對象:只能調用常成員函數

源程序如下

#include "stdafx.h"
#include<iostream>
using namespace std;

//定義類
class R{
public:
 R(int x,int y): x(x),y(y){}
 void print();
 void print() const; //定義常成員函數
private:
 int x,y;
};

//成員函數的實現
void R::print(){
 cout<<"非常對象:"<<x<<" "<<y<<endl;
}

void R::print() const{
 cout<<"常對象:"<<x<<" "<<y<<endl;
}


//主函數
int _tmain(int argc, _TCHAR* argv[])
{
 R r(1,2);
 r.print();//調用的是非常成員函數

 //定義常對象
 const R r1(3,4);
 r1.print();//調用的是常成員函數
 return 0;
}

 

問題:常對象中,爲什麼只能調用常成員函數?

常對象必須進行初始化,而且不能被更新。那麼語法機制是如何保障常對象的數據不被改變呢?改變對象的數據成員有兩種方式:第一,通過對象名訪問成員數據,由於常對象的成員數據都被視爲常量,此時,它不能被再次賦值;第二,通過類的成員函數改變成員數據的值,然而無法預料究竟哪個成員函數會改變成員數據的值,此時,語法只能通過規定了,在常對象中不能訪問普通成員函數。

 

2.常成員數據:只能通過構造函數的初始化列表來初始化其值(而不能是賦值!)

①什麼是構造函數的初始化列表?

class A
{
public:
    int member_var; //成員變量
    A();            //構造函數
}
A::A():member_var(0)
{
}

他們覺得這個構造函數的定義應該只能這樣寫:
A::A()
{
   member_var=1;
}

上爲初始化列表,下面爲另一種構造函數給成員數據的賦值方式

②源程序如下

#include <iostream>
using namespace std;

//定義類
class A{
 public:
 A(int x);
 void print();
 
 private:
 const int a;//定義常成員數據
};

//成員函數的實現
A::A(int x): a(x){}//對於常成員數據,只能通過構造函數的初始化列表來初始化其值(而不能是賦值!)

void A::print(){
 cout<<"常成員數據:"<<a<<endl;
}

 
//主函數
int main()
{
 A aa(1);
 aa.print();
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章