C++構造函數和澄清,我問發生對類實例化一些混亂的問題。對於如何實例
如果你有一個類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
所以在克++ 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();
^
問這裏是錯誤的,因爲我們只能花幾分鐘回答你的問題。最好花幾個小時來學習一本好的C++編程書。 C++是一門難以學習的語言,你需要很多小時才能完成。此外,使用編譯器啓用調試信息和警告(例如,在Linux上用'g ++ -Wall -g'編譯)並學習使用調試器(Linux上的'gdb')。 –
我不認爲第三種形式有效([示例](http://coliru.stacked-crooked.com/view?id=3c6b93406db9ef317b83a5f19c79a30d-e54ee7a04e4b807da0930236d4cc94dc))。 –
@安迪,謝謝你。我促使我嘗試g ++ 4.2和4.8,看看上面的更新。 – Jason