天天看點

const成員函數總結

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成員函數是可以修改它的

繼續閱讀