二,指針和引用
· 共同點:它們都代表其他變量占據的某一塊內存區,通過指針或引用都可以對他們代表的其他變量進行操作。
·? 以下語句利用指針對變量賦值:
int m;
int *p; //指針定義
p = &m; //將m的內存地址賦給p
*p = 5; // 通過指針對變量m賦值
· 而下面的語句則是利用引用做同樣的事情:
int m;
int &q = m;
q = 5;
·注意上面兩段代碼,&放在等號右側的某個變量前一般是取地址
而在定義變量時,在變量前出現的&符合是引用。
·? 引用只能在定義時被初始化一次,之后不可變;
而指針可變;例如語句 int &q = m 是正確的,但是下面寫法不對:
int &q;
q = m
而且q一旦和m綁定,就不可改變。
而指針不同,指針p可以先指向m,即p = &m;使用完畢后,可以讓p指向其他變量,比如再執行p = &k;
·? 引用不能為空,指針可以空;
因為引用必須再定義時直接初始化,因此引用就不會為NULL,而指針可以是NULL。
可以用指針或引用代表對象
類對象指針和引用的使用
比如:
Account myAccount;
Account &q1 = myAccount; //q1為Account類引用// 可以定義指針p1,讓p1指向myAccount,使用下面語句Account *p1;
p1 = &myAccount;//類對象指針或引用常常出現在函數的參數表或返回值中
· 利用類對象指針實現轉賬函數:
bool transfer(Account *pA,Account *pB,float m)
{if(pA->withdraw(m) == 1) //若A取款成功{pB->deposits(m); //向B存款return ture;}else return false;
}//調用函數時用下面語句:
transfer(&myAccount,&account[0],1000.0);
//相當于執行下面語句:
pA = &myAccount;
pB = &account[0];
//myAccount和account[0]被修改
·? 下面是利用類對象的引用實現轉載函數:
bool transfer(Account &A,Account &B,float m)
{if(A.withdraw(m) == 1) //若A取款成功{B.deposits(m); //向B存款return true;}else return false;
}
//這個函數和第一個版本的差別僅僅在形式參數中,變量A和B是引用類型。調用函數時使用下面語句:
transfer(myAccount,account[0],1000.0);
//相當于執行下面語句:
Account &A = myAccount;
Account &B = account[0];
//myAccount和account[0]被修改
動態創建對象
如果定義了指針后,不想讓指針指向某個已經定義好的對象,那么可以使用動態創建對象的方法為指針生成一個對象。這時要使用C++語言的new操作符:
Account *pA;
pA = new Account; //動態創建Account對象Account *pB;
pB = new Account[10]; //動態創建10個對象
動態創建的對象只能通過指針使用,因為他們沒有其他名字。比如下面語句輸出公有數據成員:
cout << pA->ID << " " << pA->Name;
當動態創建的對象使用完畢后,C++可以動態的刪除前面的動態創建的對象,這需要使用delete此操作:
delete pA; //刪除和pA關聯的動態對象
注意:只有當沒有其他指針(除pA)指向這個動態對象時,delete才能真正刪除動態對象
對象自身的指針this
每個對象都有一個指向直接的指針---this指針。
當一個函數中的局部變量和類對象的數據成員變量同名時,一定要使用this指針。
class Account
{
public:int ID;char Name[20];float balance;void Initial(int ID,char Name[],float balance);.....
};
void Account::Initial(int ID,char Name[],float balance)
{this->ID = ID ; //將傳入的ID賦給當前對象的IDstrcpy(this->Name,Name); //將傳入的Name賦給當前對象的Namethis->balance = balance ; //將傳入的balance賦給當前對象的balance
}
如果不想使用this,則參數表里的變量一定要換個名字,這時局部變量就不會和類的成員重名,不會有二義性。
?