我正在自学 C++。如果您正在制作一个Class
只有一个成员变量是“X”对象集合的成员变量,(无论 X 可能是什么)只有一个默认构造函数和一个解构函数就足够了,它似乎纯粹是处理对象集合?谢谢。
编辑:抱歉应该更清楚。举个不同的例子,如果你有一个“Aclass”类,它有一个int、一个字符串和另一个类的对象向量,你会建议“Aclass”类有一个带参数的构造函数吗?即Aclass(int i, string s);
,您是否也需要在构造函数中包含向量?我有点困惑。谢谢。
我正在自学 C++。如果您正在制作一个Class
只有一个成员变量是“X”对象集合的成员变量,(无论 X 可能是什么)只有一个默认构造函数和一个解构函数就足够了,它似乎纯粹是处理对象集合?谢谢。
编辑:抱歉应该更清楚。举个不同的例子,如果你有一个“Aclass”类,它有一个int、一个字符串和另一个类的对象向量,你会建议“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
}
但是如果内部对象是默认可构造的,您可以保留它的构造,默认情况下它将是可构造的。
A(int l):x(l){}
相当于
A(int l):x(l), s(){}
(原始类型除外),默认情况下可能包含垃圾
如果使用 的默认构造函数A
,则所有内部对象都将默认构造。
如果collection
您的意思是标准库类,则需要复制 ctor 和赋值 operator= 重载。
std::map 和 std::set 需要额外的比较运算符<重载。std::unorderd_map 和 std::unordered_set 需要一个专门针对您的类型的 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;
}
正如 pwned 所提到的,为了在 STL 容器(例如向量)中使用您的类 A,需要 A 具有示例中的默认构造函数(用户定义的或隐式的)。