C++的构造函数

构造函数用于保证对象被初始化(用于初始化对象,不是开空间创建对象)

1. 特性

1.函数名与类名相同
2.构造函数可重载
3.没有返回值(无需void)
4.在对象实例化时,编译器自动调用该类的构造函数

例子


class Date
{
	public:
			Date()/// 1
			{
				year=0;
				month=0;
				day=0;
			}

			Date(int year,int month,int day)//函数重载//2
			{
				_year=year;
				_month=month;
				_day=day;
			}

		


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

int main()
{
	Date t1();///0 0 0
	Date t2(2022,8,1);///2022 8 1
}

在这里插入图片描述

如上述,t1对象实例化就会自动调用对应的构造函数:Date( );t2同理自动调用Date( int year , int month , int day)

2.无显示定义的构造函数

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

class Stack
{
public:
  
private:
    DataType *_array;
    int _capacity;
    int _size;
};
class Date
{
	public:

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

int main()
{
	Date d1;
	Stack t;
}


在这里插入图片描述

看到调用默认构造函数后,但是并没有初始化。这是因为C++默认生成构造函数对内置类型成员不做处理。
C++类型分类:
自定义类型:class ,struct(自定义类型成员会回去调用他的默认构造函数)
基本(内置)类型:int, double, char, 指针等(默认生成的构造函数不会对其处理)

 DataType *_array;//指针
    int _capacity;//整型
    int _size;//整型
	
	int _year;//整型
	int _month;//整型
	int _day;//整型
///这些都是内置类型所以默认生成的构造函数不会对其处理

这些都是基本类型所以默认生成的构造函数不会对其处理
但是自定义类型成员会回去调用他的默认构造函数

如下

class Stack
{
public:Stack(size_t capacity = 3)
    {
        _array = (DataType *)malloc(sizeof(DataType) * capacity);
        if (NULL == _array)
        {
            perror("malloc申请空间失败!!!");
            return;
        }

        _capacity = capacity;
        _size = 0;
    }

  
private:
    DataType *_array;
    int _capacity;
    int _size;
};
class MyQueue
{
public:
    
private:
    
    Stack _st1;
    Stack _st2;
};
int main()
{
	MyQueue q;
	return 0;
}

在这里插入图片描述

此处的MyQueue q的成员是Stack ,Stack是自定义类型,所以会回去调用Stack自己的默认构造函数。

对比一下这种stack没有显示定义构造函数的情况

class Stack
{
  
	private:
	DataType *_array;
    int _capacity;
    int _size;
};
class MyQueue
{
public:
    
private:
    
    Stack _st1;
    Stack _st2;
};
int main()
{
	MyQueue q;
	return 0;
}

在这里插入图片描述

这种情况下看到类成员并没有初始化,这是因为在类成员stack是自定义类型,则回去调用stack自身的默认构造函数,但是stack的成员却是基本类型,所以默认构造对此不处理。

3.默认构造函数分类

默认构造函数:第一种:类中没又显示定义,编译器自动生成默认构造函数
第二种:用户自己编写的全缺省的构造函数。
第三种:用户自己编写的无参数的构造函数。
这三种都是称为默认构造函数。如下

class Date
{
	public:///第一种默认构造函数,没有显示定义,编译器自动生成的默认构造函数
		
	private:
			int _year;
			int _month;
			int _day;
};

class Date
{
	public:///第二种用户自己编写的全缺省的构造函数
			Date(int year=1,int month=1,int day=1)//全缺省
			{
				_year=year;
				_month=month;
				_day=day;
			}
	private:
			int _year;
			int _month;
			int _day;
};

class Date
{
	public:///第三种,用户自己编写的无参数的构造函数
			Date()//无参数
			{
				year=1;
				month=1;
				day=1;
			}
	private:
			int _year;
			int _month;
			int _day;
};

以上3种情况都称为默认构造函数,特点:不传参数即可调用。
==但是默认构造函数只能存在一种。同时存在会产生调用歧义。

==总结:默认生成的构造函数,对基本类型成员不做处理,自定义类型成员自己回调自身的默认构造函数。

4.给缺省值

对基本类型还可以给缺省值如下,

class Date
{
	public:

	private:
			int _year=1;///这里不是初始化,而是给缺省值。
			int _month=1;///
			int _day=1;///
};
int main()
{
	Date d1;
}

在这里插入图片描述

给缺省值,就可以解决默认构造函数对基本类型不处理的情况。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值