搜尋

首頁  >  問答  >  主體

c++ 构造函数问题

有这样一个构造函数,工作正常,用途就是把参数都放到成员里,

是否有更简洁的写法?

函数内容空着看起来好奇怪。

foo::foo(mytype1 a, mytype2 b, mytypec c) :
m_a(a),
m_b(b),
m_c(c)
{
}
PHP中文网PHP中文网2774 天前408

全部回覆(6)我來回復

  • ringa_lee

    ringa_lee2017-04-17 13:43:42

    沒有什麼簡潔寫法。 。
    一般我都會這麼寫

    foo::foo(t1 a, t2 b, t3 c)
        :m_a(a)
        ,m_b(b)
        ,m_c(c)
    {}

    不像perl6可以直接使用命名參數~~

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:43:42

    據我所知,沒有。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:43:42

    注意建構函式體不是用來初始化的,其實資料成員的初始化是在函式體之前就完成的。

    如果有些資料成員沒有預設建構子的話,你不用初始化列表,在函式體中賦值一定是不行的。

    同樣的還有析構函數,資料成員對應析構函數的呼叫也是在函數體之後完成的。

    當然,這樣寫是有點兒蛋疼,可以讓編譯器支援某種寫法。但是如何相容舊代碼?新的寫法有沒有可能和其他的程式碼形式衝突?新的寫法會不會造成編譯器很大的困難。畢竟如今C++編譯器的前端實作起來已經夠難的了!

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:43:42

    除以下四種情況:

    1. 初始化一個reference member。

    2. 初始化一個const number。

    3. 呼叫一個base class的constructor,而它擁有一組參數時。

    4. 呼叫一個member class的constructor,而它擁有一組參數時。 (From 深度探索C++物件模型)

    使用列表初始化和賦值的效果差不太多。所以如果你不習慣建構函式初始化列表的方式,可以用以下方式初始化:

    foo::foo(mytype1 a, mytype2 b, mytypec c)
    {
        m_a = a;
        m_b = b;
        m_c = c;
    }

    當然要注意開始那四種情況。

    回覆
    0
  • PHPz

    PHPz2017-04-17 13:43:42

    沒有更好的寫法,這是風格~

    很多時候我們都會需要這種寫法,即使是很小的類別。

    class Father
    {
    private:
        class _Son
        {
        public:
            int i1, i2, i3, i4;
        }
    public:
        auto func()
        {
            _Son s;
            s.i1 = ......;
        }
    };

    如果你確實不想那麼麻煩,而這個類別又是private的,那麼你就把它當成C的struct用吧(比如那個_Son),就不用構造函數了,你最好給它標為struct ,也是風格問題;不然,你損失了優雅、風格以及封裝性~後果就是你每次需要這個類型的對象時都要手動給這個類的對象賦值或者寫醜陋的init()方法。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:43:42

    這種方法是用初始化列表對成員進行初始化,如果在結構體內一對成員進行賦值,這個賦值過程是先調用默認構造函數(default),然後在進行賦值,效率不如使用初始化列表高

    回覆
    0
  • 取消回覆