美文网首页
C++拷贝控制

C++拷贝控制

作者: porridgechen890 | 来源:发表于2018-11-28 02:08 被阅读47次

拷贝控制操作(copy control)

拷贝构造函数(copy constructor)、拷贝赋值运算符(copy-assignment operator)、移动构造函数(move constructor)、移动赋值运算符(move-assignment)、析构函数(destructor)。

拷贝构造函数

  • 概念:如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。
    class A {
    public:
        A(const A&);//拷贝构造函数一般长这样
    };
    
  • 作用:将新对象初始化为同类型另一个对象的副本。
  • 合成拷贝构造函数:如果我们从未提供拷贝构造函数,编译器会为我们合成一个,叫合成拷贝构造函数。合成拷贝构造函数会将其参数的非static成员逐个拷贝到正在创建的对象中。内置类型的成员直接拷贝,类类型成员使用其拷贝构造函数来拷贝。

显然合成拷贝构造函数能做的比较有限,如果有成员是指向堆区某块内存的指针,那么在拷贝对象的时候不能简单的把地址复制给新对象,而应该让新对象自己去堆区申请一块同样大小的内存并指向那块内存,然后把旧对象那块内存里的值复制给新对象那块内存。也就是常说的浅拷贝和深拷贝。

  • 直接初始化和拷贝初始化:如果不使用等号初始化一个变量,执行的是直接初始化。如果使用等号,执行的是拷贝初始化。直接初始化是要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。拷贝初始化依靠拷贝构造函数或移动构造函数来完成。
    string dots(10,'.');                    //直接初始化
    string s(dots);                         //直接初始化
    string s2 = dots;                       //拷贝初始化
    string null_book = "9-999-99999-9";     //拷贝初始化
    string nines = string(100, '9');        //拷贝初始化
    
  • 拷贝初始化何时发生:(1)用等号定义变量;(2)将一个对象作为实参传递给一个非引用类型的形参;(3)从一个返回类型为非引用类型的函数返回一个对象;(4)用花括号列表初始化一个数组中的元素或一个聚合类中的成员;(5)初始化标准库容器或是调用其insert或push成员时。
  • 编译器可以绕过拷贝构造函数:在拷贝初始化过程中,编译器可以(但不是必须)跳过拷贝/移动构造函数,直接创建对象。即,编译器允许将下面的代码string null_book = "9-999-99999-9";改写为string null_book("9-999-99999-9");。
  • 练习13.5:给定下面的类框架,编写一个拷贝构造函数,拷贝所有成员。你的构造函数应该动态分配一个新的string,并将对象拷贝到ps指向的位置,而不是拷贝ps本身:
    class HasPtr {
    public:
        HasPtr(const std::string &s = std::string()) :
            ps(new std::string(s)), i(0) { }
    private:
        std::string *ps;
        int i;
    };
    
    class HasPtr {
    public:
        HasPtr(const std::string &s = std::string()) :
            ps(new std::string(s)), i(0) { }
        HasPtr(const HasPtr &orig) {
            ps = new std::string(*(orig.ps));//拷贝ps指向的对象,而不是拷贝指针本身
            i = orig.i;
        }
    private:
        std::string *ps;
        int i;
    };
    

相关文章

  • C++ 拷贝控制(二) — 移动构造函数和移动赋值运算符

    相关文章: C++ 拷贝控制(一) — 析构函数、拷贝构造函数与拷贝赋值函数 C++ 引用类型 — 左值引用、常引...

  • C++拷贝控制

    前言 C++通过在类中定义几个成员函数来控制的对象的拷贝,移动,赋值和销毁,分别如下: 拷贝构造函数和移动构造函数...

  • C++拷贝控制

    拷贝控制操作(copy control) 拷贝构造函数(copy constructor)、拷贝赋值运算符(cop...

  • c++拷贝控制

    拷贝控制 当我们定义一个类的时候,一定要注意类的拷贝控制,这就直接关系到类的内存管理。对于一个类的基本操作有:拷贝...

  • C++ 类的拷贝控制

    拷贝控制 有时候我们需要两个类对象互相关联,当其中一个对象修改后也要关联修改另一个,用这个例子说明拷贝控制的案例。...

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

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

  • C++ 拷贝控制(一) — 析构函数、拷贝构造函数与拷贝赋值函数

    什么是 C++ 的拷贝控制 ? 我们知道在 C++ 当中,类类型是一种由用户自定义的数据类型。既然是数据类型,我们...

  • C++中容易被忽略的基础知识

    const和define的区别C++中static关键字的总结C++中的构造函数及深拷贝浅拷贝c++基础之引用和指...

  • C++拷贝构造函数和友元

    拷贝构造函数和友元 C++控制类对象私有部分的访问,但有时候需要在类的外部访问类的私有成员,这种情况下C++提供了...

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

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

网友评论

      本文标题:C++拷贝控制

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