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;
    }
    

      

  • 相关阅读:
    Java 位运算(移位、位与、或、异或、非)
    负数的二进制表示方法(正数:原码、负数:补码)
    MacOS X终端里SSH会话管理
    Mac软件分享:上小巧实用的GIF格式录屏软件 LICEcap
    问题追踪:ImageView执行缩放动画ScaleAnimation之后,图像显示不全的问题。
    自定义res/anim加载类,加载自定义Interpolator
    原文翻译 Android_Develop_API Guides_Animation Resources(动画资源)
    OAuth2.0详解
    Grails框架使用指南
    Groovy语言学习汇总
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/9412269.html
Copyright © 2011-2022 走看看