c++知识细节-重载运算符/拷贝赋值运算符/析构函数

c++知识细节-重载运算符/拷贝赋值运算符/析构函数

重载运算符

如何比较两个对象是否相等?
需要"重载 == 运算符".
说白了,我们要写一个成员函数,这个成员函数名为operator==,这个成员函数里边,来写一些比较逻辑.例如:

if(myTime1.Hour == myTime2.Hour)
	return true;

正式说明:
重载运算符,本质上是一个函数,整个函数的正式名字:operator关键字+运算符

(1) 既然重载运算符,本质上是一个函数,那么就会有返回类型和参数列表.

(2) 有一些运算符,如果我们不自己写该运算符的重载,那么系统会自动给我们生成一个,比如赋值运算符的重载.

拷贝赋值运算符

Time myTime;	//构造函数
Time myTime2 = myTime;	//拷贝构造函数
Time myTime5 = {myTime};	//拷贝构造函数
	
Time myTime6	//构造函数
myTime6 = myTime5;	//这个是赋值运算符,既没有调用构造函数,也没用调用拷贝构造函数
//系统会调用一个拷贝赋值运算符
//我们可以自己重载赋值运算符,如果我们自己不重载,编译器也会为我们生成一个
//编译器生成的比较粗糙.一般就是将非static成员赋值给运算符左侧的对象的对应成员中去.
//如果你这个成员是个类类型的话,可能还会调用该类的拷贝赋值运算符.
//为了精确控制Time类的赋值动作,我们往往会自己来重载赋值运算符.

赋值运算符重载

//.h
Time & operator=(const Time& tmpobj);
//.cpp
Time & operator=(const Time& tmpobj)
{
	Hour = tmpobj.Hour;
	Minute = tmpobj.Minute;
	Second = tmpobj.Second;
	
	std::cout << "调用了赋值运算符重载" << std::endl;
	return *this;
	//myTime6就是这里的this对象.myTime5就是此时的函数参数.
}

析构函数 : 相对于构造函数

(1) 对象在销毁时,会自动调用析构函数.

(2) 如果我买自己不写析构函数,编译器也会生成一个默认的析构函数,默认的析构函数函数体为空,表示默认的析构函数没有做什么有意义的事情.

(3) 析构函数也是类的成员函数,他的名字是由~接类名构成的,没有返回值,不接受任何参数,不能被重载,所以给定一个类,只有唯一的一个析构函数.

(4)析构函数的成员销毁:干了两个事,①执行析构函数的函数体 ②系统接管,销毁对象(先定义的先初始化,先定义的后销毁,不用关心).

(5)new出来的对象需要我们自己delete.否则会发生内存泄露.
new会调用构造函数;delete会调用析构函数.

//.h
~Time();
//.cpp
Time::~Time()
{
	std::cout << "调用了析构函数" << std::endl;
}

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