用成员函数和友元函数重载运算符

一元运算符

首先明白什么是一元,二元和多元运算符,比如++a、b--属于一元运算符,因为参与运算的参数只有一个,以此类推二元运算符就是参与运算的参数有两个,比如a+b。

一元运算符可以表示为:Object op\op Object

重载为成员函数为:Object.operator op(),操作数有对象Object通过this指针隐含传递。

重载为友元函数为:operator op(Object),操作数由参数表的参数Object提供。

再开始分析自增,自减操作符时,我们要理解:

前置自增、自减是参数先自增、自减运算完之后再使用(先运算,再使用)

后置自增、自减是参数先使用再自增、自减(先使用,再运算)

重载前置++和前置--操作符

全局函数

Complex &operator++(Complex &c)
{
    c.m_a++;
    c.m_b++;
    return c;
}

int main()
{
    Complex c(1, 2);
    ++c;
    c.PrintVal();
    system("pause");
    return 0;
}

成员函数

class Complex 
{
    Complex &operator--()
    {
        this->m_a--;
        this->m_b--;
        return *this;
    }
};
	
int main()
{
    Complex c(1, 2);
    --c;
    c.PrintVal();
    system("pause");
    return 0;
}

重载后置++和后置--操作符

全局函数

Complex operator++(Complex &c,int)
{
    Complex temp = c;
    c.m_a++;
    c.m_b++;
    return temp;
}

int main()
{
    Complex c(1, 2);
    c++;
    c.PrintVal();
    system("pause");
    return 0;
}

成员函数

class Complex
{
    Complex operator++(int)
    {
        Complex temp = *this;
        this->m_a++;
        this->m_b++;
        return temp;
    }
};

int main()
{
    Complex c(1, 2);
    c++;
    c.PrintVal();
    system("pause");
    return 0;
}

对于下面参数中的int,是一个占位符,作用是与前置++,前置--相区别。编译器区分用的。

Complex& operator++(Complex &c,int)
Complex &operator++(int)

运算符重载过程

1、首先承认操作符重载是一个函数,定义函数名operator++

2、分析函数参数,根据左右操作数的个数 operator++(Complex &c)

3、分析函数返回值,函数返回值充当左值 需要返回一个引用

友元函数和成员函数选择

1.、当无法修改左操作数的类时,使用全局函数进行重载

2、=、[]、()和->操作符只能通过成员函数进行重载

3、类成员函数方法无法实现 << 操作符重载

无法修改左操作数的类时,怎么理解?意思就是说我们无法修改ostream和istream类,只能通过全局函数进行重载,

用友元函数重载<<、>>操作符

  • istream 和 ostream 是 C++ 的预定义流类
  • cin 是 istream 的对象,cout 是 ostream 的对象
  • 运算符 << 由ostream 重载为插入操作,用于输出基本类型数据
  • 运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据
  • 用友员函数重载 << 和 >> ,输出和输入用户自定义的数据类型

用友员函数重载 << 和 >> ,输出和输入用户自定义的数据类型

friend ostream& operator<<(ostream &out, Complex &c)
friend istream& operator>>(istream &in, Complex &c)

注:函数返回值充当左值 需要返回一个引用

友元函数重载操作符使用注意点

1.友员函数重载运算符常用于运算符的左右操作数类型不同的情况

2.在第一个参数需要隐式转换的情况下,使用友元函数重载

3.友元函数没有this指针,所需操作数都必须在参数表中显示声明,很容易实现类型的隐式转换

你可能感兴趣的:(C\C++基础)