c++ 拷贝构造

在C++中,初始化和赋值是两个不同的概念。拷贝构造函数用于初始化时的对象复制,如函数参数传递和返回值。默认的拷贝构造是成员级别的深拷贝,可能涉及递归调用和内存管理问题。如果不想允许对象被复制,可以声明私有的拷贝构造函数,但这会影响对象作为函数参数的使用。Java语言中不存在拷贝构造的概念。编译器有时会进行优化,避免不必要的拷贝构造调用。
摘要由CSDN通过智能技术生成

在c++中,初始化(Initialization)和赋值(assignment)是完全不同的两件事

在c++中,做初始化,用圆括号和用等号是等价的

拷贝构造(copy constructor):

T::T(const T&);

如果没有设置拷贝构造,系统会自动创建一个拷贝构造,该拷贝构造会复制你的每一个成员变量(包括变量、对象、数组等等)。是成员级别的拷贝!!不是字节级别的拷贝!!

memberwise成员级别的拷贝:会调用构造器,复制一份内存数据

bytewise:把所有的数据复制

在复制的时候,如果成员对象有拷贝构造,那么也会调用成员对象的拷贝构造,所以可能会造成递归调用。

如果成员中包含指针变量、引用(reference),则这些指针和reference也会别copy,从而可能会造成变量被修改,而且可能会由于拷贝构造而产生多次析构,造成内存分配问题

T::T(T t) 会造成死循环递归调用拷贝函数,c++编译器会报错

拷贝构造被调用的情况:(初始化,隐藏初始化)

1.函数传参(参数为对象,非指针,非引用)

2.常规初始化 A a = a1; A a(a1);  (不是赋值,而是调用拷贝构造函数)

3.函数返回值

不要依赖编译器提供的默认copy constructor

如果不希望对象被copy,声明一个private copy constructor(初学者不建议,可能会造成很多问题)

如果这样做,那么这个对象不可以作为函数参数(对象的指针或引用可以)

java中没有拷贝构造这件事情

在一些情况下编译器可能对函数进行优化,从而不会调用copy构造()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值