C++操作符重载总结、字面量运算符

操作符重载

  1. 基本概念

    ①.重载运算符

    重载的运算符是具有特殊名字的函数:由关键字 operator 和其后要定义的运算符号组成,也包括函数返回类型、参数列表及函数体。

    ②.函数参数

    当一个重载运算符是成员函数时,它的左侧第一个运算对象绑定到 this 指针上,即函数的显示参数数量比实际少一个。

    ③.重载运算符调用

    可以使用普通的运算表达式间接的调用重载的运算符,也可以作为普通函数显示的调用。

    data1+data2;//运算表达式间接调用
    data1.operator+(data2);//等价的成员函数调用
    
  2. 输入输出运算符

    ①.函数构成

    输入输出运算符重载函数的第一个形参是一个非 const 的 ostream\istream 对象的引用、第二个参数是要进行操作的对象的引用、函数返回对应的 形参 ostream\istream 对象的引用 。

    ②.非成员函数

    和 标准库兼容的输入输出运算符必须是普通的非成员函数,不能是类的成员函数。

    ostream & operator<<(ostream &os,const Sales_data &item)
    {
        os << item.isbin() << endl << item.revenue << endl;
        return os;
    }
    
  3. 算术运算符

    ①.函数构成

    算术运算符重载函数的函数形参通常都是运算对象的 const 引用,函数返回计算后得到新对象的副本。

    ②.非成员函数

    算术运算符和关系运算符通常定义成非成员函数,以允许对左侧对象或者右侧运算对象进行转换。

    Sales_data operator+(const Sales_data &item1,const Sales_data &item2)
    {
        Sales_data sum = item1;
        sum.revenue += item2.revenue;
        return sum;
    }
    

    ③.关系运算符

    关系运算符即判断相等、小于、大于的运算符,一般定义了相等运算符也应该定义对应的不相等运算符。

  4. 赋值运算符

    ①.函数构成:赋值运算符重载函数返回左侧运算对象的引用、右侧运算对象可以是别的类型。

    ②.成员函数:赋值运算符重载函数一般都定义为类的成员函数。

    ③.拷贝赋值运算符:右侧对象是当前类的另外一个对象的 const 左值引用,需要判断是否是自身赋值。

    ④.移动赋值运算符:右侧运算对象当前类的另外一个对象的非 const 右值引用,需要判断是否是自身赋值。

    ⑤.列表赋值:函数参数是花括号包含的元素列表

    class StrVec
    {
    public:
        StrVec & operator=(std::initializer_list);
    }
    
  5. 下标运算符

    ①.函数构成:表示容器的类通过下标运算符按位置访问元素,函数返回所访问元素的引用。

    ②.成员函数:下标运算符必须是成员函数

    ③.函数版本:下标运算符通常需要重载两个版本,即 const 版本和非 const 版本。

    class StrVec
    {
    public:
        string & operator[](std::size_t n){ return elements[n] ;}
        const string & operator[](std::size_t n) const { return elements[n] ; }
    }
    
  6. 函数调用运算符

    ①.概念:函数调用运输符即 operator()

    ②.成员函数:函数调用运算符必须是成员函数

    struct adsInt
    {
        int operator()(int val) const
        {
            return val < 0 ? -val:val;
        }
    }
    int i = -42;
    absInt obj;
    int ui = obj(i);
    
  7. 类型转换运算符

    ①.概念:类型转换运算符一般形式为:operator type( ) const,负责将一个类类型值转换成其他类型;不能转换为数组或者函数类型。

    ②.函数构成:类型转换运算符不能声明返回值类型,形参列表也必须为空。

    ③.成员函数:类型转换运算符必须是成员函数

    class SmallInt
    {
    public:
        SmallInt(int = 0):val(i) {}
        operator int() const { return val;}
    }
    

    ④.拒绝隐式转换:使用 explicit 关键字修饰重载函数,但是当表达式做条件时将会隐身执行。

    class SmallInt
    {
    public:
        SmallInt(int = 0):val(i) {}
        explicit operator int() const { return val;}
    }
    SmallInt si = 3;
    int j = static_cast(si);//显示转换
    

字面量操作符

  1. 概念

    ①.字面量运算符:即形如 【operator “” 后缀 ( )】的运算符函数;其中后缀可以自定义,比如:_C、KG等,建议以下划线开始;operator ""和用户自定义后缀直接必须有空格

    ②.字面量运算符重载函数:可以把字面值常量转换成需要的类型对象;字面量运算符不可以是成员函数。

  2. 字面量类型

    ①.字面量为整数,*那么操作符函数只可接受 unsigned long long 或者 const char *作为参数。

    ②.字面量为浮点数,操作符函数只可接受 long double 或者 const char* 为参数。

    ③.字面量为字符串,操作符函数只可接受 const char*,size_t为参数。

    ④.字面量为字符,则操作符函数只接受一个 char 为参数。

  3. 字面量操作符使用

    ①.字符串字面量

    使用字面量操作符可以简化函数参数的输入,用字面值常量代替使用多个参数构造对象。

C++操作符重载总结、字面量运算符_第1张图片

②.整数字面量

除去字符串外,后缀声明也可以作用于数值。

C++操作符重载总结、字面量运算符_第2张图片

你可能感兴趣的:(c++,c++)