二、類(lèi)的引用
在函數(shù)參數(shù)和返回值中,如果一定要使用傳值方式,那么使用類(lèi)對(duì)象的引用,是一個(gè)提高效率的方法。
類(lèi)的數(shù)據(jù)成員也可以是一個(gè)引用,但必須注意:第一,一個(gè)引用必須初始化。通常一個(gè)類(lèi)對(duì)象并不會(huì)像結(jié)構(gòu)那樣用大括號(hào)來(lái)初始化,而是調(diào)用構(gòu)造函數(shù)。因此在構(gòu)造函數(shù)里必須初始化類(lèi)當(dāng)中的引用成員。第二,引用是一個(gè)別名。盡管類(lèi)里面的引用在使用方式上看起來(lái)和類(lèi)的一般數(shù)據(jù)成員沒(méi)有什么區(qū)別,但是作用在其上的操作,實(shí)際上是對(duì)用來(lái)初始化它的那么對(duì)象進(jìn)行的。
#include iostream.h
class Date
{
int da, mo, yr;
public:
Date(int d,int m,int y)
{ da = d; mo = m; yr = y; }
void Display() const
{ cout << da << '/' << mo << '/' << yr; }
};
class Time
{
int hr, min, sec;
public:
Time(int h, int m, int s)
{ hr = h; min = m; sec = s; }
void Display() const
{ cout << hr << ':' << min << ':' << sec; }
};
class DateTime
{
const Date& dt;
const Time& tm;
public:
DateTime(const Date& d, const Time& t) : dt(d), tm(t)
{
//empty
}
void Display() const
{
dt.Display();
cout << ' ';
tm.Display();
}
};
int main()
{
Date today(7,4,2004);
Time now(15,20,0);
DateTime dtm(today, now);
dtm.Display();
return 0;
}
我們來(lái)看看這個(gè)程序中DateTime的構(gòu)造函數(shù)的格式:冒號(hào)操作符引出了一個(gè)參數(shù)初始化表。必須使用這種格式來(lái)初始化引用數(shù)據(jù)成員,而不可以在函數(shù)體內(nèi)來(lái)進(jìn)行初始化工作。如果構(gòu)造函數(shù)像上例一樣不是內(nèi)聯(lián)的,那么最好不要在類(lèi)聲明中構(gòu)造函數(shù)的原型上使用冒號(hào)和初始化值表,而是像下面這樣,把參數(shù)初始化表放在定義構(gòu)造函數(shù)的地方:
Class DateTime
{
const Date& dt;
const Time& tm;
public:
DateTime(const Date& d,const Time& t);
}
DateTime::DateTime(const Date& d,const Time& t):dt(d),tm(t)
{
//empty
}
可以使用構(gòu)造函數(shù)的參數(shù)初始化表來(lái)初始化任何數(shù)據(jù)成員。特別是常量數(shù)據(jù)成員,和引用一樣,只能在參數(shù)初始化表里進(jìn)行初始化,這是因?yàn)椴豢梢栽跇?gòu)造函數(shù)內(nèi)部為常量數(shù)據(jù)成員賦值。
當(dāng)一個(gè)類(lèi)含有引用數(shù)據(jù)成員時(shí),一旦引用被實(shí)例化和初始化以后,就無(wú)法修改它的值,所以該類(lèi)不可能徹底地重載賦值運(yùn)算符函數(shù)。
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專(zhuān)題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |