我问了一个问题,导致类实例化有些混乱。
如果您有一个 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();
不合适,但它似乎确实有效。
谁能解释所有这些方式以及何时使用其中一种方式?我认为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();
^