1
/**/
/*
2
(C) OOMusou 2007 http://oomusou.cnblogs.com
3![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
4
Filename : DefaultConstrutor_CommonMistake.cpp
5
Compiler : Visual C++ 8.0 / ISO C++
6
Description : Common mistake of Default Constructor
7
Release : 01/14/2007 1.0
8
*/
9
#include
<
iostream
>
10![None.gif](/Images/OutliningIndicators/None.gif)
11
using
namespace
std;
12![None.gif](/Images/OutliningIndicators/None.gif)
13![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
class
Foo
{
14
public:
15![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Foo(int x = 0) : x(x)
{};
16![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
17
public:
18![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
int getX()
{ return this->x; }
19![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
20
private:
21
int x;
22
}
;
23![None.gif](/Images/OutliningIndicators/None.gif)
24![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
int
main()
{
25
Foo foo(2);
26
// Foo foo(); // error!!
27
// Foo foo; // OK!!
28
// Foo foo = Foo(); // OK!!
29![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
30
cout << foo.getX() << endl;
31
}
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
2
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
3
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
4
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
5
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
6
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
7
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
8
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
9
![None.gif](/Images/OutliningIndicators/None.gif)
10
![None.gif](/Images/OutliningIndicators/None.gif)
11
![None.gif](/Images/OutliningIndicators/None.gif)
12
![None.gif](/Images/OutliningIndicators/None.gif)
13
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
14
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
15
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
16
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
17
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
18
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
19
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
20
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
21
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
22
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
23
![None.gif](/Images/OutliningIndicators/None.gif)
24
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
25
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
26
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
27
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
28
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
29
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
30
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
31
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
25行若想帶2為初始值給Constructor,Foo foo(2)是對的,若不想帶值呢?26行的寫法是常犯的錯,Compiler會認為foo為一function,回傳Foo型別object,這算是C++蠻tricky的地方,所以正確的寫法是27行,不加上(),或28行寫法也可以,先利用Default Constructor建立一個temporary object,再使用Copy Constructor將object copy給foo,不過這是使用Copy-initialization的方式,和27行使用Direct-initialization的方式不一樣。