一、引用
int y;
int& r = y;
const int& q = 12;
規(guī)則:
創(chuàng)建時必須被初始化
一旦初始化指向一個對象,就不能再變?yōu)槠渌麑ο笠?br /> 不能有NULL應用,因為引用是跟一個合法的存儲單元關聯。
指針引用:
如果想改變指針本身,必須傳遞指向指針的指針,可以用指針引用清晰表達
void f(int**);// pointer to pointer
void f(int*&);// reference to poiner
參數傳遞時,一般通過常量引用來傳遞,因為傳遞的中間量都是const的。
二、拷貝構造函數
按值傳遞和按值返回的時候會調用拷貝構造函數,并且按位拷貝。從現有對象創(chuàng)建新對象。創(chuàng)建新對象的時候就應該調用構造函數,并且如果類里面有指針的話,必須要對其控制,防止指向同一內存塊。
class withCC
{
string id;
public:
withCC(const withCC&){}
};
class woCC
{
string id;
public:
woCC(){}
};
class Composite
{
withCC withcc;
woCC wocc;
public:
Composite(){}
};
int main()
{
Composite c;
Composite c1 = c;//調用withCC 和woCC的拷貝構造函數
}
所以在編寫我們自己的拷貝構造函數的時候,最好也要調用成員對象的拷貝構造函數。
指向成員的指針
class Data
{
public:
int a, b, c;
};
int main()
{
Data d, *dp = &d;
int Data::*pmInt = &Data::a;//pmInt 是一個指向Data類中所有int類型的指針,現在初始化為Data類中a的地址。
dp->*pmInt = 46;
pmInt = &Data::b;
d.*pmInt = 48;
}
函數指針:回調函數的基礎
class Widget
{
public:
void f(int) const {}
void g(int) const {}
void h(int) const {}
void k(int) const {}
};
int main()
{
Widget w;
Widget* wp = &w;
void(Widget::*pmem)(int) const = &Widget::h;
(w.*pmem)(1);
(wp->*pmem)(2);
}
類成員指針
class Widget{
private:
void f(int)const{}
void g(int)const{}
void k(int)const{}
void m(int)const{}
void(Widget::*fptr[4])(int)const;
public:
Widget(){
fptr[0] = &Widget::f;//必須寫完整,不能因為在類中而用fptr[0] = f;
fptr[1] = &Widget::g;
fptr[2] = &Widget::k;
fptr[3] = &Widget::m;
}
void select(int i, int j)
{
assert(i >0 && i < 4);
(this->*fptr[i])(j);//必須這么寫,要讓編譯器能判斷,這是一個類成員函數的指針。
}
總結:引用必須和一個存儲單元聯系起來;傳值的時候會使用拷貝構造函數,為了防止位拷貝,最好自己寫拷貝構造函數。為了防止傳值,使拷貝構造函數為私有的,這里有個例子ostream os,不能這么寫,必須傳遞引用。
1
posted on 2012-05-31 17:01
Dino-Tech 閱讀(190)
評論(0) 編輯 收藏 引用