C++08 copy ctor

拷贝构造

  • 在C++初始化一个变量 = 和()等价 就像 Howmany h2(10) 等价于 Howmany h2 = 10;
  • 拷贝构造: 如果有一个构造函数,这个构造函数它的参数是自己那个class的一个 const reference, 这个构造函数就可以在做这种类型的初始化的时候被调用。(就是初始化这个对象的时候,用另外一个这个class的对象来初始化)

在这里插入图片描述
上面这样写是正确的,意味着在传参数过程中不会发生拷贝构造,因为并没有在这个函数里面制造出一个新的对象出来。只是把外面那个对象的reference传进了copy constructor。所以这样做是安全的

HowMany(HowMany o){object ++; print("HowMany(HM)")}

如果这样写的话会error,因为这意味着当我要去调这个拷贝构造的时候,我要传一个参数给这个拷贝构造函数,我传进去的参数需要一次拷贝构造,于是就递归了且没有出来的条件。

在这里插入图片描述

如果没有给拷贝构造,C++会自动给你。如果给了,可以自己控制怎么去做拷贝

这里不是字节对字节的拷贝, 是member对member的拷贝。不过如果member全都不是对象,那么最终结果和字节拷贝是一样的

如果成员有其他class的对象的话,它一定会调用哪个class的copy constructor,如果那个class自己没有copy constructor,那么就会一步步下去。

copy pointer:两个指针指向同一个内存
copy reference 两个reference捆绑着同一个变量。

如果类里面有指针会发生什么?

在这里插入图片描述

在这个过程当中,某个person类对象里面会有一个指针指向某一处的字符串,如果没有写自己的拷贝构造,那么编译器自动给你的那个拷贝构造就会去做 成员变量 copy,在这个过程中,新的那个对象的指针就会和老的那个对象的指针是相同的。指向的是同一个东西,如下图左这样,不过左边是有问题的,我们希望实现的是右边的。

在这里插入图片描述

的 电动车

private是针对类而不是对象,访问同类对象的private的东西是完全可以的

什么时候这样的拷贝构造会被调用呢?下图

在这里插入图片描述

  1. 第一种地方就是调用一个函数的时候,那个函数参数是一个对象本身而不是 const reference or pointer,这就意味着,在调用这个函数的时候要重新创建一个新的person类的对象(如上图), 这个时候就会发生copy constructor。因为要用某个对象去初始化这个player。总的来说 拷贝构造发生的时候就是初始化的时候

在这里插入图片描述

在这里插入图片描述

**当函数返回一个对象如上图,在这个过程发生拷贝构造, **optimize 优化

  • List item

编译器会把它认为不必要的拷贝优化掉(optimize out)

在这里插入图片描述

  • 第二个函数:里面直接制造了一个person的对象, 没有在这个函数里面去使用这个对象。然后直接把制造出来的这个对象返回出去了。制造这个Person不是通过copy constructor, Person的参数是char*。 大多数的编译器这个时候就会把这个copy constructor optimisize out;因为它说你不需要了。

在这里插入图片描述

  • 初始化与assignment的区别。任何对象只能被初始化一次。做完之后再对它做任何动作就是assignment而是不initial。
Person p = p1; // 初始化
p = p1 //assignment,只要前面2定义就是assignment

在这里插入图片描述

string是一个类,用来表达字符串的。char*不是C++的字符串是C的字符串。如果name是string类型的,就可以不需要写copy constructor.default copy constructor处理不好指针的问题,所以必须有个自己的 copy ctor 来处理pointer问题, 但是如果成员变量是string类型的(compiler 做的 copy ctor是member variable copy ), 所以它碰到member是一个string的member,会对member做一个string 的拷贝构造,因为string有拷贝构造的函数,所以能处理好。

在这里插入图片描述

上图:如果不希望被拷贝,申明一个private。然后拷贝构造是私有的,意味着别人没法拷贝构造你的对象了。意味着不可能设计一个函数的参数是这个类型的对象本身,只能是reference或者pointer

你写了一个类,就为这个类写一个拷贝构造,
good advice:一旦写了个类一定要给它三个函数:default constructor(构造函数), virtual constructor, copy constructor。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值