C++中的函数重载

简介: C++的运算符重载允许改变运算符行为,使其能应用于自定义类型。重载函数可为类成员或全局函数,需匹配运算符原本的参数和返回类型。示例展示了如何重载`+`和`<<`运算符。此外,友元函数能访问类的私有成员,增加代码灵活性。继承是OOP的关键特性,如单一继承(类B直接继承类A)和多级继承(类D继承类C,类C继承类B)。多态通过虚函数实现,允许基类指针调用派生类的方法,如`Animal`的`makeSound()`在`Cat`和`Dog`中的不同实现。

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月前
|
编译器 Linux C语言
我的C++奇迹之旅相遇:支持函数重载的原理
我的C++奇迹之旅相遇:支持函数重载的原理
|
2月前
|
存储 安全 编译器
【C++专栏】C++入门 | 函数重载、引用、内联函数
【C++专栏】C++入门 | 函数重载、引用、内联函数
32 0
|
1月前
|
编译器 C++
C++进阶之路:何为命名空间、缺省参数与函数重载
C++进阶之路:何为命名空间、缺省参数与函数重载
22 3
|
2月前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
3天前
|
算法 编译器 C++
C++基础知识(三:哑元和内联函数和函数重载)
在C++编程中,"哑元"这个术语虽然不常用,但可以理解为在函数定义或调用中使用的没有实际功能、仅作为占位符的参数。这种做法多见于模板编程或者为了匹配函数签名等场景。例如,在实现某些通用算法时,可能需要一个特定数量的参数来满足编译器要求,即使在特定情况下某些参数并不参与计算,这些参数就可以被视为哑元。
|
12天前
|
存储 安全 编译器
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
11 0
|
2月前
|
程序员 编译器 C++
C++中的函数重载(Function Overloading)
C++中的函数重载(Function Overloading)
21 2
|
17天前
|
编译器 C++
C++对C的改进和拓展\域解析符、形参默认值、函数重载
C++对C的改进和拓展\域解析符、形参默认值、函数重载
11 0
|
1月前
|
算法 编译器 C++
C++多态与虚拟:函数重载(Function Overloading)
重载(Overloading)是C++中的一个特性,允许不同函数实体共享同一名称但通过参数差异来区分。例如,在类`CPoint`中,有两个成员函数`x()`,一个返回`float`,另一个是设置`float`值。通过函数重载,我们可以为不同数据类型(如`int`、`float`、`double`)定义同名函数`Add`,编译器会根据传入参数自动选择正确实现。不过,仅返回类型不同而参数相同的函数不能重载,这在编译时会导致错误。重载适用于成员和全局函数,而模板是另一种处理类型多样性的方式,将在后续讨论中介绍。
|
2月前
|
编译器 C语言 C++
【C++入门】缺省参数、函数重载与引用(上)
【C++入门】缺省参数、函数重载与引用