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
  • 相关阅读:
    php类型转换
    PHP标记
    使用PHP从web访问mysql数据库
    javascript string对象的属性与方法
    linux vim 常用命令
    添加事件监听兼容IE6-8
    js-jQuery对象与dom对象相互转换
    js 数组
    js正则表达式
    选择排序
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/10600942.html
Copyright © 2011-2022 走看看