使用类指针vs实例

时间:2012-01-19 18:46:13

标签: c++ class pointers

我不明白的是使用指向类的指针和生成它的新实例之间的区别。这只是为了表现?在这里,我创建了一个类,并使m成为类的指针和类的实例。 还有一个问题:我可以在类中创建指针并使用另一个构造函数吗?比如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 个答案:

答案 0 :(得分:8)

myClass* m;   

只是指向类型myClass的指针,它不指向任何有效对象,取消引用这样的指针是未定义行为

未定义的行为意味着您的程序无效且可能有效或可能崩溃,或者可能显示任何奇怪的行为,所有安全的投注都已关闭。因为你的程序工作并不意味着它是安全的并且它总能工作。

要编写有效的程序,您必须使指针指向有效的对象 例如:

myClass obj;
myClass*m = &obj;

在第二种情况下:

 myClass n(7);

它通过调用n的构造函数创建类型为myClass的对象myClass,该构造函数接受int类型的一个参数。 这是创建对象的有效方法。

答案 1 :(得分:3)

  

我可以在类中创建一个指针并使用另一个构造函数

制作指针不会调用构造函数。指针未初始化,直到您将其设置为某个对象的地址(可能是使用new创建的全新对象)。

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

这是未定义的行为,你有一个狂野的指针,因为m尚未初始化。

更好:

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