C++ Collections Class

C++ Collections Class

本文关键字:Class Collections C++      更新时间:2023-10-16

我是自学C++。如果你正在制作一个只有"X"对象集合的成员变量的Class,(无论 X 是什么)只有一个默认构造函数和解构函数就足够了,似乎它纯粹处理一个对象集合?谢谢。

编辑:对不起应该更清楚。对于另一个示例,如果您有一个类"Aclass",它有一个整数,一个字符串和一个另一个类的对象向量,你会建议"Aclass"类有一个带参数的构造函数吗?即Aclass(int i, string s);,你也需要在构造函数中拥有向量吗?我有点困惑。谢谢。

如果"x'对象的集合"是指"'x'对象的标准容器",而"足够"是指"足够不用担心资源管理",那么是的。您或第三方制作的任何编写良好的容器也是如此。

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

编辑

如果你可以拥有一个为所有内容填充默认值的对象,则不需要这样的构造函数。 即空容器、零成员(还是未初始化? -_-)等。

只有当您的对象在没有自定义构造函数

的情况下处于无效状态,或者您希望运行某种自定义逻辑时,您才真正需要一个自定义构造函数。

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

对于类,你可以编写自己的构造函数,它展示了如何构造内部对象,即

class A{
    string s;
    int x;
    A(string t):s(t), x(17){} // x is always 17 after construction
}

但是,如果内部对象是默认可构造的,则可以保留其构造,默认情况下它将是costruct的。

A(int l):x(l){}

相当于

A(int l):x(l), s(){}

(基元类型除外),默认情况下可能包含垃圾

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

如果collection是指标准库类,则需要复制 ctor 和赋值运算符 = 重载。

std::map 和 std::set 需要额外的比较运算符

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

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

正如 pwned 所提到的,为了在 STL 容器中使用您的类 A,例如向量,需要 A 具有默认构造函数,如示例中所示(用户定义或隐式

)。