好的,以下是一份关于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;
};
这份笔记涵盖了类与对象的核心进阶知识,建议结合代码实践加深理解。