C++(八)拷贝构造器

简介: 拷贝构造器用于根据已存在的对象创建新对象。其格式固定,系统提供默认的浅拷贝构造器。浅拷贝仅复制指针而非指针指向的对象,适用于所有数据位于栈上的情况;若类中包含堆数据,则需自定义深拷贝以避免多次析构问题。拷贝构造器在对象复制、作为参数或返回值时被调用。示例展示了拷贝构造器的应用及浅拷贝与深拷贝的区别。

拷贝构造器

copy constructor 拷贝构造器

由己存在的对象,创建新对象。也就是说新对象,不由构造器来构造,
而是由拷贝构造器来完成。拷贝构造器的格式是固定的。
系统提供了默认的拷贝构造器

语法定义

class 类名
{
    类名(const 类名 & another)
    拷贝构造体
}

构造特性:

  1. 系统提供默认的拷贝构造器。一经实现,不复存在。
  2. 系统提供的是等位拷贝,也就是所谓的浅拷贝。

    shallow copy:是指拷贝了指针,但不拷贝指针指向的对象。 如果对象中不含有堆上的空间(*),浅拷贝可以满足需求

    深拷贝deep copy:是指拷贝了指针,并且拷贝了指针指向的对象。如果对象中含有堆上的空间(*),深拷贝必须要自定义。

  3. 要实现深拷贝,必须要自定义。
  4. 发生时机:制作对象的副本,以对象作为参数和返回值。

shallow/deep 拷贝

系统提供默认的拷贝构造器,一经定义不再提供。但系统提供的默认拷贝构造器是
等位拷贝,也就是通常意义上的浅(shallow)拷贝。
如果类中包含的数据元素全部在栈上,浅拷贝也可以满足需求的。
但如果堆上的数据,则会发生多次析构行为。

数据包含在栈上的空间,必须要自实现拷贝构造,达到深
拷贝的目的,不然则会造成重析构,double free 的现象。

浅拷贝:
img_2.png

深拷贝:
img_3.png

应用场景

//
// Created by gopher on 24-7-28.
//
#include <iostream>
using namespace std;//无论普通构造器,还是拷贝构造器,均是生成新对象。
class A
{
public:
    A() {
        cout<<"constructor"<<endl;
    }
    ~A(){
        cout<<"destructor"<<endl;
    }
    A(const A & another){
        cout<<"copy constructor"<<endl;
    }
};

int main(int argc, char *argv[])
{
    A a;
    //A b(a);
    A b=a;//相同,调用的拷贝构造
    return 0;
}

输出:
constructor
copy constructor
destructor
destructor
//
// Created by gopher on 24-7-28.
//
#include <iostream>
using namespace std;//无论普通构造器,还是拷贝构造器,均是生成新对象。
class A
{
public:
   A() {
   cout<<"constructor"<<endl;
   }
   ~A(){
   cout<<"destructor"<<endl;
   }
   A(const A & another){
   cout<<"copy constructor"<<endl;
   }
};
void func(A a)  //传值调用拷贝构造   会发生两次析构  ,,;void func(A& a)传递引用则不会,引用的a作用域扩展到了func函数
{
}
int main(int argc, char *argv[])
{
   A a;
   //A b(a);
   //A b=a;//相同,调用的拷贝构造
   func(a);//func这种传参调用了拷贝构造


   return 0;
}

输出:
constructor
copy constructor
destructor
destructor
相关文章
|
8天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
36 4
|
4月前
|
存储 编译器 C++
【C++】详解拷贝构造
【C++】详解拷贝构造
|
6月前
|
编译器 C++ 容器
【C++11特性篇】探究【右值引用(移动语义)】是如何大大提高效率?——对比【拷贝构造&左值引用】
【C++11特性篇】探究【右值引用(移动语义)】是如何大大提高效率?——对比【拷贝构造&左值引用】
|
存储 编译器 C++
【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载
【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载
53 0
【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载
|
6月前
|
C++
C++中拷贝构造会出现的情况
C++中拷贝构造会出现的情况
32 3
|
6月前
|
编译器 C++ 索引
【C++类和对象】拷贝构造与赋值运算符重载(下)
【C++类和对象】拷贝构造与赋值运算符重载
|
6月前
|
存储 编译器 C++
【C++类和对象】拷贝构造与赋值运算符重载(上)
【C++类和对象】拷贝构造与赋值运算符重载
|
6月前
|
数据安全/隐私保护 C++
C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造
C++中的构造函数是特殊成员函数,用于对象初始化。类型包括默认构造函数(无参数)、带参数构造函数、拷贝构造函数和移动构造函数。默认构造函数设置对象默认状态,带参数构造函数允许传递初始化值。拷贝构造函数复制已有对象,移动构造函数高效转移资源。构造函数的访问权限可控制为public、private或protected。理解构造函数有助于编写健壮的C++代码。关注公众号`Let us Coding`获取更多内容。
92 0
|
存储 编译器 C语言
【C++基础】类与对象(中):默认成员函数、构造函数、析构函数、拷贝构造、赋值重载函数……
【C++基础】类与对象(中):默认成员函数、构造函数、析构函数、拷贝构造、赋值重载函数……
86 0
|
编译器 C++
【C++基础(六)】类和对象(中) --拷贝构造,运算符重载(下)
【C++基础(六)】类和对象(中) --拷贝构造,运算符重载(下)