zoukankan      html  css  js  c++  java
  • 拷贝构造函数和深拷贝例子

    1.拷贝构造函数也是一个构造函数,用来构造对象,只有在对象定义时起作用,其第一个参数是自身类型的引用,其他任何参数均带有默认值.(如果第一个参数不是引用类型,因为构造拷贝对象时必须调用拷贝构造函数,那么连拷贝构造函数都必须调用拷贝构造函数,结果可想而知,调用永远也不会成功)

    2.如果我们没有为一个类定义一个拷贝构造函数,编译器会为我们定义一个,称之为:合成的拷贝构造函数,即使我们已经定义了其他构造函数,编译器还是会为我们合成一个拷贝构造函数。

    3.拷贝构造函数定义了将一个对象赋予另一个同类型对象时的操作,即逐个拷贝(非static)数据成员,

    4.调用拷贝构造函数的情况:

    (1)用 = 定义一个对象

    (2)将一个对象作为实参传递个一个非引用类型的对象

    (3)从一个返回类型为非引用类型的函数返回一个对象

    (4)用花括号初始化一个数组中的元素或一个聚合类中的成员

    5.编译器有时会绕过拷贝构造函数,以提高程序运行效率。

    6.当类成员中有指针类型时,最好用深拷贝,下面这个程序即为例子(在存在指针成员函数的类中,拷贝构造函数如果是简单拷贝指针的值则为浅拷贝,如果重新为该指针分配一块等值的内存则为深拷贝):

    #include <iostream>
    using namespace std;
    
    class Cstr{
    public:
    int *a;
    Cstr()
    {
    a = new int [3];
    a[0] = 1;
    a[1] = 2;
    a[2] = 3;
    }
    
    Cstr(const Cstr& str)
    {
    //a = str.a;                //浅拷贝,指针成员共用内存(析构函数会重复释放同一块内存,造成程序崩溃)
    this->a = new int[3];
    /*this->a[0] = str.a[0];                //深拷贝,为指针成员重新申请内存
    this->a[1] = str.a[1];
    this->a[2] = str.a[2];*/
    memcpy(this->a, str.a, 12);                        //内存内容复制(目的空间,源空间,空间大小)
    }
    ~Cstr()
    {
    delete[] a;
    }
    };
    
    int main()
    {
    {
    Cstr st;
    cout << st.a[0] << " " << st.a[1] << " " << st.a[2]<< endl;
    cout << st.a << endl;
    Cstr at = st;
    cout << at.a[0] << " " << at.a[1] << " " << at.a[2] << endl;
    cout << at.a << endl;
    }
    Cst st;
    *p = new Cst(st);  //也会调用拷贝构造函数
    system("pause");
    return 0;
    }
    
    
  • 相关阅读:
    URAL 2034 : Caravans (二分最短路)
    Qt程序的字符编码方式
    Qt程序国际化
    Qt5 + msvc2015编译器 环境配置 (不安装VS)
    error: undefined reference to `Dialog::on_pushButton_clicked()'在程序代码的后台程序代码出现问题
    Qt的inherits()函数判断qt控件是否为某个类实例
    WPS使用书签跳转到指定的文档位置
    Qt error ------ 出现Error
    环境名词
    source insight 联想出Qt库函数
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/12373459.html
Copyright © 2011-2022 走看看