在 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
了 🎯🚀!