2012-01-19 6 views
1

私が理解できないことは、クラスへのポインタの使用とその新しいインスタンスの生成との違いは何ですか?それはパフォーマンスのためのものですか?ここで私はクラスを作り、クラスへのポインタとクラスのインスタンスを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(); 
} 
+1

は、ポインタを理解するためにここで見てください:http://stackoverflow.com/questions/96285/in-ci-cannot-grasp-pointers-and-classesあなたは 'MyClassのを意味し –

+1

* m =新しいMyClass; '、そうですか? –

答えて

6
myClass* m; 

そのようなポインタは未定義の動作あるdereferecing、任意の有効なオブジェクトを指していないタイプmyClassにだけポインタです。

未定義の動作は、プログラムが無効で、動作しているように見えるか、クラッシュするか、奇妙な動作を示している可能性があります。だからちょうどあなたのプログラムの作品が安全であるとは限らず、いつもうまくいくからです。

有効なプログラムを書き込むには、ポインタが有効なオブジェクトを指すようにする必要があります。例えば
:第2のケースで

myClass obj; 
myClass*m = &obj; 

は:

myClass n(7); 

それはタイプintの一つの引数を取るmyClassのコンストラクタを呼び出すことにより、オブジェクトタイプmyClassnを作成します。
これは、オブジェクトを作成する有効な方法です。

2

iは、ポインタクラス作成し、コンストラクタを呼び出すことはありませんポインタを作る別のコンストラクタ

を使用することができます。ポインタは、オブジェクトのアドレスに設定するまで初期化されません(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

関連する問題