C++的默认构造函数(待确认整理)

Posted stephen-qin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于C++的默认构造函数(待确认整理)的主要内容,如果未能解决你的问题,请参考以下文章

为啥要避免片段中的非默认构造函数?

关于C++默认拷贝构造函数

构造函数调用

默认构造函数的奇怪错误(C++)

C++对象模型探索:什么情况下必须需要默认构造函数

关于 C++ 中默认构造函数的奇怪编译器行为