Featured image of post C++面向对象

C++面向对象

一点点简单的归纳

关于变量

常量

1
2
3
4
5
const typename var = val; 声明常量
char * const p 表示指针 p 指向的位置不能改变,但是指向的内容(一个 char)可以改变
const char *p 表示指针 p 指向的内容不能改变,但是指向的位置可以改变
char const *p 同理等价
const char * const p p 指向的位置和内容都不能修改

动态内存

使用 new 分配,创建对象,返回指针

1
2
3
T *p = new T[N] 分配 N 个 T 类型的对象,返回指向第一个对象的指针
delete p 释放 p 指向的内存 p 本身不会变为 NULL
delete[] p 释放 p 指向的内存

关于类

-C++ 中 class 和 struct 并无本质区别,只是默认的访问权限不同(class 默认 private,struct 默认 public)

-:: 称为域解析器(resolver),前面什么都不带则解析到自由变量 / 函数(即全局作用域内)

-成员函数直接在类内部定义的话默认为 inline(不推荐)

权限有三种:

     public:公有

     private:私有(只有同类可以访问)

          注意边界是类不是对象,成员函数中可以访问同一类的其他对象的私有成员

      protected:保护(只有同类和子类可以访问)

构造函数

  1. 命名与类名完全相同
    构造函数名称必须与类名一致,无返回值(包括 void)。

  2. 自动调用
    对象创建时由编译器自动调用,无需显式调用。

  3. 可重载
    支持多个构造函数,通过参数列表(类型、数量、顺序)区分。

  4. 访问控制
    可设为 publicprotectedprivate,影响对象创建方式(如单例模式)。

  5. 语法
    以冒号 : 开头,后跟成员变量及其初始化表达式:

    1
    2
    3
    4
    5
    6
    7
    
    class Student {
    public:
        Student(int id, const string& name) : studentId(id), studentName(name) {}
    private:
        const int studentId; // 必须使用初始化列表
        string studentName;
    };
    

必要性

  • 对const成员、引用成员、无默认构造函数的类成员必须使用初始化列表。
  • 提高性能:避免先默认初始化再赋值的额外开销。

运算符重载

运算符重载通过定义operator函数实现,支持大部分内置运算符(如+、-、==等),但部分运算符(如.、::、?:)不可重载。

示例:

1
2
3
4
5
6
class Complex {
public:
    Complex operator+(const Complex& other) {
        return Complex(real + other.real, imag + other.imag);
    }
};

若不是类对象之间的相加时,可以通过以下方法实现:

1
2
3
4
5
6
class Complex {
public:
        Complex operator+(int num) {
            return Complex(this->real + num);
        }
};

该方法可以实现int在右侧相加,若int在左侧时则需通过全局函数或友元函数重载,因成员函数无法让int作为左操作数

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class MyClass {
public:
    int value;
    MyClass(int v) : value(v) {}
    // 声明友元函数以访问私有成员(如果需要)
    friend MyClass operator+(int num, const MyClass& obj);
};
// 全局函数重载:处理 int + MyClass
MyClass operator+(int num, const MyClass& obj) {
    return MyClass(num + obj.value);
}
// 使用示例
MyClass c = 3 + a;  // 调用全局函数

处理自增自减时格式略有不同,但是不难理解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Number {
public:
    int value;
    Number(int v = 0) : value(v) {}

    // 前置++
    Number& operator++() {
        ++value;
        return *this;
    }

    // 后置++
    Number operator++(int) {
        Number temp = *this;
        ++value;
        return temp;
    }
};

流运算符重载

流运算符用于自定义类型与输入输出流的交互,使对象可直接通过cout输出或cin输入。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class Point {
public:
    friend ostream& operator<<(ostream& os, const Point& p) {
        os << "(" << p.x << ", " << p.y << ")";
        return os;
    }
    friend istream& operator>>(istream& is, Point& p) {
        is >> p.x >> p.y;
        return is;
    }
private:
    int x, y;
};
生活由投入其中的每一天构成
使用 Hugo 构建
主题 StackJimmy 设计