构造函数
构造函数是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;
}
编译运行都没有问题。