C++ Collections Class
C++ Collections Class
我是自学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 具有默认构造函数,如示例中所示(用户定义或隐式
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- "Undefined class"作为is_base_of的论据
- 如何将class.cpp和class.hpp编译为一个.o文件
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使用"derived input class"创建派生类?
- 错误:"Left of getValue must have class/struct/union"
- ' class a : b ' 和 ' class a : public b ' 之间的继承类不同
- Pybind11 Class Definition
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- TypeError: [c++ addon class] 不是构造函数
- C++ class template
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- Clearing Class Foo with new(pFoo) Foo()
- C++ class vs a library
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 使用"class"关键字,后跟未声明的标识符
- C++ Collections Class