Bootstrap

构造函数详解

   一.构造函数的初步了解

   在类实例化的过程中,我们会定义一些成员变量以及一些成员函数,而构造函数就是一个特殊的成员函数。构造函数只会在对象的生命周期内调用一次。

   构造函数的形式为:

class 类名
{
类名(构造形参表)
{
  //主要负责对象的初始化,即初始化成员变量
}

 从中可以看出构造函数的两个特点:

·无返回值

·函数名与类名相同

#include<iostream>
using namespace std;
class BOOK 
{
private:
	string m_name;
	double m_price;
	int m_num;
public:
	void print()
	{
		cout << "名字:" << m_name << " 价格:" << m_price << " 数量:" << m_num << endl;
	}
	BOOK(const string name, const double price, const int num)
	{
		m_name = name;
		m_price = price;
		m_num = num;
	}
	
};
int main()
{
	BOOK a("乱世书",10.0,5);
	a.print();
	return 0;
}

 以上是一个构造函数的基本应用。

二.构造函数的重载

    在定义一个类的时候,定义多个构造函数不会出错,只要注意参数的不同就可以。

这是也反映了一个构造函数的特点:

·若是多个构造函数,编译器会自动调用相应的构造函数

#include<iostream>
using namespace std;
class BOOK 
{
private:
	string m_name;
	double m_price;
	int m_num;
public:
	void print()
	{
		cout << "名字:" << m_name << " 价格:" << m_price << " 数量:" << m_num << endl;
	}
	BOOK(const string name, const double price, const int num)
	{
		cout << "调用BOOK1函数" << endl;
		m_name = name;
		m_price = price;
		m_num = num;
	}
	BOOK(const double price)
	{
		cout << "调用BOOK2函数" << endl;
		m_name = "剑来";
		m_price = price;
		m_num = 6;
	}
	BOOK(const string name )
	{
		cout << "调用BOOK3函数" << endl;
		m_name = name;
		m_price = 9.0;
		m_num = 8;
	}
};
int main()
{
	BOOK a1("乱世书",10.0,5);
	a1.print();
	BOOK a2(8.0);
	a2.print();
	BOOK a3("遮天");
	a3.print();
	return 0;
}

     在类定义的时候,只要输入对应的参数,编译器就可以调用对应的构造函数。

     接下来介绍构造函数的另一个特点:

·如果一个类中没有显示声明的构造函数,那么编译器会自动生成一个无参构造函数,自动生成 的构造函数,函数体为空且没有参数。 但是如果程序员写了至少一个构造函数,那么编译器就不会生成了。

      这个无参构造函数还有以下两点:

·对于基本类型的成员变量不能初始

·对于类类型的成员变量,会自动调用相应类的无参构造函数来初始化

#include<cstdio>
#include<iostream>
using namespace std;

class A
{
public:
	A(void)  //无参构造函数
	{
		m_i = 1234;
	}
	int m_i;
};

class B
{
public:
	B(void) {}
	int m_j;
	A m_a;
	string str;
};

int main()
{
	B b;
	cout << b.m_a.m_i << endl;//1234
	return 0;
}

   如果已经定义了有参构造函数,那么编译器就不会生成无参构造函数,此时如果没有定义无参构造函数,并且定义的类中有一个类类型的成员变量,就需要初始化表进行初始化。

其格式如下:

class 类名 { 类名(形参表):成员变量(初值),...{//构造函数体} };

#include<iostream>
using namespace std;
class BOOK 
{
private:
	string m_name;
	double m_price;
	int m_num;
public:
 void print()
	{
		cout << "名字:" << m_name << " 价格:" << m_price << " 数量:" << m_num << endl;
	}

BOOK(const string name, const double price, const int num):m_name(name),m_price(price), m_num(num){}   初始化表
	
};
int main()
{
	BOOK a1("乱世书",10.0,5);
	a1.print();
	return 0;
}

一般来说构造函数与初始化表是一样的,只有在两个情况下必须使用初始化表;

·如果有类类型的成员变量,而该类又没有无参构造函数,则必须通过初始化表来初始化该变量

·如果类中包含"const"或"引用"型的成员变量,必须要使用初始化表来初始化。

    其中第二点,一个是初始化后不能修改,所以不能在构造函数中初始化,一个则是因为在被定义时必须要初始化。

    在定义构造函数的时候,我们可以使用缺省实参

#include<iostream>
using namespace std;
class BOOK 
{
private:
	string m_name;
	double m_price;
	int m_num;
public:
	void print()
	{
		cout << "名字:" << m_name << " 价格:" << m_price << " 数量:" << m_num << endl;
	}
	BOOK(const string name, const double price, const int num = 10)
	{
		m_name = name;
		m_price = price;
		m_num = num;
	}
};
int main()
{
	BOOK a1("乱世书",10.0);
	a1.print();
	return 0;
}

 综上所述构造函数的作用和特点如下:

作用:专门用于对象的初始化工作,在类的对象创建时定义初始状态

特点:

·无返回值

·函数名与类名相同

·若是多个构造函数,编译器会自动调用相应的构造函数

·如果一个类中没有显示声明的构造函数,那么编译器会自动生成一个无参构造函数,自动生成 的构造函数,函数体为空且没有参数。 但是如果程序员写了至少一个构造函数,那么编译器就不会生成了。

;