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;
    }
    
    
  • 相关阅读:
    查看线程
    shiro+多tomcat+redis实现session共享
    win11系统设置笔记本合盖上不休眠
    nvm切换node版本出现乱码 exit status 1:
    nvm安装vuecli
    SQL Server Management 2012 启动错误及解决:Cannot find one or more componets
    SQL Server 2012 连接 Oracle 11gR2 Database
    SQL Server 数据库跨区域时间问题
    SSIS 同步不同数据库的不同两张表
    Reporting Service 不能发送订阅报表的问题
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/12373459.html
Copyright © 2011-2022 走看看