0

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

编辑:抱歉应该更清楚。举个不同的例子,如果你有一个“Aclass”类,它有一个int、一个字符串和另一个类的对象向量,你会建议“Aclass”类有一个带参数的构造函数吗?即Aclass(int i, string s);,您是否也需要在构造函数中包含向量?我有点困惑。谢谢。

4

5 回答 5

1

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

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

编辑

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

如果您的对象将处于无效状态,或者您希望运行某种自定义逻辑,则您只需要一个自定义构造函数。

于 2012-12-08T19:57:18.820 回答
0

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

于 2012-12-08T19:56:49.790 回答
0

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

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,则所有内部对象都将默认构造。

于 2012-12-08T20:18:48.987 回答
0

如果collection您的意思是标准库类,则需要复制 ctor 和赋值 operator= 重载。

std::map 和 std::set 需要额外的比较运算符<重载。std::unorderd_map 和 std::unordered_set 需要一个专门针对您的类型的 std::hash 。

于 2012-12-08T20:24:24.780 回答
0

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

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 具有示例中的默认构造函数(用户定义的或隐式的)。

于 2012-12-08T20:43:08.467 回答