構造函數
構造函數是C++類用來初始化屬性成員的方式。一個類的構造函數名和類名一致,構造函數沒有返回值,也不能使用void來修飾。
當你沒顯式定義構造函數的時候,C++會給你一個默認構造函數,他什麼都不做。如果你定義了自己的構造函數,那麼將不在提供默認構造函數,這時候就需要你自己去定義一個無參數的構造函數。
構造函數可以被重載。
class A
{
public:
A();
A(int a, int b);
void getValue(int& a, int& b);
private:
int a;
int b;
};
class B
{
public:
B(int& m);
void getValue(double& p, int &c);
private:
A a;
const double PI;
int& b;
};
A::A()
{
//nothing
}
A::A(int a, int b)
{
this->a = a;
this->b = b;
}
void A::getValue(int& a, int& b)
{
a = this->a;
b = this->b;
}
B::B(int& m) :a(1, 2), PI(3.14), b(m)
{
}
void B::getValue(double& p, int &c)
{
p = this->PI;
c = this->b;
}
B類的構造函數使用了初始化列表的方式。初始化列表就是在構造函數參數列表後加上:開始書寫。使用初始化列表是因爲:
1.對於類類型而言使用初始化列表少了一次調用拷貝構造函數的過程
2.引用類型如果是引用類外的變量那麼必須在此次初始化。
只有構造函數才能初始化列表。另外初始化列表的書寫的初始化順序是無關緊要的,因爲使用初始化列表時,初始化順序由定義變量的順序決定。初始化列表在構造函數的函數體之前執行。
據說使用初始化列表是初始化,而構造函數的函數體內執行的操作是賦值。前者的效率更高。
在main函數中做測試如下:
int main()
{
A a(0,3);
int m, n;
double q;
int d = 333;
a.getValue(m, n);
std::cout << "m:" << m << " " << "n:" << n << std::endl;
B b(d);
b.getValue(q, &m);
std::cout << "m:" << m << std::endl;
}
編譯運行都沒有問題。