类与对象(中--构造函数)

类与对象(中--构造函数)

  • 1、构造函数的特性
  • 2、默认构造函数
  • 3、编译器自动生成的默认构造函数(无参的)(当我们不写构造函数时)
    • 3.1 编译器自动生成的默认构造函数只对 自定义类型的成员变量 起作用,对 内置类型的成员变量 不做处理
    • 3.2 针对编译器自动生成的默认构造函数,无法对内置类型成员变量进行初始化的缺陷
  • 4、总结是否在类中写构造函数

//构造函数(在对象实例化时,就完成对对象的初始化工作)
//作用:构造函数主要完成初始化工作(这样就会避免忘记对对象初始化)

1、构造函数的特性

//构造函数是特殊的成员函数。构造函数的作用是初始化对象,并非开空间创建对象(这是编译器完成的)。

// 其特征如下:
//(1)函数名与类名相同。
//(2)无返回值。(并非是 void, void是空返回值)
//(3)对象实例化时,编译器会自动调用对应的构造函数。
//(4)构造函数可以重载。

class Data
{
public:
	//A 无参构造函数
	Data()
	{
	}

	//B 带参构造函数
	Data(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

private:
	int _year;
	int _month;
	int _day;

};

int main()
{
	Data d1;
	Data d2(2023, 7, 31); //d1和d2两个对象在实例化时,调用Data函数构成函数重载。

	return 0;
}

2、默认构造函数

//主要分为三类:无参构造函数(自己写的)【Data()】、全缺省构造函数(自己写的)(有参的)【Data(int year=1,int month=1,int day=1)】以及 编译器默认生成的构造函数(自己没写)。
//特点:(1)不用传参数就可以调用。(2)在调用的过程中只存在一个(虽然在语法角度,无参构造函数和全缺省构造函数可以同时存在;但是在函数调用的过程中会存在歧义。)
//用法:最佳用法是只保留:全缺省构造函数(既可以无参调用,也可以有参调用,也不会产生调用歧义)


class Data
{
public:
	//全缺省构造函数
	Data(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Data d1;
	Data(2022, 7);
	Data d2(2023, 7, 31);

	return 0;
}

3、编译器自动生成的默认构造函数(无参的)(当我们不写构造函数时)

//通俗分析:当我们自己在类中定义了构造函数,编译器就不会自动生成。当我们自己没有在类中定义构造函数,编辑器就会自动生成。

class Data
{
public:

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Data d1;

	return 0;
}

3.1 编译器自动生成的默认构造函数只对 自定义类型的成员变量 起作用,对 内置类型的成员变量 不做处理

//内置类型:语法自带的,不用定义就可以用的类型,char\int\double\float以及指针(BTNode*)等类型。
//自定义类型:需要定义过才可以用的类型,例如:ListNode\BinaryTreeNode等

//特点:
//A 内置类型成员变量不做处理
//B 自定义类型成员变量会去调用它(这个自定义类型成员变量)的默认构造函数(如果没有默认构造函数,就无法编译通过)。
class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
private:
	int _hour;
	int _minute;
	int _second;

};

class Data
{
public:
	//不写,默认生成构造函数
private:
	int _year;
	int _month;
	int _day;

	//Time _t; //任意类型的指针都是内置类型
	Time _t;
};

int main()
{
	Data d1;

	return 0;
}

3.2 针对编译器自动生成的默认构造函数,无法对内置类型成员变量进行初始化的缺陷

//C++11打了个补丁:内置类型成员变量在类中申明时,可以给缺省值。
class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
private:
	int _hour;
	int _minute;
	int _second;
};

class Data
{
public:
	//不写,默认生成构造函数
private:
	int _year = 1;
	int _month = 1; //这儿给的1是缺省值;因为这儿是内置类型成员变量的申明。
	int _day = 1;

	Time _t;
};

int main()
{
	Data d1;

	return 0;
}

4、总结是否在类中写构造函数

//(1)一般的类都不会让编译器默认生成构造函数,都会自己写。显示写一个全缺省构造函数,非常好用。
//(2)在某些特殊情况下,让编译器默认生成构造函数。
//例如:
#include 
#include 
using namespace std;

typedef int DataType;
class Stack
{
public:
	Stack(int capacity = 3)
	{
		_array = (DataType*)malloc(sizeof(DataType) * capacity);
		assert(_array);

		_capacity = capacity;
		_size = 0;
	}
private:
	DataType* _array;
	int _capacity;
	int _size;

};

class MyQueue
{
public:
	void push(int x) {}
	//...
private:
	size_t _size = 0;  //这儿就发挥了 C++11加入缺省值补丁 的作用
	Stack _st1;
	Stack _st2;
};

int main()
{
	MyQueue q; //MyQueue 用默认生成的构造函数就挺好的,不需要显示写。

	return 0;
}

你可能感兴趣的:(c++)