gpt4 book ai didi

c++ - 使用类方法而不实例化的优点/缺点

转载 作者:太空宇宙 更新时间:2023-11-04 15:50:55 27 4
gpt4 key购买 nike

在c++中我们可以调用一个类的方法而不用实例化它。比如;

MyClass mc;
mc.method();

在不实例化类的情况下使用类方法的优点和缺点是什么?我们什么时候应该使用这种类型?

最佳答案

仅仅因为您没有显式调用构造函数,并不意味着您没有实例化它。您使用的表单调用默认构造函数。这可能会或可能不会正确设置类,但这是类作者要解决的问题,而不是使用它的代码。

编辑:我突然想到我给出的建议可能会造成混淆而不是帮助,所以我将提供几个示例:

以下类有一个不初始化其成员的普通默认构造函数:

class Point {
int x, y;
Point() { }
Point(int x, int y) : x(x), y(y) { }
};

您可以在有或没有显式构造函数的情况下使用此类:

Point p;
Point r(2, 3);

在上面的两种形式中,类被实例化并且实例可以使用而不会导致任何崩溃或调用未定义的行为。但是,在 p 的情况下,成员变量 xy 尚未初始化,因此具有以下值:所有的意图和目的,随机的。通常,您会通过显式设置其成员变量来填充此类对象...

Point a;
a.x = f();
a.y = g();

...或将对象传递给另一个函数来填充...

void f(Point& p) { p = something(); }

Point b;
h(b);

在其他情况下,默认构造函数必须以非平凡的方式初始化对象:

template <typename T>
class MyArray {
public:
MyArray() : len_(0), capacity_(0), arr_(0) { }
void add(const T& t) {
if (len_ == capacity_) grow();
arr_[len_++] = t;
}

private:
size_t len_, capacity_;
T* arr_;

void grow() { … }
};

构造函数的目的是将原始内存转换成可用的对象。对于 Point,实例可用不需要任何操作。对于 MyArraylen_capacity_ 必须在构造时设置为零,以便像 add()< 这样的成员函数 行为正确(我还将 arr_ 设置为空指针,以备不时之需)。

所有这一切的关键信息是对象可能会或可能不会被初始化,但它实例化的。

关于c++ - 使用类方法而不实例化的优点/缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8548275/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com