类和对象2

类里面的成员函数什么都不写的时候,编译器会自动生成6个成员函数。
在这里插入图片描述
1.构造函数:
顶替原来SetDate函数。因为可能存在忘记调用初始化函数而直接进行使用。为了解决,C++引入了构造函数完成初始化。对象实例化的时候自动调用。(保证对象一定可以初始化)
构造函数可以重载。(可以有多个构造函数)
构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主
要任务并不是开空间创建对象,而是初始化对象。
其特征如下: 函数名与类名相同。无返回值。对象实例化时编译器自动调用对应的构造函数。构造函数可以重载。
无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。

class Date
{ 
public:
	// 构造函数 自动调用 没有返回值 一定会初始化
	Date(int year, int month, int day) //有参的 和 缺省的 不构成重载 不能共存
	{
		_year = year;
		_month = month;
		_day = day;
	}
	Data() // 无参的 和 缺省的 会产生歧义 不能共存
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}
	
	Date(int year = 1, int month = 1, int day = 1) //缺省的 最棒的
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year; // 对内置类型不初始化
	int _month;
	int _day;
};

class Bata
{
public:
	void Print()
	{};
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2024, 9, 29); // 调用有参数的构造函数 这个就可以直接自动调用构造函数初始化。
	Date d2; // 调用无参的构造函数
	Bata b1;// 默认生成的构造函数是随机值
	return 0;
}

析构函数:
析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。
析构函数是特殊的成员函数。
其特征如下:析构函数名是在类名前加上字符 ~。无参数无返回值(不能重载)。 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。 对象生命周期结束时,C++编译系统系统自动调用析构函数。
出了main的作用域后会调用析构函数。
s2先析构,s1和s2在栈存放,s2后进先出。

class SeqList 
{ 
public:
	SeqList(int capacity = 10)
	{
		_pData = (DataType*)malloc(capacity * sizeof(DataType));
		assert(_pData);
		_size = 0;
		_capacity = capacity;
	}
	~SeqList()
	{
		free(_pData );   // 释放堆上的空间
		_pData = nullptr;   // 将指针置为空
		_capacity = 0;
		_size = 0;
	}
private:
	int* _pData ;
	int _size;
	int _capacity;
};
int main()
{
	SeqList s1;
	//地下调用不用自己再写 SeqList的init和destory 因为构造和析构就默认调用解决了 不用自己再调用了
	//...
	
	SeqList s2; // s1和s2是s2先析构
	return 0;
}

运算符重载:
自定义类型不支持运算符,C++可以用运算符重载来让类对象支持用某个运算符。

class Date
{ 
public:
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	// bool operator==(Date* this, const Date& d2)
	// 这里需要注意的是,左操作数是this指向的调用函数的对象
	bool operator==(const Date& d2)
	{
		return _year == d2._year
			&& _month == d2._month
			&& _day == d2._day;
	}
private:
	int _year;
	int _month;
	int _day;
};
void Test ()
{
	Date d1(2018, 9, 26);
	Date d2(2018, 9, 27);
	d1 == d2; // 其实是这个 d1.operator==(&d1, d2);
	cout<<(d1 == d2)<<endl;
}

class Array
{
public:
	Array()
	{
		for(int i = 0; i<10; ++i)
		{
			_a[i] = i;
		}
	}
	int& operator[](int pos) // 对象是在main定义的,这里可以用引用,出了类作用域值还在
	{
		return _a[pos];
	}
private:
	int _a[10];
};
int main()
{
	Array ar;
	cout << ar[3] << endl; // 打印3
	ar[3] = 30; // 可以完成修改
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值