C++對象的常引用


1直接傳遞對象名

用對象名傳遞函數參數時候,在函數調用時將建立一個新的對象,他是形參對象的拷貝

例如:

#include<iostream>

using namespace std;

class Time

{

public:

Time(int,int,int);

void Print();

void reset(Time &t);

private:

int year;

int month;

int day;

};

Time::Time(int y,int m,int d)

{

year = y;

month=m;

day=d;

}

void Time::Print()

{

cout<<year<<"/"<<month<<"/"<<day<<endl;

}

void Time::reset(Time t)

{

t.year = 0;

t.month=0;

t.day=0;

}

int main()

{

Time t1(12,12,12);

t1,Print();

t1.reset(t1);

t1.Print();

return 0;

}

輸出結果:

12/12/12

12/12/12

reset函數並沒有起到作用

實參把值傳遞給形參,二者分別占用不同的存儲空間。無論形參是否修改都改不到實參的值。這種形式的虛擬結合,要產生實參的拷貝,當對象的規模比較大的時候,則時間開銷和空間開銷都可能很大。

形參為引用的對象

如果形參為對象的引用名,實參為對象名,則在調用函數進行虛實結合時,並不是為形參另外開辟一個存儲空間(常稱之為建立實參的拷貝),而是把實參的地址傳給形參(引用名),這樣引用名也指向實參變量。

例如上面的代碼可以改成:

#include<iostream>

using namespace std;

class Time

{

public:

Time(int,int,int);

void Print();

void reset(Time &t);

private:

int year;

int month;

int day;

};

Time::Time(int y,int m,int d)

{

year = y;

month=m;

day=d;

}

void Time::Print()

{

cout<<year<<"/"<<month<<"/"<<day<<endl;

}

void Time::reset(Time& t)

{

t.year = 0;

t.month=0;

t.day=0;

}

int main()

{

Time t1(12,12,12);

t1,Print();

t1.reset(t1);

t1.Print();

return 0;

}

輸出結果:

12/12/12

0/0/0

3形參為對象的常引用

在函數中只能使用對象t中的數據成員和成員函數,而不能修改其中的成員函數,也就是不能修改其對應的參數中的數據成員的值。

上面的代碼可以改成:

#include<iostream>

using namespace std;

class Time

{

public:

Time(int,int,int);

void Print();

void reset(Time &t);

private:

int year;

int month;

int day;

};

Time::Time(int y,int m,int d)

{

year = y;

month=m;

day=d;

}

void Time::Print()

{

cout<<year<<"/"<<month<<"/"<<day<<endl;

}

void Time::reset(const Time& t)

{

//t.year = 0;

//t.month=0;

//t.day=0;

}

int main()

{

Time t1(12,12,12);

t1,Print();

t1.reset(t1);

t1.Print();

return 0;

}

輸出結果:

12/12/12

12/12/12

既然聲明了t是對象的常引用,就不可以修改其數據成員的值

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM