【问题标题】:Using class pointers vs instance使用类指针与实例
【发布时间】:2012-02-14 10:28:18
【问题描述】:

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

【问题讨论】:

标签: c++ class pointers


【解决方案1】:
myClass* m;   

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

未定义的行为意味着您的程序无效,它可能看起来可以工作,或者它可能会崩溃,或者它可能会显示任何奇怪的行为,所有安全的赌注都被取消了。因此,仅仅因为您的程序可以运行并不意味着它是安全的并且它会一直运行。

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

myClass obj;
myClass*m = &obj;

第二种情况:

 myClass n(7);

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

【讨论】:

    【解决方案2】:

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

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

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

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

    更好:

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

    【讨论】:

    • 那为什么我说了这个 myClass* m; m->afis();它在屏幕上指向 5?
    • @Dementor:这是未定义的行为。任何事情都有可能发生。它可以打印5。它可能会崩溃。它可能会覆盖您的所有文件。它可以通过电子邮件将淫秽图片发送给您的祖母。
    • 这里完全不需要使用freestore。这里只需要一个简单的本地对象。我知道你很清楚这一点,我想知道为什么这个例子呢?
    • afis 是什么意思?
    • @BenVoigt,哈哈,好一个!我笑得很厉害:)
    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2011-02-11
    相关资源
    最近更新 更多