2012-01-19 42 views
1

我不明白的是,使用指向類的指針和生成它的新實例之間有什麼區別。這只是爲了表現?在這裏,我做了一堂課,並製作了指向班級的指針和班級的實例。 另一個問題:我可以使一個指針的類和使用另一個構造函數?像myClass* p(7); p->afis();使用類指針vs實例

#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;',對嗎? – 2012-01-19 18:50:17

回答

6
myClass* m; 

僅僅是一個指針類型myClass它不指向任何有效的對象,dereferecing這樣的指針是未定義行爲

未定義的行爲意味着您的程序無效,它可能看起來工作或可能會崩潰,或者它可能顯示任何奇怪的行爲,所有安全投注都關閉。所以只是因爲你的程序工作並不意味着它是安全的,它會一直工作。

要編寫一個有效的程序,您必須使指針指向一個有效的對象。
例如:

myClass obj; 
myClass*m = &obj; 

在第二種情況:

myClass n(7); 

它通過調用的myClass它接受型int之一參數的構造創建一個對象類型myClassn
這是創建對象的有效方法。

2

我可以做一個指針類,並使用另一個構造

製作一個指針不調用構造函數。指針未初始化,直到您將其設置爲某個對象的地址(可能是使用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