zoukankan      html  css  js  c++  java
  • C++编译器将自动为类产生四个缺省的函数

     构造函数、析构函数与赋值函数是每个类最基本的函数。它们太普通以致让人容易麻痹大意,

    其实这些貌似简单的函数就象没有顶盖的下水道那样危险。

    每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如:

    A(void); // 缺省的无参数构造函数

    A(const A &a); // 缺省的拷贝构造函数

    ~A(void); // 缺省的析构函数

    A & operate =(const A &a); // 缺省的赋值函数

    这不禁让人疑惑,既然能自动生成函数,为什么还要程序员编写?原因如下:

    <1>如果使用“缺省的无参数构造函数”和“缺省的析构函数”,等于放弃了自主“初始化”和“清除”的机会,C++发明人Stroustrup 的好心好意白费了。

    <2>“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。

    下面以类String 的设计与实现为例,深入阐述被很多教科书忽视了的道理。String的结构如下:

    class String
    
    { 
    
    public:   
    
        String(const char *str = NULL); // 普通构造函数
    
        String(const String &other); // 拷贝构造函数
    
        ~ String(void); // 析构函数   
    
        String & operate =(const String &other); // 赋值函数
    
    private: 
    
        char *m_data; // 用于保存字符串
    
    };

          在C++中当你创建一个空类时,编译器会默认声明一个default构造函数,copy构造函数,一个copy assignment操作符,一个析构函数。注意,编译器只声明,只有当这些函数被调用时,他们才会被创建。

      举个栗子,当你写下

    class Empty() {};

      实际上在编译器中为你实现了这样的代码

      

    复制代码
    class Empty
    {
        Empty(){}
        Empty(const Empty& rhs){}
        ~Empty(){}
        Empty& operator=(const Empty& rhs){}
    };

    参考文章:

    1.http://www.360doc.com/content/15/1021/23/10719243_507436141.shtml

    2.https://www.cnblogs.com/zhaozhaodeboke/p/6567367.html

    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    windows定时任务schtasks命令详细解
    TCP/IP 详解7 Ping指令
    Vue JSX、自定义 v-model
    DOM 元素的循环遍历
    关于 Blob
    Vue.nextTick 的应用解析
    弹窗组件及其回调函数
    krry-transfer ⏤ 基于 element 的升级版穿梭框组件发布到 npm 啦
    防抖与节流 & 若每个请求必须发送,如何平滑地获取最后一个接口返回的数据
    Java 单文件、多文件上传 / 实现上传进度条
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/10600942.html
Copyright © 2011-2022 走看看