在C++中,我们可以调用类的方法而不实例化它。如;没有实例化使用类的方法的优点/缺点
MyClass mc;
mc.method();
有什么优势&使用类的方法没有实例它的缺点是什么?我们应该何时使用这种类型?
在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
的情况下,成员变量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
的情况下,实例无需执行任何操作即可使用。在的情况下,len_
和capacity_
必须在构建时设置为零,以便像add()
这样的成员函数的行为正确(我也将arr_
设置为空指针以获得较好的度量)。
所有这一切的关键信息是对象可能被初始化,也可能不被初始化,但它实例化了是。
非常感谢 – meandbobbymcgee 2011-12-18 09:31:49
你很容易混淆实例化是否在堆栈上(在你的例子中)或在堆上(新的)创建它。抛开对象生命周期(和内存管理),在调用一个方法和另一个方法时没有真正的区别。这更多的是关于物体的大小以及你需要多长时间。
但是你已经实例化它! – sharjeel 2011-12-17 22:13:39
就目前而言,这个问题没有意义,因为 - 正如@sharjeel所说 - 你已经实例化了这个类。投票结束为NARQ。 (随时修复它时重新打开标志。) – sbi 2011-12-17 22:15:39
从'[instantiation]'标签wiki:“Instantiation是在所有面向对象和基于对象的语言中从类创建对象的过程。” – Xeo 2011-12-17 22:17:00