C++;集合类 我是自学C++的。 如果你制作一个类,它只有一个成员变量,是“X”对象的集合(不管X是什么),那么仅仅有一个默认构造函数和解构器就足够了吗?它仅仅处理一个对象集合吗?谢谢

C++;集合类 我是自学C++的。 如果你制作一个类,它只有一个成员变量,是“X”对象的集合(不管X是什么),那么仅仅有一个默认构造函数和解构器就足够了吗?它仅仅处理一个对象集合吗?谢谢,c++,C++,编辑:对不起,应该更清楚。对于另一个示例,如果您有一个类“Aclass”,它包含一个int、一个字符串和另一个类的对象向量,您会建议“Aclass”类有一个带参数的构造函数吗?ieAclass(inti,字符串s)那么你也需要在构造函数中包含向量吗?我有点困惑。谢谢。你的意思是足够正确处理内存吗?取决于类型X。例如,如果您有一个vector数据成员,则不必在类中进行任何手动内存管理。如果“x”对象的集合表示“x”对象的标准容器”,而“足够”表示“足够不用担心资源管理”,则是。这同样适用于您或第三

编辑:对不起,应该更清楚。对于另一个示例,如果您有一个类“Aclass”,它包含一个int、一个字符串和另一个类的对象向量,您会建议“Aclass”类有一个带参数的构造函数吗?ie
Aclass(inti,字符串s)
那么你也需要在构造函数中包含向量吗?我有点困惑。谢谢。

你的意思是足够正确处理内存吗?取决于类型
X
。例如,如果您有一个
vector
数据成员,则不必在类中进行任何手动内存管理。

如果“x”对象的集合表示“x”对象的标准容器”,而“足够”表示“足够不用担心资源管理”,则是。这同样适用于您或第三方制作的任何书写良好的容器

这也是假设您的X对象正确处理其资源。它们的语义与您将它们放入的容器兼容

编辑

如果对象中的所有内容都填充了默认值,则不需要这样的构造函数。即空容器、归零成员(或未初始化?--)等


只有当您的对象处于无效状态而没有自定义构造函数时,或者您希望运行某种自定义逻辑时,您才真正需要自定义构造函数。

对于类,您可以编写自己的构造函数,其中显示了如何构造内部对象,即

class A{
    string s;
    int x;
    A(string t):s(t), x(17){} // x is always 17 after construction
}
但若内部对象是默认可构造的,那个么您可以保留它的构造,并且默认情况下它将被构造

A(int l):x(l){}
相当于

A(int l):x(l), s(){}
(基本类型除外),默认情况下可能包含垃圾


如果使用
A
的默认构造函数,则默认情况下将构造所有内部对象。

如果按
collection
表示标准库类,则需要复制构造函数和赋值运算符=重载

A(int l):x(l){}
std::map和std::set将需要一个额外的比较运算符。
std::unorderd_映射和std::unorderd_集需要一个专门针对您的类型的std::hash。

通常您不必定义默认构造函数。如果需要默认构造函数且未定义构造函数,编译器将隐式声明默认构造函数。通常,除了默认构造函数之外,还可以定义其他构造函数(如您提到的构造函数)。在这种情况下,您需要同时定义:

class A
{
public:

    string s;
    int x;

    // default constructor, no arguments
    A(): x(), s() {}

    // constructor
    A(int i, string t): x(i), s(t) {}
}

int main()
{
    A a1;
    A a2(5, "text");
    vector<A> ls;
    return 0;
}
A类
{
公众:
字符串s;
int x;
//默认构造函数,无参数
A():x(),s(){}
//建造师
A(int i,string t):x(i),s(t){}
}
int main()
{
A a1;
A a2(5,“文本”);
向量ls;
返回0;
}
正如pwned提到的,为了在STL容器(例如vector)中使用类A,要求A有一个默认构造函数,如示例中所示(用户定义的或隐式的)。

您所说的“集合”是什么意思?