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是對象的常引用,就不可以修改其數據成員的值