搜尋

首頁  >  問答  >  主體

c++ - 如果类的数据成员没有有意义的初始值,仍需要为类提供默认构造函数吗?

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

我的问题是:

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

提供默认构造函数:

#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;
};

补充

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

阿神阿神2803 天前598

全部回覆(4)我來回復

  • 怪我咯

    怪我咯2017-04-17 13:27:04

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

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

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:27:04

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

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

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

    回覆
    0
  • 迷茫

    迷茫2017-04-17 13:27:04

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

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 13:27:04

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

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

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

    回覆
    0
  • 取消回覆