cpp笔记-运算符重载

运算符重载

  • 内置类型的运算符无法重载,只能操作自定义类型

  • 不能重载的运算符 . .* ?: :: sizeof

  • 不能有默认参数,否则会改变操作符的数量

普通函数重载

要求其中的数据成员时public的

classA operator + (const classsA & a, const classA & b){
    return classA(a._a b._a);
}

成员函数的方式进行重载

有隐含的this指针


classA operator + (const classA & other)
    return classA(_a + other._a)

友元函数重载

如果数据成员是私有的,则要以友元的形式在类外进行重载
即把其设为类的friend

前置和后置++的运算符重载

都以成员函数的形式来重载。一个返回的是引用值,一个返回的是没有更改的对象的副本。
为了区分前置和后置,可以在参数列表中多加一个int,但不代表要传递的参数

classA & operator ++(){ //前置形式
    _a ++;
    return *this;
}

classA & operator ++(int){ //后置形式
    classA temp(*this);
    _a++;
    return temp;
}

下标访问运算符


char & operator [](int idx){
   if(idx < _size && idx >= 0)
       return array[idx];
   return const char nullchar('\0');
}

函数调用运算符重载

即对小括号的重载

int MyClass :: operator ()(int a, int b, int c){
    return a + b + c;
}

MyClass mc();
cout << mc(1, 2, 3); // = 6;
  • 类中重载的函数运算符可以有记忆性,携带了状态。

函数闭包 :lambda表达式 :匿名函数


int a, b, c;
auto f = p[&](int x){ //方括号表示捕获形式,&可以访问到上下文中所有的变量并进行修改 =是值传递
    cout << "test:" << x << endl;
    ++a, ++b, c--;
}

f(100);

用struct定义函数对象

  • 不用写public和private

函数指针


void display(){
    cout << "display()" << endl;
}

void show(){
    cout << "show()" << endl;
}

void (*p) ();

p = display;

箭头运算符

  • 重载了->的对象使用起来就像指针一样,而且不需要关心栈对象所占用的空间如何回收。
  • 用对象来管理堆空间的资源
  • 智能指针的雏形

输入输出运算符重载

  • 不能以成员函数的形式进行重载,否则左操作数是对象本身了
  • 左操作数和返回值都一定是流对象
  • 注意:所有的流对象是不能进行复制构造的. 传递时只能以引用形式进行传递

std :: ostream &operator << (std::ostream & oss, const classA){
    输出
    return oss;
}
  • 输入流的重载,对象传递方式不能➕const
  • 输入流的操作要谨慎,因为无法预测用户的操作

如何保证不能复制对象

  • 方法一:拷贝/赋值构造函数私有化
  • 方法二:将两个函数删除:classA() = delete

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