const 成員函數:
類的成員函數後面加 const,表明這個函數不會對這個類對象的資料成員(準确地說是非靜态資料成員)作任何改變。
在設計類的時候,一個原則就是對于不改變資料成員的成員函數都要在後面加 const,而對于改變資料成員的成員函數不能加 const。
是以 const 關鍵字對成員函數的行為作了更加明确的限定:有 const 修飾的成員函數(指 const 放在函數參數表的後面,而不是在函數前面或者參數表内),隻能讀取資料成員,不能改變資料成員;沒有 const 修飾的成員函數,對資料成員則是可讀可寫的。
準确的說const是修飾this指向的對象的,
例如:
class A
{
public:
fun(int);
};
這裡fun函數其實有兩個參數,第一個是A*const this, 另一個才是int類型的參數,如果我們不想fun函數改變參數的值,可以把函數原型改為fun(const int),但如果我們不允許fun改變this指向的對象呢?因為this是隐含參數,const沒法直接修飾它,就加在函數的後面了,const修飾*this是本質,至于說“表示該成員函數不會修改類的資料。否則會編譯報錯”之類的說法隻是一個現象,根源就是因為*this是const類型的。
通過程式執行個體來說明const成員函數的特性(分析見程式):
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
Student(string str=NULL,double sco=0.0);
void set_student(string str,double sco);
string get_name() const;
double get_score() const;
void display();
void display() const;//加入const的成員函數可以與不加const的同名函數重載
private:
string name;
double score;
};
Student::Student(string str,double sco)
{
name=str;
score=sco;
}
void Student::set_student(string str,double sco)//需要改變資料成員,不能加const
{
name=str;
score=sco;
}
string Student::get_name() const//不需要改變資料成員,一般要加const
{
return name;
}
double Student::get_score() const//不需要改變資料成員,一般要加const
{
return score;
}
void Student::display()
{
cout<<"調用非const:"<<endl;
cout<<"name:"<<name<<",score:"<<score<<endl;
}
void Student::display() const
{
cout<<"調用const:"<<endl;
cout<<"name:"<<name<<",score:"<<score<<endl;
}
void display(const Student &stu)//外部函數:如果對象非cons型,則不管get_name()與get_socre()函數是否為const成員函數,都可以調用,
// 如果對象為const型,則get_name()與get_socre()函數必須為const成員函數
{
cout<<"外部函數:"<<endl;
cout<<"name:"<<stu.get_name()<<",score:"<<stu.get_score()<<endl;
}
int main()
{
Student stu1("lanzhihui",89.1);
stu1.display();//如果存在非const型的成員函數,則調用非const型的成員函數
//如果隻存在const型的成員函數,則調用const型的成員函數
stu1.set_student("wangdan",19.9);
stu1.display();
const Student stu2("wangqian",19.3);
stu2.display();//必須調用const型的成員函數
display(stu1);
display(stu2);
system("pause");
return 0;
}
小節:
a.const對象隻能通路const成員函數,而非const對象可以通路任意的成員函數,包括const成員函數.
b.const對象的成員是不可修改的,然而const對象通過指針維護的對象卻是可以修改的.
c.const成員函數不可以修改對象的資料,不管對象是否具有const性質.它在編譯時,以是否修改成員資料為依據,進行檢查.
d.作為一種良好的程式設計風格,在聲明一個成員函數時,若該成員函數并不對資料成員進行修改操作,應盡可能将該成員函數聲明為const 成員函數。
e.然而加上mutable修飾符的資料成員,對于任何情況下通過任何手段都可修改,自然此時的const成員函數是可以修改它的