本质上是一个函数
格式:
返回类型 operator 运算符(参数列表)
赋值运算符如果缺省,系统会自动生成一个;比较运算符不会;
Time mytime; //调用无参构造函数
Time mytime2 = mytime; //定义初始化 调用了拷贝构造函数
mytime2 = mytime; //赋值运算符 没有调用(拷贝)构造函数 赋值拷贝运算符重载
系统会调用一个拷贝赋值运算符 可以自己重载赋值运算符, 编译器会自动为我们生成一个 编译器生成的赋值运算符重载比较粗糙,一般就是将非static成员赋值给赋值运算符左侧的对象的成员中去;如果成员是类对象,可能还会调用这个类的拷贝赋值运算符;
为了精确控制自定义类的赋值动作,我们会自己来重载赋值运算符;
重载赋值运算符,有返回类型和参数列表,这个参数就表示运算符的运算对象;
重载赋值运算符一般为public
#include <iostream>
using namespace std;
//类定义(类声明)
class Time
{
public:
int Hour = 0; //小时
int Minue = 0; //分钟
int Second = 0; //秒钟
public:
//构造函数
Time();
//...
//拷贝构造函数
Time(const Time& tmptime);
Time& operator=(const Time&);//重载的赋值运算符
private:
//...
};
Time::Time()
{
std::cout << "Time::Time()" << std::endl;
}
Time::Time(const Time& tmptime) :Hour(tmptime.Hour), Minue(tmptime.Minue), Second(tmptime.Second)
{
std::cout << "Time::Time(Time &tmptime, int a)" << std::endl;
}
Time func()
{
Time tmpTime;
return tmpTime;
}
Time& Time::operator=(const Time&)
{
cout << "Time& Time::operator=(const Time&)" << endl;
return *this;
}
int main()
{
Time myTime;
Time myTime2 = myTime;
Time myTime3;
myTime3 = myTime; //Time& Time::operator=(const Time& tmpTime)
return 0;
}
对象在销毁的时候,会自动调用析构函数,如果自己不写析构函数,编译器会生成一个默认的析构函数。默认析构函数函数体为空,表示默认的析构函数啥也没做;如果涉及到动态分配内存,构造函数里new,析构函数里delete;
析构函数也是类的成员函数,名字由~接着类名构成,没有返回值,不接受任何参数,不能被重载,所以一个给定的类,只有唯一一个析构函数;
系统中允许函数名字和返回值相同,函数参数不同;
构造函数的成员初始化做了两件事:
构造函数的成员函数干了两件事:
成员变量的初始化和销毁时机问题:先定义的先初始化,销毁时先定义的后销毁;
程序员自己new的对象一定要delete;配对使用;不然会造成内存泄漏;
#include <iostream>
using namespace std;
//类定义(类声明)
class Time
{
public:
int Hour = 0; //小时
int Minue = 0; //分钟
int Second = 0; //秒钟
public:
//构造函数
Time();
Time(int hour, int min, int second);
//...
//拷贝构造函数
Time(const Time& tmptime);
Time& operator=(const Time&);//重载的赋值运算符
private:
//...
};
Time::Time()
{
std::cout << "Time::Time()" << std::endl;
}
Time::Time(int hour, int min, int second):Hour(hour), Minue(min), Second(second)
{
std::cout << "Time::Time(int hour, int min, int second)" << std::endl;
}
Time::Time(const Time& tmptime) :Hour(tmptime.Hour), Minue(tmptime.Minue), Second(tmptime.Second)
{
std::cout << "Time::Time(Time &tmptime, int a)" << std::endl;
}
Time func()
{
Time tmpTime;
return tmpTime;
}
Time& Time::operator=(const Time&)
{
cout << "Time& Time::operator=(const Time&)" << endl;
return *this;
}
int main()
{
Time* myTime1 = new Time; //调用不带参数的构造函数
Time* myTime2 = new Time(); //调用不带参数的构造函数
Time* myTime3 = new Time(1,2,3); //调用有参数的构造函数
delete myTime1;
delete myTime2;
delete myTime3;
return 0;
}
原文:https://www.cnblogs.com/Trevo/p/13324524.html