一、引用
int y;
int& r = y;
const int& q = 12;
规则:
创建时必须被初始化
一旦初始化指向一个对象,就不能再变为其他对象引用
不能有NULL应用,因为引用是跟一个合法的存储单元关联。
指针引用:
如果想改变指针本身,必须传递指向指针的指针,可以用指针引用清晰表达
void f(int**);// pointer to pointer
void f(int*&);// reference to poiner
参数传递时,一般通过常量引用来传递,因为传递的中间量都是const的。
二、拷贝构造函数
按值传递和按值返回的时候会调用拷贝构造函数,并且按位拷贝。从现有对象创建新对象。创建新对象的时候就应该调用构造函数,并且如果类里面有指针的话,必须要对其控制,防止指向同一内存块。
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 阅读(185)
评论(0) 编辑 收藏 引用