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;
}