构造函数(C++)


一、引入构造函数

观察下面我们声明的这个日期类,我们可以调用Init函数对成员变量进行初始化,但每次初始化的时候我们都需要重复调用,因而为了代码的简洁就引入了构造函数。

class Date
{
    
    
public:
	void Init(int day, int month, int year)
	{
    
    
		_day = day;
		_month = month;
		_year = year;
	}
private:
	int _day;
	int _month;
	int _year;
};

二、构造函数

1.构造函数的介绍

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。
构造函数名字中虽然含有构造两个字,但不是开辟空间来创建对象,而是在创建对象的同时对成员变量进行初始化。

2.构造函数的特性

  • 构造函数的语法
    1、名称与类名相同
    2、无返回值类型
class Date
{
    
    
	Date()//可以含有参数
	{
    
    
	}
};
  • 对象实例化时编译器自动调用对应的构造函数。
  • 构造函数可以重载
#include <iostream>
using namespace std;
class Date
{
    
    
public:
	Date()
	{
    
    
		cout << "Date()" << endl;
	}
	Date(int day, int month, int year)
	{
    
    
		cout << "Date(int day,int month,int year)" << endl;
	}
private:
	int _day;
	int _month;
	int _year;
};
int main()
{
    
    
	Date a;//调用无参数的构造函数
	
	Date b(1, 2, 3);//调用有参数的构造函数
	
	//注意调用无参构造时不要在对象后面加括号
	//如Date c();编译器不认为这是在创建对象,而是认为这是一个函数名为c,
	//返回值为Date类型,无参的一个函数声明
	return 0;
}

上述两个对象初始化后打印结果如下:
在这里插入图片描述

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

默认构造函数:编译器自动生成的构造函数,程序员的定义的无参构造函数以及参数全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。

#include <iostream>
using namespace std;
class Date
{
    
    

public:
	/*Date(int day, int month, int year)
	{
		cout << "Date(int day,int month,int year)" << endl;
	}*/

private:
	int _day;
	int _month;
	int _year;
};
int main()
{
    
    
	Date a;//此时创建对象编译器不会报错,因为编译器会自动生成一个构造函数;
	       //但把上面的注释打开就会报错,因为我们显式的声明了一个构造函数
	       //编译器不再生成默认构造函数
	return 0;
}
  • 当我们不自己声明构造函数时,编译器会自动生成构造函数,但调用编译器生成的构造函数时我们上面提到的日期类的三个成员变量得到的是随机值,那么编译器自己生成的构造函数有什么用呢?

解答:C++把变量类型分为内置类型和自定义类型,内置类型就是语言提供的数据类型,如:int/char…,自定义类型就是我们使用class/struct/union等自己定义的类型,看看下面的程序,就会发现编译器生成默认的构造函数会对自定义类型成员调用的它的默认成员函数。

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
class Time
{
    
    
public:
	Time()
	{
    
    
		cout << "Time()" << endl;
	}
private:
	int time;
};
class Date
{
    
    
private:
	int _day;
	int _month;
	int _year;
	Time _t;
};
int main()
{
    
    
	Date b;//对b中的变量_t初始化时调用的是Time的构造函数
	return 0;
}

打印结果如下:
在这里插入图片描述
为了弥补不能给内置变量初始化的缺陷,C++11打了补丁:内置类型成员变量在
类中声明时可以给默认值。如下所示:

class Date
{
    
    
private:
	int _day = 2;//给默认值
	int _month = 3;
	int _year = 4;
};

总结

本文主要介绍了C++中构造函数的相关知识同时我会持续在我的C++专栏中更新文章,,希望对你有所帮助。

猜你喜欢

转载自blog.csdn.net/weixin_63614711/article/details/131524150