C++ 突袭

kingwzun / 2023-08-19 / 原文

基本知识

image

image

image

image

image

  • 必须在函数声明中声明默认参数!
  • 默认参数必须在形参列表的结尾!避免歧义
  • 函数声明就是函数的身份证,外部调用方不看定义只看声明

image

image

  • 和 取地址 类似

image
image

函数

overload 函数重载

image

要求:

  1. 函数的名字相同
  2. 参数列表(数量,类型)不同

注意:与返回值无关

image

问题 --避免overload歧义
image
image

image

inline 内联函数

image

内联函数:指建议编译器编译时将某个函数在调用处直接展开,避免运行时调用开销。

内联函数的要求:若一函数功能简单,则函数调用的额外开销占比较高。

image

注意:inline只是建议

  • 并不是写了 inline 关键字就一定会被内联,只是提出建议,由编译器决定是否采纳
  • 内联这个动作发生在编译时,提升运行时的效率
    image

面向对象

面向对象:既然随着系统参与实体的增多,过程变得复杂,那就不费力描述每一个可能的过程了,转而描述每一个实体
实体=属性+行为

从面向过程到面向对象 对于问题:求解不同图形的周长和面积
image

image

抽象:class 类和对象

面向对象的四个特征之1:抽象=分析问题,识别出各个实体及其属性和行为
每个实体 = 一个类class = 定义它的属性(成员变量) + 行为(成员函数)
image
例如:

class Circle {
private:
    double radius;
public:
    Circle(double radius) {
        this->radius = radius;
    }
    double getRadius() {
        return radius;
    }
};

简单理解:结构体 + 行为(成员函数) = 类

  • 事实上C++中也支持结构体定义成员方法,两者并无本质区别
  • 根据使用场景选择结构体或类:
    •结构体:主要记录数据,极少行为(如资源配置信息、网络连接信息等)
    •类:既有属性也有行为(如学生类、用户类、玩家类等)

特殊的成员函数:构造函数与析构函数

image
constructor 构造函数:对象实例化时,分配空间后,完成对象的构造工作(如初始化成员变量、分配资源等)
destructor 析构函数:对象生命周期结束时,回收空间前,完成对象的清理工作(如释放资源等
image

this 指针

• this的中文含义:这、这个、当前这个
• this指针在类定义内部使用,指向当前对象

this指针保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码。(√)

封装 Encapsulate

封装:将类的一些成员变量或方法藏起来,不允许外界直接操作

  • 不允许直接操作 ≠ 不允许操作,而是通过自定义的特定方法操作

image

getter / setter 方法
为某些私有成员变量提供外部读写方法:get_xxx(读) / set_xxx(写)

  • getter 和 setter 一般是 public 的,不然没意义
  • getter和setter函数的名字没有要求,只是一般用get_xxx,不是特殊函数。

getter函数通常会被设置为const函数,setter函数则通常接收const参数

补 const常成员函数:不能修改类成员变量,如果修改了,回过不了编译

//getter函数的通常格式(设xxx的类型为T)
T get_xxx() const {
   return xxx;
}
//setter函数的通常格式(设xxx的类型为T)
void set_xxx(const T& xxx) {
    this->xxx = xxx;
}

继承和多态