C++运算符重载

简介: # **C++中的运算符重载**> **C++中的运算符重载是一种特殊的函数,它允许我们改变已有的运算符的行为。在C++中,运算符可以被定义为类的成员函数或全局函数,用于对相应类型的操作数进行特定的计算。运算符重载使得我们能够自定义用户定义类型的行为,以便像内置类型一样使用**​ **在实现运算符重载时,需要注意以下几点:**1. **运算符重载函数必须是类的成员函数或全局函数。**2. **运算符重载函数的名称必须与要重载的运算符相同。**3. **运算符重载函数的参数类型和个数必须与要重载的运算符所接受的参数类型和个数相匹配。**4. **对于二元运算符,可以通

C++中的运算符重载

C++中的运算符重载是一种特殊的函数,它允许我们改变已有的运算符的行为。在C++中,运算符可以被定义为类的成员函数或全局函数,用于对相应类型的操作数进行特定的计算。运算符重载使得我们能够自定义用户定义类型的行为,以便像内置类型一样使用

在实现运算符重载时,需要注意以下几点:

  1. 运算符重载函数必须是类的成员函数或全局函数。
  2. 运算符重载函数的名称必须与要重载的运算符相同。
  3. 运算符重载函数的参数类型和个数必须与要重载的运算符所接受的参数类型和个数相匹配。
  4. 对于二元运算符,可以通过将其定义为类的成员函数或全局函数来交换操作数的顺序。
  5. 运算符重载函数应该返回适当的值类型,以便在表达式中使用。
#include<iostream>
#include <ostream>
using namespace std;
class Complex{
    private:
    int real;
    int imag;
    public:    //初始化列表
    Complex(int r = 0,int i = 0):real(r),imag(i){

    }
    //重载 + 运算符
   Complex operator +(const Complex&obj)
   {
             Complex res;
              res.real = real+obj.real;
              res.imag = imag+obj.imag;
              return res;
   }
    //重载 << 运算符
     friend ostream &operator <<(ostream&out,const Complex&obj)
     {
         cout<<obj.real<<"+"<<obj.imag<<endl;
         return out;
     }

};
int main()
{
    Complex s1(2,3);
    Complex s2(4,6);
    Complex res = s1+s2;
    cout<<res<<endl;
    return 0;
}

C++中的友元

在 C++ 中,一个类中可以有 public、protected、private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员。友元(friend)可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员。

友元语法:

  • friend关键字只出现在声明处

  • 其它类、类成员函数、全局函数都可声明为友元

  • 友元函数不是类的成员,不带 this 指针

  • 友元函数可访问对象任意成员属性,包括私有属性

#include<bits/stdc++.h>
using namespace std;
class phone{
    // write your code here......
    friend class myphone;
    private:
        int price;
    public:
        phone(int x){
            price=x;
        }
}; 
class myphone{
    private:
        phone a;
    public:
        myphone(int x):a(x){
        }
        int getprice(){
            return a.price;
        }
};
int main(){
    int p;
    cin>>p;
    myphone a(p);
    cout<<a.getprice();
    return 0;
}

C++中的继承

继承语法

class parent_class
{
    //Body of parent class
};
class child_class : access_modifier parent_class
{
   //Body of child class
};

继承是面向对象编程语言中重要的概念之一,继承的主要优点是提高代码的可重用性和可读性。当子类需要继承父类的成员和函数时,不需要再次写重复的代码;

单一继承

一个类直接继承另一个类

假设当我们有类 AB

#include<iostream>
using namespace std;
class A {
public:   //单向继承 一个类直接继承一个类
    A()
    {
        cout << "A 的 构造函数调用" << endl;   //优先调用父类构造函数
    }

};

class B :public A   
{
public:
    B()
    {
        cout << "B 的构造函数调用" << endl;
    }

};

int main()
{
    B s;
}

多级继承

多级继承则是指一个类从另一个类继承而来,并且这个类本身又作为另一个类的基类

class Animal {
public:
    void eat() { cout << "Animal eats\n"; }
};

class Mammal : public Animal {
public:
    void sleep() { cout << "Mammal sleeps\n"; }
};

class Dog : public Mammal {
public:
    void bark() { cout << "Dog barks\n"; }
};

C++中的多态

虚函数只是实现多态的一种方式

