zoukankan      html  css  js  c++  java
  • 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。
  • 相关阅读:
    nginx 与 lua 开发笔记
    使用openresty + lua 搭建api 网关(一)安装openresty ,并添加lua模块
    Java使用POI接口读写Excel文件方法
    React常用的库安装
    Android手机捉包
    ffmpeg压缩视频
    用 TypeScript 写 React & Redux
    yarn使用
    Angular 组件引入其他css不生效
    Webstrom技巧
  • 原文地址:https://www.cnblogs.com/fengzheng1112/p/4769856.html
Copyright © 2011-2022 走看看