C++ class和struct的区别
在C++中,class
和struct
本质上非常相似,它们都可以用来定义用户自定义类型,并且都可以包含数据成员和成员函数。但是,它们之间有一些关键的区别和习惯用法:
1. 默认访问控制
class
:- 默认访问控制是**
private
**。
- 默认访问控制是**
struct
:- 默认访问控制是**
public
**。
- 默认访问控制是**
示例:
class MyClass {int a; // 默认是private
};struct MyStruct {int a; // 默认是public
};int main() {MyClass obj1;MyStruct obj2;// obj1.a = 10; // 错误,`a`是privateobj2.a = 10; // 正确,`a`是publicreturn 0;
}
2. 面向对象编程习惯
class
:- 通常用于定义面向对象的复杂类型。
- 包含封装、继承和多态功能。
struct
:- 通常用于定义简单的数据结构,类似于C语言中的
struct
。 - 常用于数据的存储和传递,而不需要复杂的行为。
- 通常用于定义简单的数据结构,类似于C语言中的
3. 继承时的默认访问权限
-
class
:- 默认继承方式是**
private
**。
- 默认继承方式是**
-
struct
:- 默认继承方式是**
public
**。
- 默认继承方式是**
示例:
class BaseClass {};
struct BaseStruct {};// class 默认是private继承
class DerivedClass : BaseClass {// 等价于 `private`继承
};// struct 默认是public继承
struct DerivedStruct : BaseStruct {// 等价于 `public`继承
};
4. 使用习惯
class
:- 习惯用于定义复杂类型,并实现封装性。
- 数据成员通常是
private
,通过成员函数访问。
struct
:- 习惯用于定义简单的 POD 类型(Plain Old Data)。
- 数据成员通常是
public
,直接访问。
示例:
class Person {
private:std::string name;int age;public:Person(const std::string& name, int age) : name(name), age(age) {}void display() {std::cout << "Name: " << name << ", Age: " << age << std::endl;}
};struct Point {int x;int y;
};int main() {Person person("Alice", 25);person.display(); // 使用成员函数Point p = {10, 20};std::cout << "Point: (" << p.x << ", " << p.y << ")" << std::endl; // 直接访问return 0;
}
5. 代码生成与性能
- 从编译器的角度来看,
class
和struct
在生成的代码上几乎是相同的。区别主要是语法和访问控制的默认设置。
6. 可混用性
在C++中,可以自由选择使用class
或struct
来实现某些功能,两者可以混合使用。例如:
struct Data {int value;Data(int v) : value(v) {}
};class Processor {
public:void process(Data& d) {d.value *= 2; // 访问Data的public成员}
};
总结
特性 | class | struct |
---|---|---|
默认访问控制 | private | public |
继承时的默认访问控制 | private | public |
常见用途 | 面向对象编程,封装复杂逻辑和行为 | 定义简单的数据结构(POD类型) |
是否支持成员函数 | 支持 | 支持 |
是否支持继承 | 支持 | 支持 |
习惯用法 | 数据成员通常是private ,通过函数访问 | 数据成员通常是public ,直接访问 |
虽然从技术上来说两者的功能相近,但在实际开发中,推荐按照惯例使用:
class
:用于复杂的、面向对象的设计。struct
:用于简单的数据结构或 POD 类型,类似于C语言中的struct
。