簡體   English   中英

object 構造 [c++]

[英]object construction [c++]

我有這個 class:

class A {
    B b;
    // snip.
}

只要 B 有一個不使用 arguments 或默認構造函數的構造函數,這將正常工作。

但是,如果需要將B構造成B(x),代碼應該如何修改。 一種明顯的方法是使用 new/delete 和 B* 但我很好奇是否可以不使用動態 memory?

使用member-initialization-list將成員變量初始化為:

class A {
    B b;
    C c;
public:

    A() : b(10){}   //if B's constructor takes int, for example!

    //Or
    A(T x) : b(x), c(x) {} 
         //^^^^^^^^^^^^ this is called member-initialization-list
}

new / delete無濟於事。 您要么需要 A 的構造函數...

A::A(X x) : b(x) { }

...或使用結構初始化...

A a = { B(x) };

兩種可能:

在 A 的構造函數中使用初始化列表

A::A(int x):b(x)
{

}

或者,如果不能直接在A的構造函數中構造b,則需要有一個指針

class A
{
  B * b;
}

一種明顯的方法是使用 new/delete 和 B* 但我很好奇是否可以不使用動態 memory?

通常,您也可以使用指針或向 class B 添加一個構造函數,以便它可以傳遞參數來初始化 object A,正如許多答案已經提到的那樣。

但在某些特殊情況下,您可能能夠在不向 class B 添加構造函數且沒有指針的情況下逃脫,而是在 class B 未定義構造函數時通過值初始化

struct B{
int i;
};

struct A{
    B b;
};

int main()
{
    A a ={1}; //here i being initialized to 1
} 

請注意我不推薦這個值初始化,只是為了讓你知道object可以用這種方式初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM