2011-12-17 79 views
0

在C++中,我们可以调用类的方法而不实例化它。如;没有实例化使用类的方法的优点/缺点

MyClass mc; 
mc.method(); 

有什么优势&使用类的方法没有实例它的缺点是什么?我们应该何时使用这种类型?

+18

但是你已经实例化它! – sharjeel 2011-12-17 22:13:39

+0

就目前而言,这个问题没有意义,因为 - 正如@sharjeel所说 - 你已经实例化了这个类。投票结束为NARQ。 (随时修复它时重新打开标志。) – sbi 2011-12-17 22:15:39

+0

从'[instantiation]'标签wiki:“Instantiation是在所有面向对象和基于对象的语言中从类创建对象的过程。” – Xeo 2011-12-17 22:17:00

回答

4

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

编辑:它发生,我认为我给可能混淆超过它帮助的建议,所以我将提供一些例子:

下面的类具有平凡缺省构造函数不初始化其成员:

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的情况下,实例无需执行任何操作即可使用。在的情况下,len_capacity_必须在构建时设置为零,以便像add()这样的成员函数的行为正确(我也将arr_设置为空指针以获得较好的度量)。

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

+0

非常感谢 – meandbobbymcgee 2011-12-18 09:31:49

2

你很容易混淆实例化是否在堆栈上(在你的例子中)或在堆上(新的)创建它。抛开对象生命周期(和内存管理),在调用一个方法和另一个方法时没有真正的区别。这更多的是关于物体的大小以及你需要多长时间。