C++学习之——类与对象(构造函数)

[本节内容]

**1.类的6个默认成员函数
2.构造函数
**

1.类的6个默认成员函数

如果一个类中什么成员都没有,简称空类。但是空类并不是什么都没有,即使我们不写的情况下,它也会自动生成下面6个默认函数。

class Date{};

在这里插入图片描述

2.构造函数

2.1概念

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次

2.2特性

构造函数虽然名叫构造,但它的主要任务并不是开空间创建对象,而是初始化对象
其特性如下:
1.函数名与类名相同。
2.无返回值,可以有参数。
3.对象实例化时编译器自动调用对应构造函数。
4.构造函数可以重载。

class Date
{
public:
	Date()      //无参构造函数
	{}
	Date(int year, int month, int day)        //带参构造函数
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	
private:
	int _year;
	int _month;
	int _day;
};

void TestDate()
{
	Date d1;    //调用无参构造函数
	d1.Print();
	Date d2(2015, 1, 1);       //调用带参构造函数
	d2.Print();
	Date d3();       //有()表示声明了d3函数,该函数无参,返回日期类对象
}

5.如果类中没有显式定义构造函数,则C++编程会自动生成一个无参的默认构造函数,一旦用户显式定义编译器即不再生成。

class Date
{
public:
	//用户如果显式定义了构造函数,编译器将不再生成
	/*Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}*/
private:
	int _year;
	int _month;
	int _day;
};
void Test()
{
	//未定义构造函数,对象也可以创建成功
	//由此证明此处调用的是编译器生成的默认构造函数
	Date d;
}

6.无参的构造函数和全缺省的构造函数都被称为默认构造函数。并且默认构造函数只能有一个。
注意:无参构造函数,全缺省构造函数,我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。

//默认构造函数
class Date
{
public:
	Date()   //无参构造函数
	{
		_year = 1900;
		_month = 1;
		_day = 1;
	}
	Date(int year = 1900, int month = 1, int day = 1)      //全缺省构造函数
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
                 //默认构造函数只能有一个!!
void Test()      //编译无法通过,因为系统不知道应该调用上面哪个构造函数
{
	Date d1;
	d1.Print();
}

7.关于编译器生成的默认成员函数,很多童鞋会有疑问:在我们不实现构造函数的情况下,编译器会自动生成默认的构造函数,但看起来默认构造函数又没什么用?d对象调用了编译器生成的默认构造函数,但是d对象的_year/_month/_day仍然是随机值,也就是说编译器生成的默认构造函数并没有什么卵用??
**解答:**C++把类型分成内置类型(基本类型)和自定义类型。内置类型是语法已经定义好的类型,如 int/char…自定义类型指自己定义的类型,如class/struct/union…由下面的程序就会发现,编译器生成默认的构造函数会对自定义类型成员调用它的默认成员函数,而对内置类型不做操作。

class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
private:
	int _hour;
	int _minute;
	int _second;
};

class Date
{
private:
	//内置类型(未进行操作)
	int _year;
	int _month;
	int _day;
	//自定义类型(已初始化)
	Time _t;
};

int main()
{
	Date d;      
	system("pause");
	return 0;
}

在这里插入图片描述
8.成员变量的命名风格
一般在成员变量的前面加_ 或其他前后缀来区分它和函数的形参。

猜你喜欢

转载自blog.csdn.net/ly_6699/article/details/87870429
今日推荐