獨(dú)立引用
“引用(reference)”與指針象似但不是指針,。引用主要有3種用法:
-
單獨(dú)使用(一般稱為“獨(dú)立引用”),;
-
作參數(shù)使用,;
-
作返回值使用。
從功能上來(lái)說(shuō),,引用型變量又可以看做事被引用變量的“別名”,這兩個(gè)變量只是名稱不同,,變量的地址是同一個(gè)(共用體中的元素也是一樣),。使用“引用”的好處主要是可以“逆向引用”。
常量也可以被引用,,例如:“const int &ref = 10;”,,這也是正確的,但這樣定義無(wú)任何意義,。定義獨(dú)立引用時(shí)需要注意以下規(guī)則:
-
引用型變量在定義時(shí)必須初始化,。
-
被引用的對(duì)象必須已經(jīng)分配了空間,即不能為空,,或空指針,。
-
被引用的對(duì)象不能為地址,即指針變量、數(shù)組變量等不能被引用,。
變量引用舉例:
- #include <iostream>
- using namespace std;
- int main( )
- {
- int a ;
- int &b = a; //b和a實(shí)際上是同一變量
- b = 100; //b賦值為100,,也就是a賦值為100
- cout << a << endl;
- //a的地址和b的地址應(yīng)該是完全一樣
- cout << &a << endl;
- cout << &b << endl;
- /*-------▼下面代碼有錯(cuò),注釋后才能運(yùn)行▼-----------
- int x[] = {12,15,20} ;
- int &y = x; //錯(cuò)誤:數(shù)組,、指針不能被引用
- int x1;
- int &y1; //錯(cuò)誤:引用時(shí)必須初始化
- y1 = x1;
- -------▲上面代碼有錯(cuò),,注釋后才能運(yùn)行▲-----------*/
- return 0;
- }
輸出結(jié)果:
100
0034F84C
0034F84C
函數(shù)的參數(shù)引用
許多教程在講解參數(shù)引用時(shí)都喜歡選擇交換兩參數(shù)內(nèi)容的swap(int &x, int &y)函數(shù)作例子,這的確很容易說(shuō)明清楚,,但并不能說(shuō)這種用法優(yōu)于指針作參數(shù),。
- #include <iostream>
- using namespace std;
- //|右邊為指針作參數(shù)的代碼,僅作比較用,。
- void swap(int &x, int &y); //|void swap(int *x, int *y);
- //|
- int main ( ) //|
- { //|
- int i = 12; //|
- int j = 25; //|
- cout << "i=" << i << " j=" << j << endl; //|
- //|
- swap(i, j); //|swap(&i, &j);
- cout << "i=" << i << " j=" << j << endl; //|
- //|
- return 0; //|
- } //|
- //|
- void swap(int &x, int &y) //|void swap(int *x, int *y)
- { //|{
- int t; //| int t;
- //|
- t = x; //| t = *x;
- x = y; //| *x = *y;
- y = t; //| *y = *x;
- } //|}
運(yùn)行結(jié)果:
i=12 j=25
i=25 j=12
對(duì)象引用作參數(shù)
初學(xué)者可以先跳過(guò)這一節(jié),,待學(xué)完“類”之后再來(lái)看。
- #include <iostream>
- using namespace std;
- class myclass {
- int who;
- public:
- myclass(int n) {
- who = n;
- cout << "構(gòu)造函數(shù)調(diào)用" << who << endl;
- }
- ~myclass() {
- cout << "析構(gòu)函數(shù)調(diào)用" << who << endl;
- }
- int id() {
- return who;
- }
- };
- void f1(myclass o) { //普通變量方式傳遞參數(shù)
- cout << "外部函數(shù)調(diào)用" << o.id() << endl;
- }
- void f2(myclass *o) { //指針?lè)绞絺鬟f參數(shù)
- cout << "外部函數(shù)調(diào)用" << o->id() << endl;
- }
- void f3(myclass &o) { //引用方式傳遞參數(shù)
- cout << "外部函數(shù)調(diào)用" << o.id() << endl;
- }
- int main ( )
- {
- myclass x1(1);
- f1(x1);
- cout << "-------" << endl;
- myclass x2(2);
- f2(&x2);
- cout << "-------" << endl;
- myclass x3(3);
- f3(x3);
- cout << "-------" << endl;
- return 0;
- }
運(yùn)行結(jié)果:
從上面例子可以看出,,用普通變量方式傳遞參數(shù)時(shí),,函數(shù)首先將參數(shù)復(fù)制一個(gè)副本,在函數(shù)體內(nèi)使用的是副本,。這個(gè)副本和參數(shù)自身不是同一個(gè)地址,。而指針?lè)绞胶鸵梅绞讲⒉划a(chǎn)生副本,函數(shù)體內(nèi)用的真是參數(shù)自身,。需要注意的是,,產(chǎn)生副本時(shí)調(diào)用了類的缺省“拷貝構(gòu)造函數(shù)”,這個(gè)“拷貝構(gòu)造函數(shù)”并不調(diào)用構(gòu)造函數(shù)就產(chǎn)生了一個(gè)副本,,有關(guān)詳細(xì)內(nèi)容參見(jiàn)后面章節(jié),。
作為函數(shù)返回值的引用類型
下面的代碼略有深度,初學(xué)者如果無(wú)法理解請(qǐng)?zhí)^(guò)。請(qǐng)先看下面的程序,,有沒(méi)有問(wèn)題,?
- #include <iostream>
- using namespace std;
- int &f();
- int x;
- int main ( )
- {
- f() = 100;
- cout << x << endl;
- return 0;
- }
- int &f()
- {
- return x;
- }
許多人都認(rèn)為第9句錯(cuò)了,少數(shù)人認(rèn)為第4句可能有問(wèn)題,。事實(shí)上,這個(gè)程序完全正確,。
上面這個(gè)函數(shù)的返回值是引用類型,,通過(guò)函數(shù)結(jié)果的設(shè)置反過(guò)來(lái)去改變“源頭”數(shù)據(jù),這種“逆向引用”為C++增強(qiáng)了很多功能,,當(dāng)然也有許多需要注意的地方,。
由于本教程面向初學(xué)者,因此到此為止,,不再深入下去,,,。
|