C++ 类与对象实战指南:封装、构造函数、析构函数与访问控制
什么是类?
C++ 类是用户自定义数据类型,将数据及操作该数据的函数打包为单一实体。可视为蓝图:定义从它创建的对象的结构与行为。
正如房屋蓝图规定门窗房间布局,类描述其数据成员布局及操作它们的函数。同一蓝图可建造多栋房屋(对象)。

上图中,单一原型生成两个功能不同的房屋。
本教程你将学到:
- 类的概念及其在 C++ 中的重要性
- 具体类示例
private与public访问修饰符的作用- 如何创建对象(实例化)
- 安全访问数据成员
- 类内与类外定义成员函数
- 构造函数与析构函数实战
类声明
声明类很简单:用 class 关键字加类名,花括号包裹主体。
语法
class className { // data members // member functions };
- className – 类的标识符。
- 数据成员通常声明为变量。
- 成员函数提供行为。
访问修饰符:private 与 public
访问修饰符控制类成员可见性。
- private – 成员仅在类内部或友元中可访问。
- public – 对象可见处均可访问成员。
创建对象(实例化)
对象是类的实例。声明对象模式同变量:className objectName;
语法
className objectName;
- className – 创建对象的类。
- objectName – 新对象的标识符。
实例化为对象分配内存并可能触发构造函数。
访问数据成员
公有数据成员用点运算符(.)访问。
示例
#include <iostream> using namespace std; class Phone { public: double cost; int slots; }; int main() { Phone Y6; Phone Y7; Y6.cost = 100.0; Y6.slots = 2; Y7.cost = 200.0; Y7.slots = 2; cout << "Cost of Huawei Y6 : " << Y6.cost << endl; cout << "Cost of Huawei Y7 : " << Y7.cost << endl; cout << "Number of card slots for Huawei Y6 : " << Y6.slots << endl; cout << "Number of card slots for Huawei Y7 : " << Y7.slots << endl; return 0; }
输出:

为什么使用 Getter/Setter?
直接访问或修改数据会破坏封装。使用 getter 和 setter 成员函数提供受控访问。
封装示例
#include <iostream> using namespace std; class ClassA { public: void setA(int val); int getA() const; private: int a; }; int ClassA::getA() const { return a; } void ClassA::setA(int val) { a = val; } int main() { ClassA obj; obj.setA(20); cout << "Value of a is: " << obj.getA(); return 0; }
输出:

受保护成员与继承
受保护成员在类内及派生类中可访问,支持受控继承。
示例
#include <iostream> using namespace std; class ParentClass { protected: int value; }; class ChildClass : public ParentClass { public: void setId(int x) { value = x; } void displayValue() { cout << "Value is: " << value << endl; } }; int main() { ChildClass c; c.setId(21); c.displayValue(); return 0; }
输出:

成员函数:类内定义 vs 类外定义
成员函数可内联定义于类内,或在类内声明、类外用作用域解析运算符 :: 定义。
示例
#include <iostream> #include <string> using namespace std; class Guru99 { public: string tutorial_name; int id; void printName(); void printId() { cout << "Tutorial id is: " << id; } }; void Guru99::printName() { cout << "Tutorial name is: " << tutorial_name; } int main() { Guru99 guru; guru.tutorial_name = 'C++'; guru.id = 1001; guru.printName(); cout << endl; guru.printId(); return 0; }
输出:

构造函数与析构函数
构造函数在对象创建时初始化,析构函数在对象销毁前清理。
示例
#include <iostream> using namespace std; class ClassA { public: ClassA() { cout << "Class constructor called" << endl; } ~ClassA() { cout << "Class destructor called" << endl; } }; int main() { ClassA a; // 构造函数调用 int p = 1; if (p) { ClassA b; // 构造函数调用,块结束时析构 } // 此处析构 'a' return 0; }
输出:

核心要点
- C++ 本质是面向对象的;类是构建基石。
- 类将数据与相关函数分组,创建可复用蓝图。
- 用
public、private、protected强制封装。 - 用类名加对象名实例化对象。
- 公有成员用点运算符访问;私有数据用 getter/setter。
- 成员函数可内联定义或类外用
::定义。 - 构造函数初始化对象;析构函数处理清理。
C语言
- C# 类与对象:面向对象编程的基石
- C++类与对象:面向对象编程实战指南
- C++ 友元函数与友元类:突破访问控制的利器
- C++ 类模板实战指南:编写灵活的类型无关代码
- C++ 运算符全解析:类型、示例与示例程序
- 掌握 C++ switch-case:语法、用法与实战示例
- C++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理
- C++ 结构体详解:定义、初始化、指针、函数参数与局限性
- 掌握 C++ std::list:语法、函数与实战示例
- C++ Struct 与 Class 核心差异、语法及最佳实践
- C# 抽象类实战教程:从定义到派生的完整代码示例
- 精通 Java:理解对象、类与核心 OOP 概念