C++ 类与对象(中)构造函数 析构函数

构造函数

什么是构造函数

C++是基于C的基础上的,但是为了提升C 语言,C++在类中引用了构造函数。

构造函数是为了将类初始化

构造函数的特点

1、名字与类名相同

2、创建类类型对象时由编译器自动调用,且只调用一次

3、可重载

4、无返回值

怎样写构造函数

class Date {
public:
	void printDate();
	//构造函数
	Date(int year = 2000, int month = 1, int day = 1);
	//此处全缺省的意义:使编译器混淆函数与构造函数
	//全缺省或部分缺省只能用于声明,而不能用于定义。
    //因为在定义中写将会混淆(声明只与定义值不一致)

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

//在另一个CPP文件里
Date::Date(int year, int month, int day) {
	 _day = day;
	 _year = year;
	 _month = month;
}

void test1() {
	Date d1;
	Date d2(2023, 1, 20);
	//这样做不可以
	//Date d3()

	d1.printDate(); 
	d2.printDate(); 
}

什么时候写构造函数

内置的类:int类型, char类型等。还有指针。

自定义类:class/ struct /union

系统对内置的类不做处理

对于自定义类会调用默认构造函数

当默认构造函数不能满足需求时则需要自己写构造函数

构造函数可重载,但是默认构造函数有且只有一个。只要用户自己写了构造函数,编译器就不会再调用默认构造函数。

最好在成员变量声明时就给缺省值 

举例:

假如Date类不写构造函数,不可以满足对日期的初始化

 另一个例子:Stack类

写构造函数

 不写构造函数,没有给栈开辟空间,没有省定初始容量

 编译器其实可以自动生成构造函数

class Stack
{
public:
	Stack(int capacity = 4)
	{
		cout << "Stack(int capacity = 4)" << endl;

		_a = (int*)malloc(sizeof(int) * capacity);
		if (_a == nullptr)
		{
			perror("malloc fail");
			exit(-1);
		}

		_top = 0;
		_capacity = capacity;
	}

private:
	int* _a;
	int _top;
	int _capacity;
};

析构函数 

什么是析构函数

完成资源清理工作

比如:释放之前开辟的空间,将数值置为0等

析构函数的特点

  1.  ~+类名
  2. 无参(无重载)
  3. 无返回值
  4. 在类对象生命周期结束后自动调用
class Stack
{
public:
	Stack(int capacity = 4)
	{
		cout << "Stack(int capacity = 4)" << endl;

		_a = (int*)malloc(sizeof(int) * capacity);
		if (_a == nullptr)
		{
			perror("malloc fail");
			exit(-1);
		}

		_top = 0;
		_capacity = capacity;
	}

	~Stack()
	{
		cout << "~Stack()" << endl;

		free(_a);
		_a = nullptr;
		_top = _capacity = 0;
	}

private:
	int* _a;
	int _top;
	int _capacity;
};

什么时候写析构函数

  1.  是否有空间需要释放
  2. 默认析构函数是否够用

只要自己写了析构函数,编译器自动生成的默认析构函数就不会再被调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值