2017-05-30 18 views
0

私はC++の初心者であり、ヘッダで宣言されたconstポインタの初期化について混乱しています。一例をあげる、私は私のヘッダーに似た構造とクラスました:Aを構成非常に複雑な構造であることを知って、構造体へのconstポインタの初期化C++

/* header file.h */ 
typedef struct A{ ... } A; 

class myClass{ 
    protected: 
     A *const myPtrA; 
} 

をし、コンストラクタで、たとえば、myPtrAの内容をインスタンス化したいと思いますサブ構造の、および動的にインスタンス化する必要があります

/* source file.cpp */ 
#include file.h 

myClass::myClass() { 
    A *tmpA = new A; 
    *myPtrA = *tmpA; 
} 

は、これは私のconstポインタmyPtrAを初期化するための良い方法ですか?そして、新しい呼び出しごとに専用の削除呼び出しが必要な場合は、* myPtrA = * aの直後にポインタtmpAを削除できますか? myPtrAが指摘する内容を失う危険はありませんか?

qroh

+1

[良い初心者の本を探す](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)、*コンストラクタの初期化リストを読んでください*。 –

+0

ちなみに、C++では、 'struct'はクラスに似ていますが、唯一の違いはデフォルトの可視性(' struct'の 'public'、' class'の 'private')です。つまり、 'struct'のために' typedef'を必要としません。 –

+1

'' typedef struct A {...} A; ''は構造体を定義するCの方法です。 C++ではクラスのように定義します: '' struct A {...}; ''。 C++の構造体とクラスの唯一の違いは、デフォルトの可視性です。 – nefas

答えて

1
*myPtrA = *tmpA; 

これが私のconstポインタmyPtrAを初期化するための良い方法である);(と私の英語はご容赦)

はお時間を事前にありがとうございますか!

No. myPtrAは初期化されていません。これはデフォルトで初期化されたため、不確定な値を持ちます。不確定値(*myPtrA)のポインタを参照解除すると、未定義の動作が発生します。

* myPtrA = * aの直後にポインタtmpAを削除できますか? myPtrAが指摘する内容を失う危険はありませんか?

はい、安全です。 myPtrAが指すオブジェクトは、tmpAが指すオブジェクトのコピー(割り当てによる)です。ただし、動的オブジェクトを割り当て、コピーしてから、まずコピーを直接作成または変更できるようにすることは、完全に無意味です。

class myClass{ 
    protected: 
     A *const myPtrA = new A; 
}; 

PS:ここ

は正しくメンバーポインタを初期化する方法の一例です。これを行う方法を学ぶと便利ですが、実際のプログラムで手動でメモリを管理することはほとんどありません。代わりにstd::unique_ptrのようなRAIIコンテナを使用してください。

+0

ありがとう、それは非常に明確です! 私は同意するが、私はそれは無意味だことを確認したかった 「最初の場所で、動的オブジェクトを割り当てるために、完全に無意味であるそれをコピーし、それdetroy」;)再び 感謝 – qrohan

関連する問題