在類中有一種函數(shù),名字與類名相同,可以有參數(shù),但不能有返回值的函數(shù)(void也不行),即為此類的構(gòu)造函數(shù)。
構(gòu)造函數(shù)的作用是初始化對象,給成員變量賦初始值。有了構(gòu)造函數(shù),我們就不必專門再寫初始化函數(shù)了,也不用擔(dān)心忘了調(diào)用初始化函數(shù)。
定義一個(gè)類時(shí),如果沒有寫構(gòu)造函數(shù),則C++編譯器會為這個(gè)類生成一個(gè)默認(rèn)的構(gòu)造函數(shù),默認(rèn)構(gòu)造函數(shù)無參數(shù),不做任何操作。只要我們定義了構(gòu)造函數(shù),編譯器就不會這樣做了。一個(gè)類可以有多個(gè)構(gòu)造函數(shù)。
對象生成時(shí),不論以何種形式生成,構(gòu)造函數(shù)都會被調(diào)用。其后,就不能再調(diào)用構(gòu)造函數(shù)了。
例如:
class A {
private:
int a, b;
public:
void set(int a, int b);
};
//編譯器自動(dòng)生成構(gòu)造函數(shù)
A a;
A * p = new A;
//以上默認(rèn)構(gòu)造函數(shù)被調(diào)用
class A
{
private:
int a, b;
public:
A(int x, int y);
};
A::A(int x, int y)
{
a = x;
b = y;
}
A a(1,2);
A a[2] = {{1,2},{3,4}};
A * p = new A[2] {{1,2},{3,4}};
A a; //錯(cuò),沒有無參的構(gòu)造函數(shù)
一個(gè)完整的例子:
#include <iostream>
class A
{
private:
int a, b;
public:
A(int x, int y);
void printValue();
};
A::A(int x, int y)
{
a = x;
b = y;
}
void A::printValue()
{
std::cout << a << ',' << b << std::endl;
}
int main()
{
A a(1,2);
a.printValue();
A * b = new A(3,4);
b->printValue();
}
$ g++ a.cpp && ./a.out
1,2
3,4