c++ - 如果类的数据成员没有有意义的初始值,仍需要为类提供默认构造函数吗?
阿神
阿神 2017-04-17 13:25:04
0
4
604

默认构造函数(default constructor)常被用于对象的默认初始化或值初始化。

我的问题是:

  • 如果类没有有意义的初始值,仍需要为类提供默认构造函数吗(不会违反类的不变式 class invariant)?

  • 如果不提供默认构造函数,有什么坏的影响?

例如,一个人必须有名字,空字符串并不是一个有意义的名字。

提供默认构造函数:

#include <string>

class Person {
public:
    Person() : name("") {}  // 会导致类的对象存在无效状态
    explicit Person(const std::string &n) : name(n) {}
private:
    std::string name;
};

不提供默认构造函数:

#include <string>

class Person {
public:
    explicit Person(const std::string &n) : name(n) {}
private:
    std::string name;
};

补充

非常感谢回答问题的各位,但是感觉没有人回答到点上。这个问题是一个关于类的设计的问题,而不是技术上的问题。

阿神
阿神

闭关修行中......

全部回覆(4)
刘奇

類別的建構子會自動呼叫成員的預設建構子, 如果你可以接受這種行為, 就可以不用特別的去手動呼叫.
比如你的程式碼裡面, 不寫name("")其實就等於name().

我通常只給沒有預設建構函式的成員初始化, 其他的都不會初始化, 比較特別的除外.

大家讲道理

一般都要提供預設建構子,如果你要這樣使用你的類別的話:

Person persons[100];
std::list<Person> persons(100);
// 这里两行都会报错,因为没有默认构造函数。。。
// 以及很多STL容器、算法都要求,被使用类有默认构造函数

這只是其中一方面,拋磚引玉一下,看看《effective C++》、《more effective C++》吧!這兩本書將的比較透徹。

迷茫

對於 build-in 類型,如果你沒有明確地初始化,編譯器會提供一個預設的建構子。
具體可以看​​下 《深入探索 c++ 物件模型》。

左手右手慢动作

你的問題不在於是否提供預設建構函數,你自己提供的和系統的預設建構函數沒實質差別。

你糾結的是,無參構造函數其實產生了一個初始狀態無效的物件。
1、很多時候,這種暫時的無效狀態沒啥影響,需要呼叫其它函式初始化就是。
2、你也可以定義一個預設建構函數,但是宣告為private,世界就清淨了。

我個人建議方案1,以為很多很多的原因,會導致一個對像很可能狀態是不對的(比如對象持有一個網絡連接,或者對象需要做帳號密碼授權操作,你沒法把所有的工作都放在建構函式裡面去)。只需要相關對應操作的時候對狀態進行判斷即可。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板