【C++知识点】重载

简介: 【C++知识点】重载

重载

函数重载

类里面跟普通函数重载类似:

class PrintFunc{
public: 
    void print(int i) {
        cout << i << endl; 
    } 
    void print(double f) {
        cout << f << endl;
    } 
    void print(char c[]) { 
        cout <<c << endl;
    }
};

运算符重载

运算符重载的本质为函数重载,但有一定的规则需要遵循。

  1. 重载运算符时,运算符的运算顺序和优先级不变,操作数个数不变。
  2. 不能创造新的运算符,只能重载C++中已有的运算符,并且规定有6个运算符不能重载,如表所示。
  3. 微信截图_20230619210618.png运算符重载是针对新类型的实际需求,对原有的运算符进行适当的改造。一般来讲,重载后的运算符的功能应当与运算符的实际意义相符。

运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。

运算符重载为类的成员函数的一般语法形式为: 
函数类型 operator 运算符(形参表)
{  
    函数体;
} 
运算符重载为类的友元函数的一般语法形式为:
friend 函数类型 operator 运算符(形参表) 
{  
    函数体;
}

由于运算符种类与数量较多,以以下4大类中的一些符号来讲解。4大类:

  1. 赋值运算符的重载
  2. 算术运算符的重载
  3. 关系运算符的重载
  4. 其他较为特殊的重载

赋值运算符的重载

class Student{
private:
    string name;
    int age;
public:
    Student(){
        name = "zs";
        age = 20;
    }
    Student(string name,int age){
        this->name = name;
        this->age = age;
    }
    void operator=(const Student &t){
        this->name = t.name;
        this->age = t.age;
    }
    void printInfo(){
        cout << this->name << " " << this->age <<endl;
    }
};
int main(){
    Student s1,s2("王五",30);
    s2.printInfo();
    s2 = s1; //使用赋值运算符
    s2.printInfo();
    return 0;
}

算术运算符的重载

class complex{
public:
    complex(){}
    complex(double r,double i){
        this->r = r;
        this->i = i;
    }
    complex operator+(complex &c){
        complex c2;
        c2.r = this->r + c.r;
        c2.i = this->i + c.i;return c2; 
    }
    complex operator-(complex &c){
        complex c2;
        c2.r = this->r - c.r;
        c2.i = this->i - c.i;
        eturn c2; 
    }
    void print(){
        cout << this->r <<" " << this->i <<endl;
    }
private:
    double r,i;
};
int main(){
    complex c1(11,12),c2(10,11),c3,c4;
    c3 = c1 + c2;
    c3.print();
    c4 = c1 - c2;
    c4.print();
}

关系运算符的重载

class Student{
    private:
    string name;
    int age;
    public:
    Student(){}
    Student(string name,int age){
        this->name = name;
        this->age = age;
    }
    bool operator>(Student &t){
        if(this->name > t.name){
            return true;
        }else{
            return false;
        }
    }
};
int main(){
    Student s1("aaa",11),s2("bbb",22);
    bool b = s2 > s1; //bool b = s1 < s2; bool b = s2 > s1;
    cout << b << endl;
    return 0;
}

其他较为特殊的重载

const int SIZE = 5;
class Safearr{
    private:
    int arr[SIZE];
    public:
    Safearr(){
        register int i = 0;
        for(;i<SIZE;i++){
            arr[i] = i;
        }
    }
    int operator[](int i){
        if(i >=SIZE){
            cout << "下标超过最大值" <<endl;
            return -1;
        }
        return arr[i];
    }
};
int main(){
    Safearr arr;
    cout << arr[1] <<endl;cout << arr[100] <<endl;
    return 0;
}
目录
相关文章
|
6月前
|
编译器 C++
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
53 1
|
3月前
|
C++
C++(十九)new/delete 重载
本文介绍了C++中`operator new/delete`重载的使用方法,并通过示例代码展示了如何自定义内存分配与释放的行为。重载`new`和`delete`可以实现内存的精细控制,而`new[]`和`delete[]`则用于处理数组的内存管理。不当使用可能导致内存泄漏或错误释放。
|
6月前
|
存储 网络协议 编译器
【干货总结】Linux C/C++面试知识点
Linux C/C++基础与进阶知识点,不仅用于面试,平时开发也用得上!
597 21
|
5月前
|
NoSQL 编译器 Redis
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
|
5月前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
5月前
|
NoSQL Redis C++
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
|
6月前
|
安全 程序员 C++
C++一分钟之-重载运算符
【6月更文挑战第21天】C++的运算符重载让程序员能为自定义类型定制运算符行为,增强代码表达力。但要注意清晰性、优先级和返回类型。遵循运算符原有意义,充分测试,并用注释解释非直观设计。示例展示了如何为复数类重载`+`运算符。避免重载内置类型,注意结合性,且慎用隐式转换。重载应提升可读性而非复杂化代码。
48 2
|
7月前
|
C++ 编译器
|
7月前
|
编译器 C语言 C++
【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)
【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)
36 1
【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)
|
6月前
|
C++
C++函数的默认参数、占位符、重载
C++函数的默认参数、占位符、重载