美文网首页
C++默认拷贝构造函数是浅拷贝

C++默认拷贝构造函数是浅拷贝

作者: dnsir | 来源:发表于2018-11-19 23:12 被阅读15次

1 引言

在C++中,会默认生成一个复制(拷贝)构造函数, 当类中出现指针时, 复制会执行浅拷贝, 即只复制指针的地址, 不会复制数据,所以在类中, 使用指针时需要注意; 如果想使用深拷贝, 可以添加复制构造函数。
提醒:**特别需要注意的是指针二字,因此在C++中要尽量避免使用指针,以前引入由于默认拷贝构造函数是浅拷贝导致的内存管理问题。

2 验证默认复制构造函数是浅拷贝

测试程序

#include <iostream>
using namespace std;

class Foo {
public:
    Foo():_data(nullptr),_len(0){}
    Foo(unsigned int len):_data(new unsigned char (len)), _len(len) {
        // std::copy()
    }
    // 默认是浅拷贝
    unsigned char* get_data() const { return _data;}
    unsigned int get_len() const {return _len;}
private:
    unsigned char* _data;
    unsigned int _len;
};
int main()
{
    Foo a(10);
    std::cout << static_cast<const void*>(a.get_data()) << std::endl;
    std::cout << a.get_len() << std::endl;
    Foo b = a;
    std::cout << static_cast<const void*>(b.get_data()) << std::endl;
    std::cout << b.get_len() << std::endl;
    return 0;
}

程序的输出结果:

0x21c7c20
10
0x21c7c20
1

也就是说a和b的_data指针值是一样,指向的是同一块内存地址,即是浅拷贝。

3 添加深拷贝拷贝构造函数

增加函数:

    Foo(const Foo& f)
    {
        _data = new unsigned char(f.get_len());
        _len = f.get_len();
    }

再次运行结果:

0x130bc20
10
0x130c050
10

发现两次_data的值是不一样,所以这次是深拷贝,C++中定义一段buffer可以使用std::vector<char>数据结构,为了避免std::vector内存频繁变动,可以提前reserve一块内存,提升性能。

相关文章

  • c/c++/c++11 浅拷贝和深拷贝

    目录 1 c++拷贝 1.1 拷贝构造函数1.2 浅拷贝1.3 深拷贝 2 c语言拷贝 2.1 浅拷贝2.2 深拷...

  • [C++之旅] 12 拷贝构造函数

    [C++之旅] 12 拷贝构造函数 拷贝构造函数的特点 如果没有自定义的拷贝构造函数则系统自动生成一个默认的拷贝构...

  • C++ 构造函数,类的成员变量

    c++ 05 构造函数无参构造函数有参构造函数 拷贝构造函数 浅拷贝 深拷贝 类的成员变量 四类特殊的成员变量

  • [C++之旅] 15 深拷贝与浅拷贝

    [C++之旅] 15 深拷贝与浅拷贝 拷贝构造函数分为深拷贝和浅拷贝两种方式 浅拷贝只是将被拷贝的对象的成员直接赋...

  • C++默认拷贝构造函数是浅拷贝

    1 引言 在C++中,会默认生成一个复制(拷贝)构造函数, 当类中出现指针时, 复制会执行浅拷贝, 即只复制指针的...

  • C++语言基础(02)

    1.可变参数 2.构造函数、析构函数、拷贝构造函数 构造函数 拷贝构造函数 //浅拷贝(值拷贝)问题 //深拷贝

  • C++:面向对象基础

    构造函数 C++中有三种构造函数:默认构造函数,有参构造函数,拷贝构造函数 类对象的初始化 括号法//默认构造函数...

  • c++:拷贝构造函数&&深浅拷贝

    默认拷贝构造函数的汇编代码: 其实就相当于这一段代码 拷贝构造函数 多态拷贝构造函数 子类拷贝构造函数调用父类拷贝...

  • 全面梳理 C++ 拷贝构造与赋值运算符重载(operator=)

    本文全面梳理 C++ 的拷贝构造与赋值运算符重载(operator=) 默认拷贝构造函数和赋值运算符 在默认情况下...

  • C++ 拷贝构造函数浅析

    什么是拷贝构造函数:拷贝构造函数,顾名思义,就是在拷贝的时候调用的构造函数。 几个原则:C++ primer p4...

网友评论

      本文标题:C++默认拷贝构造函数是浅拷贝

      本文链接:https://www.haomeiwen.com/subject/zzuzfqtx.html