C++_赋值运算符重载

Time.h

#include<iostream>
class Tmpclass
{
public:
	Tmpclass()
	{
		std::cout<<"调用了Tmpclass的构造函数"<<std::endl;
	}

	Tmpclass(Tmpclass &tmpclass)
	{
		std::cout<<"调用了TTmpclass类的拷贝构造函数"<<std::endl;
	}
};



class Time
{
 private:
	 //成员函数
	 void initTime(int tmphour,int tmpmin,int tmpsec);
	 void initMillTime(int mls);

 public:
	 Time();
	 explicit Time(int tmphour);
	 Time(int tmphour,int tmpmin);
	 explicit Time(int tmphour,int tmpmin, int tmpsec);	 

	 //拷贝构造函数
	Time(const Time &tmptime,int a=56);

	Time &operator=(const Time&);//重载的赋值运算符

	int Hour;
	int Minute;	
	int Second;

	Tmpclass c1;

};

Time.cpp

#include "Time.h"
#include <iostream>

//拷贝构造函数
Time::Time(const Time &tmptime,int a)
{
	std::cout<<"调用了Time::Time(const Time &tmptime,int a)拷贝构造函数"<<std::endl;
}

Time::Time()
{
	std::cout<<"调用了Time::Time()构造函数"<<std::endl;
}

//赋值运算符重载
Time& Time::operator=(const Time& tmpobj)
{
	this->Hour=tmpobj.Hour;
	this->Minute=tmpobj.Minute;
	this->Second=tmpobj.Second;
	std::cout<<"调用了 Time& Time::operator=(const Time& tmpobj)赋值运算符重载"<<std::endl;
	return *this; 
}

project.cpp

#include <iostream>
#include "Time.h"

//两个对象真的不能进行==比较么?是可以比较的,我们需要“重载==运算符”
//我们写一个成员函数,这个成员函数名“operator==”,这个成员函数里边 我么需要写一些逻辑

//总结:
//重载运算符:本质是一个函数。整个函数的正式名字: operator关键字 接 运算符
//既然重载运算符本质上是一个函数,那么会有返回类型和参数列表
//有一些运算符,如果我们不自己写该运算符的重载,那么系统会自动给我们生成一个,比如赋值运算符的重载

void func(Time tmpTime)
{
	return;
}

Time func()
{
	Time time;
	return time;
}

int main()
{
	Time myTime;
	myTime.Hour=9;
	myTime.Minute=30;
	Time myTime2;
	myTime2=myTime; //这个是赋值运算符,既没有调用构造函数,也没有调用拷贝构造函数
	//系统会调用一个拷贝赋值运算符
	//我们可以自己重载赋值运算符,如果我们自己不重载,编译器也会为我们生成一个(编译器格外喜欢赋值运算符)
	//编译器生成的赋值运算符重载比较粗糙,一般就是将非static成员赋值给赋值运算符左侧的对象的对应成员中去。
	//如果这个成员是个类对象的话,可能还会调用这个类的拷贝赋值运算符
	//为了精确控制Time类的赋值操作,我们往往会自己来重载赋值运算符
	//重载赋值运算符:有返回类型和参数列表,这里的参数就表示运算符的运算对象。比如这里的myTime就是运算对象
	//myTime2就是*this对象,myTime就是operator=里边的参数
	std::cout<<"myTime2.Hour= "<<myTime2.Hour<<"   myTime2.Minute= "<<myTime2.Minute<<std::endl;
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
析构函数
//析构函数:对象在销毁的时候,会自动调用析构函数。
//如果我们自己不写自己的析构函数,编译器也会生成一个默认的析构函数。默认析构函数的函数体为空{},表示默认的析构函数其实没有干什么
//构造函数里new delete
//析构函数也是类的成员函数,它的名字是由 ~类名 构成,没有返回值,不接受任何参数,不能被重载,所以一个给定的类,只有一个唯一的析构函数

//构造函数的成员初始化:干了两件事,函数体之前和函数体之中
//析构函数的成员销毁:干了两个事,函数体,函数体之后
//成员变量的初始化和销毁时机问题:先定义的先初始化,销毁时先定义的后销毁

int main()
{
	
	Time *myTime3=new Time();  
	//new 出来的东西,必须要自己释放,否则会造成内存泄漏
	//在程序停止运行之前的某个时刻,你一定要用delete把对象占用的内存释放
	delete myTime3;
	//你什么时候delete, 系统就会在什么时候去调用类Time的析构函数
	system("pause");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lz_煜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值