设为首页 加入收藏

TOP

C++拷贝构造函数详解(五)
2012-12-10 12:48:45 来源: 作者: 【 】 浏览:2550
Tags:拷贝 构造 函数 详解

 

  3. 防止默认拷贝发生

  通过对对象复制的分析,我们发现对象的复制大多在进行“值传递”时发生,这里有一个小技巧可以防止按值传递——声明一个私有拷贝构造函数。甚至不必去定义这个拷贝构造函数,这样因为拷贝构造函数是私有的,如果用户试图按值传递或函数返回该类对象,将得到一个编译错误,从而可以避免按值传递或返回对象。

  [c-sharp]

  // 防止按值传递

  class CExample

  {

  private:

  int a;

  public:

  //构造函数

  CExample(int b)

  {

  a = b;

  cout<<"creat: "<<a<<endl;

  }

  private:

  //拷贝构造,只是声明

  CExample(const CExample& C);

  public:

  ~CExample()

  {

  cout<< "delete: "<<a<<endl;

  }

  void Show ()

  {

  cout<<a<<endl;

  }

  };

  //全局函数

  void g_Fun(CExample C)

  {

  cout<<"test"<<endl;

  }

  int main()

  {

  CExample test(1);

  //g_Fun(test); 按值传递将出错

  return 0;

  }

  四. 拷贝构造函数的几个细节

  1. 拷贝构造函数里能调用private成员变量吗

  解答:这个问题是在网上见的,当时一下子有点晕。其时从名子我们就知道拷贝构造函数其时就是一个特殊的构造函数,操作的还是自己类的成员变量,所以不受private的限制。

  2. 以下函数哪个是拷贝构造函数,为什么

  [c-sharp]

  X::X(const X&);

  X::X(X);

  X::X(X&, int a=1);

  X::X(X&, int a=1, int b=2);

  解答:对于一个类X, 如果一个构造函数的第一个参数是下列之一:

  a) X&

  b) const X&

  c) volatile X&

  d) const volatile X&

  且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构造函数.

  [c-sharp]

  X::X(const X&);  //是拷贝构造函数

  X::X(X&, int=1); //是拷贝构造函数

  X::X(X&, int a=1, int b=2); //当然也是拷贝构造函数

  3. 一个类中可以存在多于一个的拷贝构造函数吗

  解答:类中可以存在超过一个拷贝构造函数。

  [c-sharp]

  class X {

  public:

  X(const X&);      // const 的拷贝构造

  X(X&);            // 非const的拷贝构造

  };

  注意,如果一个类中只存在一个参数为 X& 的拷贝构造函数,那么就不能使用const X或volatile X的对象实行拷贝初始化.

  [c-sharp]

  class X {

  public:

  X();

  X(X&);

  };

  const X cx;

  X x = cx;    // error

  如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数。

  这个默认的参数可能为 X::X(const X&)或 X::X(X&),由编译器根据上下文决定选择哪一个。

          

首页 上一页 2 3 4 5 6 7 8 下一页 尾页 5/11/11
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++完美实现Singleton模式 下一篇C++实现链队列的基础操作

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: