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;
};

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

相关推荐
leobertlan5 小时前
痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析
算法·程序员
蛋蛋的就会顺顺的5 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
开发小能手1236 小时前
答案daanC语言
数据结构·算法
Navigator_Z8 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
pride.li9 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
旺仔仔仔10 小时前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法
旺仔仔仔10 小时前
机器人项目实战(2):识别物体、提取点云,再到抓取姿态
算法
姜鱼问生10 小时前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构
启观川10 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
对空六课10 小时前
指标口径生效时间的版本查询实现
大数据·服务器·前端·算法·数据分析