赋值运算符重载和内联函数

一、赋值运算符重载
1、概念:
重载操作符是具有特殊函数名的函数,关键字operator后面接需要定义的操作符符号。操作符重载也是一个函数,具有返回值和形参表。它的形参数目与操作符的操作数目相同,使用运算符重载可以提高代码的可读性。
不可以重载的运算符 :
· 成员选择符
·* 成员对象选择符
:: 作用域解析操作符
?: 条件操作符
sizeof

除了赋值符号外,基类中被重载的操作符都将被派生类继承。

2、特点

·不能通过连接其他符号来创建新的操作符:比如operator@
·重载操作符必须有一个类类型或枚举类型的操作数
·用于内置类型的操作符,其含义不能改变
·作为类成员的重载函数,其形参看起来比操作数数目少1,因为成员函数的操作符有一个默认的形参this,限定为第一个形参;
·一般将算术操作符定义为非成员函数,将赋值运算符定义为成员函数
·操作符定义为非类的成员函数时,一般将其定义为类的友元
·== 和 != 操作符一般要成对重载
·下标操作符[]:一个是非const成员并返回引用,一个是const成员并返回引用
·解引用操作符*和->操作符,不显示任何参数
·前置++/--必须返回被增量或减量的引用,后缀式操作符必须返回旧值,并且应是值返回而非引用
·输入操作符>>和输出操作符<<必须定义为类的友元函数
class Date
{
public:
    Date(int year = 2018, int month = 8, int day = 7)
        : _year(year)
        , _month(month)
        , _day(day)
    {
        cout << "Date(int,int,int):" << this << endl;
    }

    // 用已经存在的对象构造新对象
    Date(const Date& d)
        : _year(d._year)
        , _month(d._month)
        , _day(d._day)
    {
        cout << "Date(const Date&):" << this << endl;
    }

    Date& operator=(const Date& d)
    {
        if (this != &d)
        {
            _year = d._year;
            _month = d._month;
            _day = d._day;
        }

        return *this;
    }
    // 前置++
    Date& operator++()
    {
        _day += 1;
        return *this;
    }

    // 后置++
    Date operator++(int)
    {
        Date temp(*this);
        _day += 1;
        return temp;
    }

    //前置--
    Date& operator--()
    {
        _day -= 1;
        return *this;
    }

    //后置--
    Date operator--(int)
    {
        Date temp(*this);
        _day -= 1;
        return temp;
    }

二、内联函数
1、概念:
用inline修饰的函数叫做内联函数,**编译时**C++编译器会进行代码替换,没有函数压栈的开销,故内联函数可以提升程序的运行效率。
2、特性:

·inline是一种以空间换时间的做法,省去了调用函数的开销,所以代码很长或者有循环/递归的函数不适合使用内联
·inline对于编译器而言,只是一个建议,编译器会自动优化,若定义为inline的函数体内有循环/递归等,编译器优化时会忽略掉内联
·inline必须与函数定义放在一起,才能形成内联函数,仅将inline放在函数声明前是不起作用的
·定义在类内的成员函数默认为是内联函数

3、宏和内联函数的区别:
宏优点:可以提高运行效率;
宏缺点:

    (1)不会进行类型检测;
    (2)代码膨胀;
    (3)有副作用(++);
    (4)不能调试.

内联函数的优点:

(1)内联函数在编译时会进行类型检测,而宏不会;
(2)内联函数没有副作用;
(3)可以进行调试.

内联函数的缺点:

(1)编译效率降低(编译时进行代码替换);
(2)代码膨胀.

4、注意:
· 在C++中强制建议使用const代替宏常量,使用内联函数代替宏函数,因为const和内联函数在编译时不仅进行代码替换,而且还会进行类型检测,提高了程序的安全性。
· 内联函数可以是普通函数,也可以是类的成员函数;函数式宏不能作为类的成员函数。

猜你喜欢

转载自blog.csdn.net/weixin_41289858/article/details/81485852