首页 > 编程语言 > 详细

【C/C++】【类和对象】运算符重载和析构函数

时间:2020-07-16 23:04:37      阅读:55      评论:0      收藏:0      [点我收藏+]

重载运算符

本质上是一个函数

格式:

返回类型 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;

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

函数重载

系统中允许函数名字和返回值相同,函数参数不同;

构造函数的成员初始化

构造函数的成员初始化做了两件事:

  1. 函数体之前;列表初始化中进行成员变量的初始化;列表初始化中初始化顺序与成员变量在类中定义的顺序一致;
  2. 函数体;给成员变量赋值等;

析构函数的成员销毁

构造函数的成员函数干了两件事:

  1. 函数体;执行函数体;程序员销毁一些动态分配的对象释放堆内存;
  2. 函数体之后;系统接管,销毁成员变量的一些资源;

初始化和销毁时机

成员变量的初始化和销毁时机问题:先定义的先初始化,销毁时先定义的后销毁;

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

【C/C++】【类和对象】运算符重载和析构函数

原文:https://www.cnblogs.com/Trevo/p/13324524.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!