クラスのインスタンス化に関して混乱を招くような質問をしました。
次のようなクラス 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();
^