在 C++ 中,struct、class 和 namespace 经常看到,都是 用于组织代码的不同方式,但它们的作用、访问权限和适用场景各不相同。借助 AI 总结了这篇博客。
Java 与 Python 中,没有看到 struct 与 namespace 的类似类型。
文章目录
- **1. 概述**
- **2. `struct`、`class` 和 `namespace` 的区别**
- **🔹 `struct`(结构体)**
- **🔹 `class`(类)**
- **🔹 `namespace`(命名空间)**
- **3. `struct` vs `class`(深度对比)**
- **🔹 继承示例**
- **4. `namespace` vs `class`**
- **🔹 `namespace` vs `class` 示例**
- **5. 什么时候使用 `struct`、`class`、`namespace`?**
- **6. 总结**
下面这个表格总结地非常清晰。
1. 概述
| 特性 | struct(结构体) | class(类) | namespace(命名空间) |
|---|---|---|---|
| 作用 | 组合多个数据成员 | 组合数据和函数 | 避免命名冲突 |
| 默认访问权限 | public | private | 无 |
| 支持成员函数 | ✅ 是 | ✅ 是 | ❌ 否 |
| 支持继承 | ✅ 是 | ✅ 是 | ❌ 否 |
| 支持构造函数/析构函数 | ✅ 是 | ✅ 是 | ❌ 否 |
| 对象实例化 | ✅ 可以创建对象 | ✅ 可以创建对象 | ❌ 不能实例化 |
| 作用域控制 | ❌ 否 | ❌ 否 | ✅ 可限定作用域 |
| 典型用途 | 纯数据结构 | 面向对象编程(OOP) | 组织全局函数和变量 |
2. struct、class 和 namespace 的区别
🔹 struct(结构体)
作用:用于存储多个相关变量,类似于 C 语言的 struct,但 C++ 允许成员函数、构造函数、继承等特性。
#include <iostream>
using namespace std;struct Person {string name;int age;// 构造函数Person(string n, int a) : name(n), age(a) {}// 成员函数void display() {cout << "Name: " << name << ", Age: " << age << endl;}
};int main() {Person p1("Alice", 25);p1.display(); // Name: Alice, Age: 25return 0;
}
特点:
- ✅ 默认 public,数据可直接访问。
- ✅ 适用于 简单的数据封装。
- ✅ 支持继承,但通常不用于面向对象编程(OOP)。
🔹 class(类)
作用:用于 面向对象编程(OOP),默认 private,强调 封装、继承、多态。
#include <iostream>
using namespace std;class Person {
private:string name;int age;public:// 构造函数Person(string n, int a) : name(n), age(a) {}// 成员函数void display() {cout << "Name: " << name << ", Age: " << age << endl;}
};int main() {Person p1("Bob", 30);// p1.name = "Charlie"; // ❌ 错误,name 是 privatep1.display(); // Name: Bob, Age: 30return 0;
}
特点:
- ✅ 默认
private,强调数据封装。 - ✅ 适用于 OOP(封装、继承、多态)。
- ✅ 需要 getter/setter 访问数据。
🔹 namespace(命名空间)
作用:用于 组织全局变量、函数、类等,避免命名冲突。
#include <iostream>
namespace Math {const double PI = 3.1415926;double square(double x) {return x * x;}
}int main() {std::cout << "PI = " << Math::PI << std::endl;std::cout << "Square of 5 = " << Math::square(5) << std::endl;return 0;
}
特点:
- ✅ 不能创建对象(仅用于组织代码)。
- ✅ 适用于 全局变量、函数、类的分类管理。
- ✅ 可以 嵌套 和 匿名命名空间。
3. struct vs class(深度对比)
| 对比点 | struct(结构体) | class(类) |
|---|---|---|
| 默认访问权限 | public | private |
| 数据封装 | ❌ 访问权限开放 | ✅ 需要 public 访问函数 |
| 适用场景 | 主要用于数据结构 | 主要用于 OOP |
| 继承方式 | 默认 public 继承 | 默认 private 继承 |
🔹 继承示例
struct BaseStruct {int x;
};struct DerivedStruct : BaseStruct { // 默认 public 继承void show() { cout << x << endl; } // ✅ x 是 public
};class BaseClass {int y;
};class DerivedClass : BaseClass { // 默认 private 继承// ❌ y 不能访问
};
📌 默认继承方式不同:
struct默认public继承,子类可以直接访问父类成员。class默认private继承,子类无法直接访问父类成员。
4. namespace vs class
| 对比点 | namespace(命名空间) | class(类) |
|---|---|---|
| 是否可实例化 | ❌ 不能创建对象 | ✅ 可以创建对象 |
| 数据成员 | ✅ 可以有全局变量 | ✅ 成员变量受访问控制 |
| 成员函数 | ✅ 可定义函数 | ✅ 可定义成员函数 |
| 访问控制 | ❌ 无访问控制 | ✅ private / public |
| 适用场景 | 组织全局变量和函数 | OOP |
🔹 namespace vs class 示例
namespace Math {double add(double a, double b) { return a + b; }
}class Calculator {
public:double add(double a, double b) { return a + b; }
};
📌 区别:
namespace不能实例化,只能用Math::add()访问。class需要创建对象才能使用,必须Calculator c; c.add()。
5. 什么时候使用 struct、class、namespace?
| 需求 | 选择 | 说明 |
|---|---|---|
| 仅存储数据 | struct | 没有访问控制要求,简单数据封装 |
| 面向对象编程(OOP) | class | 需要封装、继承、多态 |
| 组织全局变量/函数 | namespace | 避免命名冲突 |
✅ 如果只是存储数据(如 Point、Person),用 struct。
✅ 如果需要封装、继承、OOP,用 class。
✅ 如果要组织全局函数/变量,避免冲突,用 namespace。
6. 总结
| 特性 | struct | class | namespace |
|---|---|---|---|
| 默认权限 | public | private | 无 |
| 是否能实例化 | ✅ 可以 | ✅ 可以 | ❌ 不能 |
| 支持成员函数 | ✅ 是 | ✅ 是 | ❌ 否 |
| 支持继承 | ✅ 是 | ✅ 是 | ❌ 否 |
| 适用于 | 仅存储数据 | OOP 编程 | 避免命名冲突 |
🚀 推荐使用规则:
- 数据存储用
struct(如Point、Student)。 - OOP 用
class(如Person、Car)。 - 全局组织用
namespace(如Math、Utils)。
这样,你就能正确选择 struct、class 和 namespace 了 🎯🚀!
