C++中Copy Constructor的构造操作

1.会以一个object的内容作为另一个class object的初值的三种基本情况

class X{...};

X x;

第一种: X xx = x;

第二种:值传递给函数  void test(X x);

第三种:作为函数返回类型  X test();


2.什么是Default Memberwise Intialization

当class object以相同class的另一个object作为初值时,其内部是以Default Memberwise Intialization(默认成员逐次初始化)的形式完成的:其实质就是把每一个内建的或者派生的data member的值,从某个object拷贝到另一个object上。遇到member class object,以递归的方式继续施行memberwise initalization


3.如何实现上述操作

被copy constructor实现的


4.copy construtor如何实现

和默认构造一样,c++标准中说,如何class没有声明一个copy construtor,就会有隐式的声明或隐式定义。而c++标准把拷贝构造又分为trival 和nontrival。只有nontrival的实例才会被合成到程序中。决定一个拷贝构造是否为trivial的标准中在于class是否展现bitwise copy semantics(位依次拷贝)。展现位依次拷贝的就不需要合成默认拷贝构造了


5.class不展现出“bitwise copy semantics”的情况(也就是在没有显式定义拷贝构造的情况下,编译器为我们合成默认拷贝构造的情况)

1.当class内含一个member object而后者的class声明有一个copy constructor(此拷贝构造合成的也算)时

2.当class继承自一个base class而后者存在一个copy constructor

3. 当class声明了一个或多个虚函数时

4.当class派生自一个继承串链,其中有一个或者多个virtual base classes时。

(ps :上述四种情况和和合成默认构造函数条件相似,可以参考我的另一篇博文http://write.blog.csdn.net/postlist)


5.应该注意的几点(实例说明)

当编译器导入一个vptr到class中,该class就不再展现bitwise semantics了。

class ZooAnimal

{

  ZooAnimal();

  virtual ~ZooAnimal();

  virtual void animate();

  virtual void draw();

 //...

 private:

   //ZooAnimal的animate()和draw()

  //所需要的数据

}


class Bear : public ZooAnimal

{

  public:

  Bear();

  void animate();

  void draw();

  virtual void dance();

 //...

 private:

//所需要的数据

}


Bear yogi;   yogi会被Bear类默认构造函数初始化,其vptr会被设置为指向Bear class的virtual table

Bear winnie = yogi;

ZooAnimal franny = yogi;   //会发生切割行为franny的vptr会指向ZooAnimal class的虚表




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++ ,拷贝构造函数(Copy Constructor)是一种特殊的构造函数,用于创建一个新对象并将其初始化为同类的另一个对象的副本。拷贝构造函数的原型为: ``` class MyClass { public: MyClass(const MyClass& other); // 拷贝构造函数 // ... }; ``` 其,`other` 是一个同类的对象,拷贝构造函数的作用是将 `other` 的数据成员复制到新创建的对象。 拷贝构造函数可以通过以下方式进行调用: - 当一个对象用另一个对象进行初始化时,就会调用拷贝构造函数; - 当一个函数的参数是一个对象时,也会调用拷贝构造函数; - 当一个函数的返回值是一个对象时,也会调用拷贝构造函数。 需要注意的是,如果类没有定义拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数,它的行为是将一个对象的每个非静态成员变量复制到新对象。但是,如果类有指针成员变量或者资源管理的成员变量,需要手动定义拷贝构造函数,以确保正确的拷贝和释放资源。 下面是一个示例代码,演示了拷贝构造函数的用法: ```c++ #include <iostream> using namespace std; class MyClass { public: int value; MyClass() { // 默认构造函数 cout << "default constructor called" << endl; value = 0; } MyClass(int n) { // 带参数的构造函数 cout << "constructor with int called" << endl; value = n; } MyClass(const MyClass& other) { // 拷贝构造函数 cout << "copy constructor called" << endl; value = other.value; } }; void func(MyClass obj) { // 参数是对象,会调用拷贝构造函数 cout << "value in func: " << obj.value << endl; } MyClass returnObj() { // 返回值是对象,会调用拷贝构造函数 MyClass obj(100); return obj; } int main() { MyClass a(10); // 带参数的构造函数 MyClass b(a); // 拷贝构造函数 MyClass c = b; // 拷贝构造函数 func(c); // 拷贝构造函数 MyClass d = returnObj(); // 拷贝构造函数 return 0; } ``` 在上面的代码,当我们定义对象 `a` 时,使用了带参数的构造函数;当我们定义对象 `b` 和 `c` 时,使用了拷贝构造函数;当我们调用函数 `func` 时,函数参数是一个对象,会调用拷贝构造函数;当我们调用函数 `returnObj` 时,返回值是一个对象,也会调用拷贝构造函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五癫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值