c++包含关系-总是需要初始化列表

C++ contains relationship - always need initializer list?

本文关键字:初始化 列表 包含 关系 c++      更新时间:2023-10-16

如果我想要一个对象包含另一个对象(一个"has-a"关系)。所包含的对象必须总是在初始化列表中创建吗?我想避免使用指针。如果我知道我必须使用初始化列表,那就没问题。

#include <iostream>
class A 
{
    private:
        int ii;
    public:
        A(int anIi): ii(anIi) {};
        int GetBilly() {return ii;}
        void billy() 
        { 
            for (int jj = 0; jj < ii; ++jj) 
            {
                std::cout << "Billy!" << std::endl;
            }
        }
}; 
class B {
    private:
    public:
        A mya;
        B(int wantIi): mya(A(wantIi)) {
        }
        void snoodly() {
            int ii = mya.GetBilly();
            for (int jj = 0; jj < 2*ii; ++jj)
            {
                std::cout << "Silly!" << std::endl;
            }
        }
};
int main () {
    B myB = B(5);
    myB.snoodly();
    myB.mya.snerdly();
    return 0;
}

不尽然。

包含对象(CO)可以通过默认初始化、类成员声明初始化器或构造函数初始化器列表创建。如果CO没有默认构造函数或不需要默认值,则需要后两者。

如果在构造容器时CO的值是已知且可用的,则可以方便地将CO初始化为该值。

如果没有,则完全可以通过上述一种机制将CO初始化为无害的默认值,然后根据它所支持的内容,通过赋值或方法调用来设置其值。

所以我的回答是:不完全是,尽管它可能相当方便。

如果类没有默认构造函数,则必须使用mem初始化列表初始化相应的对象。或者您可以在类定义中初始化该对象。