随笔 - 55  文章 - 15  trackbacks - 0
<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

一、引用
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(intconst {}
  void g(intconst {}
  void h(intconst {}
  void k(intconst {}
};

int main()
{
Widget w;
Widget* wp = &w;
void(Widget::*pmem)(intconst = &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 阅读(184) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理