我不明白的是使用指向类的指针和生成它的新实例之间的区别。这只是为了表现?在这里,我创建了一个类,并使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();
}
答案 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();