2012-01-19 3 views
1

То, что я не понимаю, в чем разница между использованием указателя на класс и созданием его нового экземпляра. Это просто для выступления? Здесь я сделал класс и сделал 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(); 
} 
+1

Посмотрите здесь для понимания указателей: http://stackoverflow.com/questions/96285/in-ci-cannot-grasp-pointers-and-classes –

+1

Вы имели в виду 'MyCLASS * m = new MyClass; ', правильно? –

ответ

6
myClass* m; 

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

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

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

myClass obj; 
myClass*m = &obj; 

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

myClass n(7); 

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

2

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

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

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

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

Лучше:

std::unique_ptr<myClass> m(new myClass(constructor, args, here));          
m->afis(); 
+0

то почему после того, как я говорю это myClass * m; m-> AFIS(); он указывает 5 на экране? – Dementor

+1

@Dementor: Это неопределенное поведение. Все может случиться. Он может печатать '5'. Он может упасть. Он может перезаписать все ваши файлы. Это может отправить по электронной почте непристойные фотографии вашей бабушке. –

+0

Да, он раздавлен ^^ – Dementor

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