在c ++中,我们可以在不实例化的情况下调用类的方法。如;
MyClass mc;
mc.method();
有什么优点和优点?使用类方法而不实例化它的缺点?我们应该何时使用这种类型?
答案 0 :(得分:4)
仅仅因为您没有显式调用构造函数,并不意味着您没有实例化它。您使用的表单调用默认构造函数。这可能会也可能不会正确设置类,但这是类的作者要解决的问题,而不是使用它的代码。
编辑:在我看来,我给出的建议可能会比它有所帮助,所以我将提供几个例子:
以下类有一个简单的默认构造函数,它不会初始化其成员:
class Point {
int x, y;
Point() { }
Point(int x, int y) : x(x), y(y) { }
};
您可以在有或没有显式构造函数的情况下使用此类:
Point p;
Point r(2, 3);
在上面的两种形式中,类都被实例化,实例可以使用而不会导致任何崩溃或调用未定义的行为。但是,在p
的情况下,成员变量x
和y
尚未初始化,因此对于所有意图和目的,其值将是随机的。通常,您可以通过显式设置其成员变量来填充此类对象...
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
的情况下,实例无需任何操作。对于MyArray
,len_
和capacity_
必须在构造时设置为零,以便add()
之类的成员函数正常运行(我还设置arr_
用于良好测量的空指针。)
所有这些中的关键信息是对象可能已初始化,也可能未初始化,但 已实例化。
答案 1 :(得分:2)
您是否混淆实例化是在堆栈(在您的示例中)还是在堆上(使用new)创建它。
除了对象生存期(和内存管理)之外,在一个方法与另一个方法上调用方法没有什么区别。它更多的是关于对象大小以及你需要多长时间。