C++之构造函数

构造函数

构造函数是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;
}

编译运行都没有问题。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章