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 类型对象的指针。这就是多态的实现。

静态多态

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

目录
相关文章
|
14天前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
13 3
|
5月前
|
编译器 C++
C++进阶之路:何为命名空间、缺省参数与函数重载
C++进阶之路:何为命名空间、缺省参数与函数重载
37 3
|
14天前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
12 0
|
6月前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
1月前
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
|
1月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
21 0
|
3月前
|
编译器 程序员 C语言
C++函数重载
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似: void swap1(int *a, int *b); //交换 int 变量的值 void swap2(float *a, float *b); //交换 float 变量的值 void swap3(char *a, char *b); //交换 char 变量的
C++函数重载
|
3月前
|
编译器 Linux C语言
【C++小知识】为什么C语言不支持函数重载,而C++支持
【C++小知识】为什么C语言不支持函数重载,而C++支持
|
3月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
31 5
|
4月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用