C++类与对象深度解析
深度剖析 C++ 之类和对象(上)
类的基本概念
在 C++ 中,类是面向对象编程的核心概念。类是一种用户自定义的数据类型,用于封装数据和操作数据的方法。类的定义通常包括成员变量和成员函数。成员变量用于存储对象的状态,成员函数用于定义对象的行为。
class MyClass {
public:
int myVar; // 成员变量
void myFunc() { // 成员函数
// 函数实现
}
};
访问控制与封装
C++ 提供了三种访问控制修饰符:public、private 和 protected。这些修饰符用于控制类成员的访问权限,实现封装。
public:成员可以被类的外部代码直接访问。private:成员只能在类的内部访问,外部代码无法直接访问。protected:成员可以在类的内部和派生类中访问。
class Example {
public:
int publicVar; // 公有成员
private:
int privateVar; // 私有成员
protected:
int protectedVar; // 保护成员
};
构造函数与析构函数
构造函数用于初始化类的对象,析构函数用于在对象销毁时释放资源。构造函数可以重载,析构函数只能有一个且没有参数。
class Person {
public:
Person() { // 默认构造函数
name = "Unknown";
age = 0;
}
Person(string n, int a) { // 带参数的构造函数
name = n;
age = a;
}
~Person() { // 析构函数
cout << "Object destroyed." << endl;
}
private:
string name;
int age;
};
对象的内存布局
对象在内存中的布局取决于其成员变量的顺序和访问控制修饰符。通常情况下,成员变量按照声明的顺序存储在内存中。编译器可能会在成员变量之间插入填充字节以满足对齐要求。
class MemoryLayout {
public:
char a; // 1 字节
int b; // 4 字节
char c; // 1 字节
};
// 实际内存占用可能大于 6 字节,因为对齐要求
静态成员
静态成员属于类本身,而不是类的某个对象。静态成员变量在所有对象之间共享,静态成员函数只能访问静态成员变量。
class StaticExample {
public:
static int count; // 静态成员变量
StaticExample() {
count++;
}
static void showCount() { // 静态成员函数
cout << "Count: " << count << endl;
}
};
int StaticExample::count = 0; // 静态成员变量初始化
友元函数与友元类
友元函数和友元类可以访问类的私有成员和保护成员。友元关系破坏了封装性,但在某些情况下是必要的。
class FriendExample {
private:
int secret;
public:
FriendExample(int s) : secret(s) {}
friend void showSecret(FriendExample& fe); // 友元函数
};
void showSecret(FriendExample& fe) {
cout << "Secret: " << fe.secret << endl;
}
运算符重载
运算符重载允许为类定义特定的运算符行为。运算符重载可以是成员函数或友元函数。
class Complex {
public:
Complex(double r, double i) : real(r), imag(i) {}
Complex operator+(const Complex& other) { // 成员函数重载
return Complex(real + other.real, imag + other.imag);
}
friend ostream& operator<<(ostream& os, const Complex& c); // 友元函数重载
private:
double real, imag;
};
ostream& operator<<(ostream& os, const Complex& c) {
os << c.real << " + " << c.imag << "i";
return os;
}
继承与多态
继承是面向对象编程的重要特性,允许派生类继承基类的成员。多态通过虚函数实现,允许派生类重写基类的函数。
class Base {
public:
virtual void show() { // 虚函数
cout << "Base class" << endl;
}
};
class Derived : public Base {
public:
void show() override { // 重写虚函数
cout << "Derived class" << endl;
}
};
总结
类和对象是 C++ 面向对象编程的基础。通过封装、继承和多态,可以实现代码的复用和模块化。理解类的内存布局、访问控制和运算符重载等概念,有助于编写高效且易于维护的代码。
BbS.okane408.info/PoSt/1121_608053.HtM
BbS.okane409.info/PoSt/1121_545096.HtM
BbS.okane410.info/PoSt/1121_920614.HtM
BbS.okane411.info/PoSt/1121_663764.HtM
BbS.okane412.info/PoSt/1121_317431.HtM
BbS.okane413.info/PoSt/1121_318933.HtM
BbS.okane414.info/PoSt/1121_730830.HtM
BbS.okane415.info/PoSt/1121_735381.HtM
BbS.okane416.info/PoSt/1121_483039.HtM
BbS.okane417.info/PoSt/1121_063700.HtM
BbS.okane408.info/PoSt/1121_863675.HtM
BbS.okane409.info/PoSt/1121_028222.HtM
BbS.okane410.info/PoSt/1121_522222.HtM
BbS.okane411.info/PoSt/1121_120378.HtM
BbS.okane412.info/PoSt/1121_955778.HtM
BbS.okane413.info/PoSt/1121_116847.HtM
BbS.okane414.info/PoSt/1121_180314.HtM
BbS.okane415.info/PoSt/1121_462382.HtM
BbS.okane416.info/PoSt/1121_629064.HtM
BbS.okane417.info/PoSt/1121_649603.HtM
BbS.okane408.info/PoSt/1121_322528.HtM
BbS.okane409.info/PoSt/1121_068994.HtM
BbS.okane410.info/PoSt/1121_602242.HtM
BbS.okane411.info/PoSt/1121_296328.HtM
BbS.okane412.info/PoSt/1121_059737.HtM
BbS.okane413.info/PoSt/1121_823658.HtM
BbS.okane414.info/PoSt/1121_461307.HtM
BbS.okane415.info/PoSt/1121_300091.HtM
BbS.okane416.info/PoSt/1121_557766.HtM
BbS.okane417.info/PoSt/1121_008733.HtM
BbS.okane408.info/PoSt/1121_473411.HtM
BbS.okane409.info/PoSt/1121_200438.HtM
BbS.okane410.info/PoSt/1121_565776.HtM
BbS.okane411.info/PoSt/1121_404914.HtM
BbS.okane412.info/PoSt/1121_932331.HtM
BbS.okane413.info/PoSt/1121_631405.HtM
BbS.okane414.info/PoSt/1121_049976.HtM
BbS.okane415.info/PoSt/1121_440662.HtM
BbS.okane416.info/PoSt/1121_155382.HtM
BbS.okane417.info/PoSt/1121_809143.HtM
BbS.okane408.info/PoSt/1121_985059.HtM
BbS.okane409.info/PoSt/1121_529423.HtM
BbS.okane410.info/PoSt/1121_789202.HtM
BbS.okane411.info/PoSt/1121_087609.HtM
BbS.okane412.info/PoSt/1121_649660.HtM
BbS.okane413.info/PoSt/1121_481598.HtM
BbS.okane414.info/PoSt/1121_467305.HtM
BbS.okane415.info/PoSt/1121_714190.HtM
BbS.okane416.info/PoSt/1121_188394.HtM
BbS.okane417.info/PoSt/1121_041242.HtM
BbS.okane408.info/PoSt/1121_993565.HtM
BbS.okane409.info/PoSt/1121_698595.HtM
BbS.okane410.info/PoSt/1121_136997.HtM
BbS.okane411.info/PoSt/1121_117715.HtM
BbS.okane412.info/PoSt/1121_388187.HtM
BbS.okane413.info/PoSt/1121_112968.HtM
BbS.okane414.info/PoSt/1121_399191.HtM
BbS.okane415.info/PoSt/1121_955645.HtM
BbS.okane416.info/PoSt/1121_415774.HtM
BbS.okane417.info/PoSt/1121_556232.HtM
BbS.okane418.info/PoSt/1121_030958.HtM
BbS.okane419.info/PoSt/1121_572132.HtM
BbS.okane420.info/PoSt/1121_772925.HtM
BbS.okane421.info/PoSt/1121_276362.HtM
BbS.okane422.info/PoSt/1121_343030.HtM
BbS.okane423.info/PoSt/1121_410627.HtM
BbS.okane424.info/PoSt/1121_753298.HtM
BbS.okane425.info/PoSt/1121_614891.HtM
BbS.okane426.info/PoSt/1121_627353.HtM
BbS.okane427.info/PoSt/1121_647000.HtM
BbS.okane418.info/PoSt/1121_183239.HtM
BbS.okane419.info/PoSt/1121_852615.HtM
BbS.okane420.info/PoSt/1121_837027.HtM
BbS.okane421.info/PoSt/1121_465339.HtM
BbS.okane422.info/PoSt/1121_345901.HtM
BbS.okane423.info/PoSt/1121_425524.HtM
BbS.okane424.info/PoSt/1121_324246.HtM
BbS.okane425.info/PoSt/1121_134383.HtM
BbS.okane426.info/PoSt/1121_988164.HtM
BbS.okane427.info/PoSt/1121_039358.HtM

