文章目录
- 前言
- 继承
- 继承是什么?
- 三种访问权限的继承:
- 函数重载与运算符重载
- 函数重载
- 运算符重载
- 可重载运算符&不可重载运算符
前言
第三次学习记录,依旧是C++面向对象的内容。
继承
继承是什么?
C++中的继承是一种面向对象编程(OOP)的重要概念,它允许你创建一个新的类,通过继承已有的类的特性(成员变量和成员函数),从而实现代码的重用和构建层次结构。
当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
- 基类(也称为父类或超类):这是原始的类,它包含共享的特性和行为,通常具有更广泛的适用性。
- 派生类(也称为子类或子类):这是从基类继承特性的新类,通常包括一些新特性或行为。
创建派生类,使用class关键字后跟类名。然后使用冒号指定基类。
class BaseClass {
// 基类成员和方法
};
class DerivedClass : public BaseClass {
// 派生类成员和方法
};
一个类可以派生多个类,这意味着它可以从多个基类继承数据和函数。如下:
class Derived : public A, public B
三种访问权限的继承:
当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。
- 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
- 保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。
- 私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。
实例:
#include <iostream>
using namespace std;
// 基类 Shape
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// 基类 PaintCost
class PaintCost
{
public:
int getCost(int area)
{
return area * 70;
}
};
// 派生类
class Rectangle: public Shape, public PaintCost
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
// 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl;
// 输出总花费
cout << "Total paint cost: $" << Rect.getCost(area) << endl;
return 0;
}
函数重载与运算符重载
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。
函数重载
在C++中,函数重载是一种允许你为同一函数名创建多个不同版本的函数的机制。这些不同版本的函数在参数的类型、个数或顺序上有所不同,编译器会根据调用时提供的参数来确定应该调用哪个版本的函数。
特点:
- 函数名相同,参数列表必须不同
#include <iostream>
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
int main() {
int result1 = add(5, 3);
double result2 = add(2.5, 1.5);
int result3 = add(1, 2, 3);
std::cout << "Result 1: " << result1 << std::endl;
std::cout << "Result 2: " << result2 << std::endl;
std::cout << "Result 3: " << result3 << std::endl;
return 0;
}
这里定义了三个相同名字的 add函数,但是形参都各不相同。
编译and执行后的结果:
Result 1: 8
Result 2: 4
Result 3: 6
注意的点:
- 函数重载可以用于普通函数、成员函数包括类成员函数
- 进行函数重载时,要保证函数参数列表足够不同,以便编译器能够正确地选择要调用的函数版本
运算符重载
C++中的运算符重载是一种允许你重新定义标准C++运算符的含义的机制,以便它们适用于自定义数据类型或类对象。
运算符重载的语法:要重载一个运算符,你需要在类定义中创建一个特殊的成员函数,该成员函数的名称是**operator
**后跟要重载的运算符。
return_type operator op(parameters) {
// 运算符的重载实现
}
重载运算符的使用:一旦你重载了一个运算符,你可以在类的对象之间使用该运算符,就像标准运算符一样。编译器会调用你重载的运算符函数来执行相应的操作。
#include <iostream>
class Complex {
private:
double real;
double imag;
public:
Complex(double r, double i) : real(r), imag(i) {}
Complex operator +(const Complex& other) {
return Complex(real + other.real, imag + other.imag);
}
void display() {
std::cout << real << " + " << imag << "i" << std::endl;
}
};
int main() {
Complex a(2.0, 3.0);
Complex b(1.5, 2.5);
Complex c = a + b; // 使用重载的加法运算符
c.display();
return 0;
}
这里就是重新声明了 + 运算符的使用,原本 加法 1+1,现在的 + 号可以 实现 “1+1,2+2”的操作。
编译and执行的结果:
3.5 + 5.5i
可重载运算符&不可重载运算符
下面是可重载的运算符列表:
下面是不可重载的运算符列表: