• c++ 构造函数


    参考自http://blog.csdn.net/muzi9_17/article/details/6776061和effective c++

    1.默认构造函数

    只要定义了自己的构造函数,编译器就不在自动生成默认构造函数。默认构造函数的主要就是对对象的分配空间,不能进行数据的初始化。而且例如Object (void)和Object(int = 0)都是一样的默认构造函数。这种对基本类型初值的的做法声明即为默认构造函数,哪怕后者有自己定义的操作。所以要自己定义自己的构造函数以完成数据的初始化。

    2.默认复制构造函数

     若用户没有定义拷贝构造函数,则编译器自动添加默认拷贝构造函数(带一个该类类型的参数),称为浅拷贝.所谓浅拷贝http://blog.csdn.net/lwbeyond/article/details/6202256,指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。大多情况下“浅拷贝”已经能很好地工作了,但是一旦对象存在了动态成员,那么浅拷贝就会出问题了。若类中有动态数组等数据类型,浅拷贝就会出问题.所以复制构造函数也要自己定义。

    3.copy assignment operatorl

    如果自己没有定义,则也是系统自动生成,但是在进行自我赋值时候会导致两个指针指向同一个对象,在一个析构后释放内存后,另一个也随之消失。会导致问题。可以引入证同测试。但是不具备异常安全性,因为在进行动态分配内存时候,失败可能出现异常,最终对象会持有一个指针指向一块被删除的内存,这样的指针有害,无法安全进行删除。所以要类似这样,在复制this所指向东西前不要删除this。

    CMyString& CMyString::operator= (const CMyString& str)
    {
     if(this != &str){
      CMyString strTmp(str);

      char* pTmp = strTmp.m_pData;
      strTmp.m_pData = m_pData;
      m_pData = pTmp;
     }

     return *this;

    }//剑指offer代码 创建临时实例接着交换指针 然后退出if时候自动析构临时实例 顺便就把原实例内存释放掉 非常好

    4. copy constructor和copy assignment operator的区别

    http://blog.sina.com.cn/s/blog_48d4d2df010002n9.html

    例如

    Widget w2(w1); // invoke copy constructor
    w1 = w2; // invoke copy
    // assignment operator
    
    当你看到什么东西看起来像一个赋值的话,要仔细阅读,因为 "=" 在语法上还可以被用来调用拷贝构造函数:(怎么我觉得是调用了默认构造函数了呢)
    Widget w3 = w2; // invoke copy constructor!

      幸运的是,拷贝构造函数很容易从拷贝赋值中区别出来。如果一个新的对象被定义(就象上面那行代码中的 w3),一个构造函数必须被调用;它不可能是一个赋值。如果没有新的对象被定义(就象上面那行 "w1 = w2" 代码中),没有构造函数能被调用,所以它就是一个赋值。
    所以应该尽量用自定义构造函数初始化,或者用复制构造函数初始化,因为copy assignment operater 可能要调用一次构造,一次operator。
  • 相关阅读:
    使用Kubeadm安装Kubernetes【单Master节点】
    spark on yarn内存和CPU分配
    spark on yarn提交后vcore数不对
    Win7_64位MyEclipse2015提交mapreduce到CDH5.10.0任务失败
    我对Map端spill的理解
    mapreduce on yarn简单内存分配解释
    namenode无法启动
    全栈编程@luboke.com原创go语言体系课
    基于go语言结合微信小程序开发的微商城系统
    微信小程序登陆流程图时序图
  • 原文地址:https://www.cnblogs.com/fengzheng1112/p/4769856.html
Copyright © 2020-2023  润新知