在 C++ 中,实现多态的一种常用方式是通过使用虚函数(virtual function)。虚函数是一个在基类中声明为虚拟的成员函数,在派生类中重新定义,并可以通过基类指针或引用来调用派生类的函数。

运行时多态

class Animal {
   
public:
    virtual void makeSound() {
    // 定义虚函数
        cout << "This animal makes a sound." << endl;
    }
};

class Cat : public Animal {
   
public:
    void makeSound() {
    // 重新定义虚函数
        cout << "Meow!" << endl;
    }
};

class Dog : public Animal {
   
public:
    void makeSound() {
    // 重新定义虚函数
        cout << "Woof!" << endl;
    }
};

int main() {
   
    Animal* animalPtr; // 声明一个指向 Animal 类型对象的指针

    Cat cat; // 创建 Cat 对象
    Dog dog; // 创建 Dog 对象

    animalPtr = &cat; // 指向 Cat 对象
    animalPtr->makeSound(); // 调用 Cat 的 makeSound() 函数

    animalPtr = &dog; // 指向 Dog 对象
    animalPtr->makeSound(); // 调用 Dog 的 makeSound() 函数

    return 0;
}

在上面的代码中,Animal 类包含一个名为 makeSound() 的虚函数。Cat 和 Dog 类都继承自 Animal 类,并重新定义了 makeSound() 函数。

在主函数中,我们创建了一个指向 Animal 类型对象的指针 animalPtr,并分别将其指向 Cat 和 Dog 对象。通过这种方式,我们可以调用正确的函数(Cat 的 makeSound() 或 Dog 的 makeSound()),即使只使用了指向 Animal 类型对象的指针。这就是多态的实现。

静态多态

先写到这里 ,在这里留个坑。回家会补上的!!!!!

目录
相关文章
|
2月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
120 5
|
7月前
|
编译器 C++
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
62 1
|
8月前
|
程序员 编译器 C++
C++中的运算符重载(Operator Overloading)
C++中的运算符重载(Operator Overloading)
65 1
|
4月前
|
C++
C++(十五) 运算符重载
C++中的运算符重载允许对已有运算符的功能进行重新定义,从而扩展语言功能、简化代码并提升效率。重载遵循特定语法,如 `friend 类名 operator 运算符(参数)`。重载时需注意不可新增或改变运算符数量、语义、优先级、结合性和返回类型。常见示例包括双目运算符 `+=` 和单目运算符 `-` 及 `++`。输入输出流运算符 `&lt;&lt;` 和 `&gt;&gt;` 也可重载。部分运算符只能作为成员函数重载。
|
7月前
|
存储 编译器 C++
【C++】:拷贝构造函数和赋值运算符重载
【C++】:拷贝构造函数和赋值运算符重载
37 1
|
7月前
|
C++ 索引
C++核心技术要点《运算符重载》
C++核心技术要点《运算符重载》
59 2
|
6月前
|
自然语言处理 程序员 C++
C++基础知识(五:运算符重载)
运算符重载是C++中的一项强大特性,它允许程序员为自定义类型(如类或结构体)重新定义标准运算符的行为,使得这些运算符能够适用于自定义类型的操作。这样做可以增强代码的可读性和表达力,使得代码更接近自然语言,同时保持了面向对象编程的封装性。
|
6月前
|
Java 程序员 C++
|
6月前
|
编译器 C++
【C++】详解运算符重载,赋值运算符重载,++运算符重载
【C++】详解运算符重载,赋值运算符重载,++运算符重载
|
7月前
|
编译器 C++
【C++】类和对象③(类的默认成员函数:赋值运算符重载)
在C++中,运算符重载允许为用户定义的类型扩展运算符功能,但不能创建新运算符如`operator@`。重载的运算符必须至少有一个类类型参数,且不能改变内置类型运算符的含义。`.*::sizeof?`不可重载。赋值运算符`=`通常作为成员函数重载,确保封装性,如`Date`类的`operator==`。赋值运算符应返回引用并检查自我赋值。当未显式重载时,编译器提供默认实现,但这可能不足以处理资源管理。拷贝构造和赋值运算符在对象复制中有不同用途,需根据类需求定制实现。正确实现它们对避免数据错误和内存问题至关重要。接下来将探讨更多操作符重载和默认成员函数。