2022.9.30实训笔记

48 阅读2分钟

运算符重载

就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 运算符重载的本质是函数重载。 你可以重定义或重载大部分 C++ 内置的运算符。例如 + 、 - 、 * 、 / 、 ++、--、>>、<<等

返回类型 operator 运算符名称(形参列表) { 
        重载实体; 
 }

可以把上面的 [ operator 运算符名称 ] 看作新的函数名。

  1. C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载;
  2. C++中不允许重载的运算符:成员运算符(.)、成员选择运算符(.*)、域解析运算符(::)、条件运算符(?:)、类型大小运算符 (sizeof)
  3. 重载不能改变运算符运算对象(即操作数)的个数;如,关系运算符“>”和“<”等是双目运算符,重载后仍为双目运算符,需要两个参数。
  4. 运算符”+“,”-“,”*“,”&“等既可以作为单目运算符,也可以作为双目运算符,可以分别将它们重载为单目运算符或双目运算符。
  5. 重载不能改变运算符的优先级别;
  6. 重载不能改变运算符的结合性。如,复制运算符”=“是右结合性(自右至左),重载后仍为右结合性;
  7. 重载运算符的函数不能有默认的参数;
  8. 重载运算符的运算中至少有一个操作数是自定义类;
  9. 对运算符的重载,不应该失去其原有的意义;

重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

复数类

class Complex {
public:
    Complex(int r, int v){
        this->r = r;
        this->v = v;
    }

    Complex operator+(Complex& c){   //类内重载
        int r = this->r + c.r;
        int v = this->v + c.v;
        Complex cs(r, v);
        return cs;
    }

    friend Complex operator-(const Complex &, const Complex &);

    void show(){
        if(r == 0){
            printf("%di\n", v);
        }else if(v == 0){
            printf("%d\n", r);
        }else if(v < 0){
            printf("%d%di\n", r, v);
        }else{
            printf("%d+%di\n", r, v);
        }
    }

private:
    int r, v;
};

Complex operator-(const Complex &a, const Complex &b){  //作为友元函数实现类外重载
    int r = a.r - b.r;
    int v = a.v - b.v;
    Complex cs(r, v);
    return cs;
}

int main(){
    Complex c1(1, 2), c2(3, 4);
    (c1+c2).show();
    (c1-c2).show();
    return 0;
}

单例

单例模式保证一个类只有一个实例,并且提供了一个访问全局访问点。 单例是设计模式里面的一种,全局有且只有一个类的static实例,在程序任何地方都能够调用到。

  • 1.全局只有一个实例:static 特性,同时禁止用户自己声明并定义实例(把构造函数设为 private)
  • 2.线程安全
  • 3.禁止赋值和拷贝
  • 4.用户通过接口获取实例:使用 static 类成员函数

cout<<c 会被解释成 operator<<(cout, c)

参数 os 只能是 ostream 的引用,而不能是 ostream 对象,因为 ostream 的复制构造函数是私有的,没有办法生成 ostream 参数对象。

operator<< 函数的返回值类型设为 ostream &,并且返回 os,就能够实现<<的连续使用,如cout<<c<<5 ERROR: must take exactly one argument 类内重载二元运算符时,只需要一个参数,另一个参数由this指针传入,这里如果需要传入两个参数,需要放到类外定义,声明友元(访问私有成员)。

拷贝构造函数


复制构造函数是一种特殊的构造函数,其形参为本类的对象引用。作用是用一个已知的对象去初始化同类型的新对象。

image.png