Использование указателей классов против экземпляра - PullRequest
3 голосов
/ 19 января 2012

Что я не понимаю, так это какая разница между использованием указателя на класс и генерацией его нового экземпляра. Это только для производительности? Здесь я сделал класс и сделал m указатель на класс и n экземпляр класса. И еще вопрос: могу ли я сделать указатель на класс и использовать другой конструктор? как myClass* p(7); p->afis();?

#include <iostream>
using namespace std;

class myClass
{
    int a;
public:
    myClass(void);
    myClass(int);
    void afis();
    ~myClass(void);
};

myClass::myClass(void)
{
    a = 5;
}

myClass::myClass(int nr)
{
    a = nr;
}

void myClass::afis()
{
    cout << a;
}

myClass::~myClass()
{
}

int main()
{
    myClass* m;                                     //<--
    m->afis();

    myClass n(7);                                   //<--
    n.afis();

    cin.get();
}

Ответы [ 2 ]

8 голосов
/ 19 января 2012
myClass* m;   

- это просто указатель на тип myClass, который не указывает на какой-либо действительный объект, разыменование такого указателя равно Неопределенное поведение .

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

Чтобы написать действительную программу, вам нужно будет указать указатель на действительный объект.
Например:

myClass obj;
myClass*m = &obj;

Во втором случае:

 myClass n(7);

Создает объект n типа myClass, вызывая конструктор myClass, который принимает один аргумент типа int.
Это правильный способ создания объекта.

3 голосов
/ 19 января 2012

могу ли я сделать указатель на класс и использовать другой конструктор

Создание указателя не вызывает конструктор. Указатель не инициализируется до тех пор, пока вы не установите его для адреса какого-либо объекта (возможно, нового объекта, созданного с помощью new).

myClass* m;                                     //<--
m->afis();

Это неопределенное поведение, у вас есть дикий указатель, потому что m не был инициализирован.

Лучше:

std::unique_ptr<myClass> m(new myClass(constructor, args, here));                                     
m->afis();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...