默认构造函数(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;
};
补充
非常感谢回答问题的各位,但是感觉没有人回答到点上。这个问题是一个关于类的设计的问题,而不是技术上的问题。
類別的建構子會自動呼叫成員的預設建構子, 如果你可以接受這種行為, 就可以不用特別的去手動呼叫.
比如你的程式碼裡面, 不寫
name("")
其實就等於name()
.我通常只給沒有預設建構函式的成員初始化, 其他的都不會初始化, 比較特別的除外.
一般都要提供預設建構子,如果你要這樣使用你的類別的話:
這只是其中一方面,拋磚引玉一下,看看《effective C++》、《more effective C++》吧!這兩本書將的比較透徹。
對於 build-in 類型,如果你沒有明確地初始化,編譯器會提供一個預設的建構子。
具體可以看下 《深入探索 c++ 物件模型》。
你的問題不在於是否提供預設建構函數,你自己提供的和系統的預設建構函數沒實質差別。
你糾結的是,無參構造函數其實產生了一個初始狀態無效的物件。
1、很多時候,這種暫時的無效狀態沒啥影響,需要呼叫其它函式初始化就是。
2、你也可以定義一個預設建構函數,但是宣告為private,世界就清淨了。
我個人建議方案1,以為很多很多的原因,會導致一個對像很可能狀態是不對的(比如對象持有一個網絡連接,或者對象需要做帳號密碼授權操作,你沒法把所有的工作都放在建構函式裡面去)。只需要相關對應操作的時候對狀態進行判斷即可。