引言:數據隱藏保護了數據的安全性,同時數據共享又破壞了其安全性,對於既需要共享又需要防止改變的數據而言,這個時候,就應該聲明爲常量。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;
}