C++类与对象进阶核心技巧

好的,以下是一份关于C++类与对象的进阶笔记:


一、构造函数进阶

1. 初始化列表
  • 用于高效初始化成员变量,特别是const成员和引用成员。
  • 语法:ClassName::ClassName(args) : member1(value1), member2(value2) {...}
cpp 复制代码
class Point {
public:
    Point(int x, int y) : x_(x), y_(y) {} // 直接初始化
private:
    int x_;
    int y_;
};
2. 委托构造函数
  • 一个构造函数调用同一类的其他构造函数。
cpp 复制代码
class Box {
public:
    Box() : Box(0, 0, 0) {} // 委托给三参数构造函数
    Box(int l, int w, int h) : length(l), width(w), height(h) {}
private:
    int length, width, height;
};

二、static成员

1. 静态数据成员
  • 属于类而非对象,所有对象共享同一份数据。
  • 需在类外初始化:
cpp 复制代码
class Counter {
public:
    static int count; // 声明
};
int Counter::count = 0; // 类外初始化
2. 静态成员函数
  • 无this指针,仅能访问静态成员。
cpp 复制代码
class Math {
public:
    static double square(double x) { return x * x; }
};

三、友元(friend)

1. 友元函数
  • 非成员函数可访问类的私有成员。
cpp 复制代码
class Rectangle {
private:
    int width, height;
    friend void printArea(const Rectangle& r); // 声明友元
};
void printArea(const Rectangle& r) {
    std::cout << r.width * r.height; // 直接访问私有成员
}
2. 友元类
  • 整个类可访问当前类的私有成员。
cpp 复制代码
class A {
    friend class B; // B是A的友元类
private:
    int secret;
};
class B {
public:
    void showSecret(A& a) { std::cout << a.secret; }
};

四、运算符重载

1. 基本语法
  • 通过成员函数或全局函数重载运算符。
cpp 复制代码
class Vector {
public:
    Vector operator+(const Vector& other) { // 成员函数重载+
        return Vector(x + other.x, y + other.y);
    }
private:
    int x, y;
};
2. 输入/输出运算符重载
cpp 复制代码
friend std::ostream& operator<<(std::ostream& os, const Vector& v) {
    os << "(" << v.x << ", " << v.y << ")";
    return os;
}

五、继承与多态

1. 虚函数与多态
  • 虚函数实现运行时多态。
cpp 复制代码
class Shape {
public:
    virtual double area() const = 0; // 纯虚函数
};
class Circle : public Shape {
public:
    double area() const override { return 3.14 * radius * radius; }
};
2. 虚函数表(vtable)
  • 编译器为含虚函数的类生成虚函数表,存储函数指针。
  • 对象通过虚指针(vptr)访问vtable。

六、深拷贝与浅拷贝

1. 拷贝构造函数
  • 默认浅拷贝可能引发资源重复释放。
  • 需自定义深拷贝:
cpp 复制代码
class String {
public:
    String(const String& other) {
        data = new char[strlen(other.data) + 1];
        strcpy(data, other.data);
    }
private:
    char* data;
};

七、const成员函数

  • 保证函数不修改对象状态。
cpp 复制代码
class Student {
public:
    int getScore() const { return score; } // 不会修改成员
private:
    int score;
};

八、移动语义(C++11)

1. 右值引用
  • 语法:T&&,用于绑定临时对象。
cpp 复制代码
void func(std::string&& s) { // s是右值引用
    std::string data = std::move(s); // 转移资源
}
2. 移动构造函数
  • 高效转移资源,避免深拷贝。
cpp 复制代码
class Buffer {
public:
    Buffer(Buffer&& other) : ptr(other.ptr) { 
        other.ptr = nullptr; // 置空原指针
    }
private:
    int* ptr;
};

这份笔记涵盖了类与对象的核心进阶知识,建议结合代码实践加深理解。

相关推荐
NEFU_Jyj2 小时前
贝尔数(组合数学)
算法
希和20272 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
Pniubi3 小时前
力扣73 矩阵置零
算法·leetcode·矩阵
布莱克60513 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
D e re k ZH16 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
石小石Orz17 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
民乐团扒谱机18 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
青少儿编程课堂18 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
武子康20 小时前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习