C++第四天:类和对象,六个成员函数,const类型

C++从开始到放弃第三天

1.类的六个成员函数

当类中一个成员都没有的时候,简称为空类。空类中会自动生成六个成员函数。
1.构造函数:负责初始化
2.析构函数:负责释放,清理工作
3.拷贝构造:对创建对象的拷贝
4.赋值重载:把一个对象赋值给另一个对象
5.普通对象取地址重载
6.const对象取地址重载

2.构造函数

定义:

构造函数是一个特殊的成员函数,名字与类名相同,创建类时由编译器自动调用,并且在每个生命周期中只初始化一次。要注意,构造函数并不是开空间创造对象,而是初始化对象。

特性:

1.函数名与类名相同

2.无返回值

3.对象实例化时函数自动调用对应的构造函数

4.构造函数可以重载

5.如果类中没有自定义构造函数,C++会自动生成一个无参的构造函数,一旦用户定义构造函数,编译器就不会定义。

6.无参的构造函数和全缺省的构造函数都称为默认函数。默认的构造函数只允许存在一个。(意思就是:只能存在无参和全缺省的只能存在一个)

class Date
{
public:
	Date()//无参构造函数
	{}
	//Date(int year = 1999, int month = 6, int day = 8)//带参构造函数
	//{
	//	_year = year;
	//	_month = month;
	//	_day = day;
	//}

	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	d1.Print();
	//Date d2(2019, 1, 17);
	//d2.Print();

	system("pause");
	return 0;
}

在这里插入图片描述
默认构造函数,无参构造函数会调用随机值,导致看起来似乎没什么作用?让我们看看下面的例子

class Time
{
public:
	Time()
	{
		cout << "Time" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
private:
	int _hour;
	int _minute;
	int _second;
};

class Date
{
public:
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	//基本类型(内置类型)
	int _year;
	int _month;
	int _day;
	//自定义类型
	Time s;
};

int main()
{
	Date d1;
	d1.Print();
	system("pause");
	return 0;
}

在这里插入图片描述
7.C++把类型分为内置类型(基本类型)和自定义类型。编译器生成的构造函数会对自定义类型成员调用它的默认函数。

3.析构函数

定义:

对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。

特性:

1.析构函数是在类名前加一个 ~
2.无参数无返回值
3.一个类有且只有一个析构函数
4.类的生命周期结束时,C++编译器自动调用析构函数。
5.对自定义类型成员调用析构函数。

4.拷贝函数

定义:

只有单个形参,该形参是对类类型对象的引用(用const修饰),再用已存在的类类型对象创造新类型对象时由编译器自动调用。

特性:

1.是构造函数的一个重载类型
2.参数只有一个,必须使用引用传参,使用传值方式会引起引发无穷递归

	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

3.若未显示定义,系统自动生成临时拷贝

Date d2(d1);

用上述式子调用。
4.编译器自动生成的默认拷贝构造函数可以完成字节的拷贝。

5.赋值运算重载

定义:

赋值运算重载是指具有特殊函数名的函数。
函数名字:operator后面接需要重载的运算符号
函数原型:返回值类型(operator)操作符。

注意点:

1.用于内置类型的操作符,其含义不能改变。如operator+
2.操作符有一个默认形参this,限定为第一个形参
3. ::、sizeof、?:、. 、 .* 不能做为运算符重载。
4. 重载操作符必须有一个类类型或者枚举类型的操作数

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

	bool operator == (const Date& d2)
	{
		return _year == d2._year
			&&_month == d2._month
			&&_day == d2._day;
	}
	int _year;
	int _month;
	int _day;
};

void Test()
{
	Date d1(2018, 9, 26);
	Date d2(2018, 9, 27);
	cout << (d1 == d2) << endl;
}

赋值运算符的四个要点:

1.参数类型
2.返回值
3.检查是否自己给自己赋值
4.返回*this
5.一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。

6.const成员

定义:

将const修饰的类成员函数称为const成员函数。const实际在修饰成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

问题:

  1. const对象可以调用非const成员函数吗? 不能
	原因:因为const对象在调用成员函数时会隐含的把实参把中*this修改成const class * const this,以导致非const成员函数在接收时还是使用了class *const this接收,结果就是把const的指针赋给非const的指针
  1. 非const对象可以调用const成员函数吗? 能
  2. const成员函数内可以调用其它的非const成员函数吗?能
  3. 非const成员函数内可以调用其它的const成员函数吗?不能
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值