Преимущества / Недостатки использования методов класса без создания экземпляров - PullRequest
0 голосов
/ 18 декабря 2011

В c ++ мы можем вызывать метод класса без его создания.Например,

MyClass mc;
mc.method();

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

Ответы [ 2 ]

4 голосов
/ 18 декабря 2011

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

РЕДАКТИРОВАТЬ: Мне кажется, что мой совет может сбить с толку больше, чем помогает, поэтому я приведу несколько примеров:

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

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

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

2 голосов
/ 18 декабря 2011

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

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

...