0

クラスのインスタンス化に関して混乱を招くような質問をしました。

次のようなクラス A() がある場合:

class A
{
public:
    A();
    ~A();
};

次に、そのクラスで作業したいのですが、次のすべてを実行できます。

// First way
A a1;
// Second way
A a1 = A();
// Third way
A::A a1 = A::A();
// Fourth way
A* a1 = new A();

A::A a1 = A::A();3番目の方法は適切ではないと言われましたが、うまくいくようです。

これらすべての方法と、どちらをいつ使用するかを説明できる人はいますか? newスタックではなくヒープに割り当てると思いますか?

プログラム例:

#include <iostream>
#include <string>

class A
{
    public: 
    A();
    ~A();
};

A::A()
{
    std::cout << "A" << std::endl;
}

A::~A() {}

int main()
{   
     A a1;

    A a2 = A();

    A::A a3 = A::A();

    A* a4 = new A();

    return 0;
 }

出力:

$ ./test4
A
A
A
A

したがって、g++ 4.2 では機能します。

$ g++ -Wall main3.cpp -o test4
main3.cpp: In function ‘int main()’:
main3.cpp:28: warning: unused variable ‘a4’

gcc 4.8 では、それほど多くはありません:

 g++-4.8 -std=c++11 -Wall main3.cpp -o test4
main3.cpp: In function ‘int main()’:
main3.cpp:26:2: error: ‘A::A’ names the constructor, not the type
 A::A a3 = A::A();
 ^
main3.cpp:26:7: error: expected ‘;’ before ‘a3’
  A::A a3 = A::A();
       ^
main3.cpp:26:18: error: statement cannot resolve address of overloaded function
  A::A a3 = A::A();
              ^
main3.cpp:28:8: warning: unused variable ‘a4’ [-Wunused-variable]
     A* a4 = new A();
        ^
4

3 に答える 3

0

1 つ目a1は、デフォルトのコンストラクターを使用して初期化します。

2 番目は、最初a2に既定のコンストラクターを使用して初期化し、既定のコンストラクターへの明示的な呼び出しによって作成されたオブジェクトをそれに割り当てます。

3番目のフォームは機能しないと思うので、省略します。

最後のものは、クラス A のオブジェクトを格納するために適切なサイズのメモリを割り当て、呼び出されたコンストラクタ (この場合はデフォルトのコンストラクタ) を使用して割り当てられたメモリを初期化します。

于 2013-06-01T23:29:01.960 に答える
0

動的割り当てと静的割り当ての違いを学ぶ必要があります。さらに、デフォルトのコンストラクターを暗黙的に呼び出す最初の形式を使用します。2 番目の形式では、クラス A の一時的なインスタンスを作成し、その自動生成されたコピー コンストラクターを使用して a1 を作成していますが、ほとんどのコンパイラはそれを a1 の単一の既定の構築に最適化します。3 番目の形式は単なる無効な C++ です。4 番目の形式は動的割り当てを実行しており、delete でメモリの割り当てを適切に解除していないため、プログラムの終了時にメモリを再利用するのは OS に任せています。

于 2013-06-02T00:17:02.043 に答える