2011-12-17 3 views
0

В C++ мы можем вызывать метод класса без его экземпляра. Такие как;Преимущества/Недостатки использования методов класса без экземпляра

MyClass mc; 
mc.method(); 

Каковы преимущества & недостатки использования методов класса без инстанцирования его? Когда мы должны использовать этот тип?

+18

Но вы создали его! – sharjeel

+0

Как бы то ни было, этот вопрос не имеет смысла, потому что, как сказал @sharjeel, вы создали экземпляр класса. Голосование закрывается как NARQ. (Не стесняйтесь указывать для повторного открытия, когда вы его исправили.) – sbi

+0

Из '[instantiation]' tag-wiki: «Instantiation - это процесс создания объектов из класса во всех объектно-ориентированных и объектно-ориентированных языках». – Xeo

ответ

4

Просто потому, что вы явно не вызывали конструктор, не означает, что вы его не создали. Используемая форма вызывает конструктор по умолчанию. Это может или не может правильно настроить класс, но для автора класса это вопрос, а не код, который его использует.

EDIT: Это происходит со мной, что совет, который я дал может запутать больше, чем это помогает, поэтому я приведу пару примеров:

Следующий класс имеет тривиальный конструктор по умолчанию, который не делает инициализацию своих членов:

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_ нулевому указателю для хорошей оценки).

Ключевое сообщение во всем этом состоит в том, что объект может быть или не быть инициализирован, но он является созданным экземпляром.

+0

Большое вам спасибо – meandbobbymcgee

2

Вы путаете создание экземпляра с созданием его в стеке (в вашем примере) или в куче (с новым).

В течение всего жизненного цикла объекта (и управления памятью) нет реальной разницы в вызове методов на одном и другом. Это больше о размере объекта и о том, как долго вам это нужно.

Смежные вопросы