在C++编程语言中,struct和class都是用来定义自定义类型的语法结构,二者在功能上有大量重叠,但在默认行为和适用场景上存在明确区别,理解这些差异能帮助开发者更合理地选择类型定义方式。

访问控制权限的默认差异
struct和class最核心的区别在于成员和基类的默认访问权限不同。struct的成员和基类默认是public访问权限,而class的成员和基类默认是private访问权限。
下面通过代码示例展示这一特性:
#include <iostream>
using namespace std;
// 定义struct类型
struct StudentStruct {
int age; // 默认public权限
void printAge() { // 默认public权限
cout << "struct age: " << age << endl;
}
};
// 定义class类型
class StudentClass {
int age; // 默认private权限
void printAge() { // 默认private权限
cout << "class age: " << age << endl;
}
public:
void setAge(int a) {
age = a;
}
void showAge() {
printAge();
}
};
int main() {
StudentStruct s1;
s1.age = 18; // 可以直接访问,因为是public
s1.printAge();
StudentClass s2;
// s2.age = 18; // 编译错误,age是private
// s2.printAge(); // 编译错误,printAge是private
s2.setAge(20);
s2.showAge();
return 0;
}
继承方式的默认差异
struct和class在作为基类进行继承时,默认的继承方式也不同。struct默认的继承方式是public继承,class默认的继承方式是private继承。
相关代码示例如下:
#include <iostream>
using namespace std;
struct BaseStruct {
int val;
};
class BaseClass {
public:
int val;
};
// struct继承,默认public继承
struct DeriveStruct1 : BaseStruct {
void print() {
cout << "derive struct val: " << val << endl; // 可以直接访问val
}
};
// class继承struct,默认private继承
class DeriveClass1 : BaseStruct {
public:
void print() {
// cout << val << endl; // 编译错误,val是private继承来的,外部不可访问
}
};
// struct继承class,默认public继承
struct DeriveStruct2 : BaseClass {
void print() {
cout << "derive struct from class val: " << val << endl; // 可以访问public成员
}
};
int main() {
DeriveStruct1 d1;
d1.val = 10; // 可以访问,因为是public继承
d1.print();
DeriveStruct2 d2;
d2.val = 20; // 可以访问,BaseClass的val是public
d2.print();
return 0;
}
模板参数中的使用差异
在C++的模板参数定义中,struct可以作为模板参数使用,而class在模板参数语境下和typename是等价的,不过此时二者没有功能差异,只是语法习惯不同。
模板参数相关示例:
#include <iostream>
using namespace std;
// 两种模板参数写法等价
template <class T>
void printClass(T t) {
cout << t << endl;
}
template <typename T>
void printTypeName(T t) {
cout << t << endl;
}
// struct作为模板参数传递
struct MyStruct {
int num;
};
int main() {
printClass(10);
printTypeName("hello");
MyStruct s;
s.num = 5;
printClass(s.num);
return 0;
}
适用场景的区别
基于上述特性,struct和class在实际开发中有不同的适用场景。struct更适合用来定义简单的数据集合,不需要复杂的封装逻辑,成员默认公开方便直接访问数据。class更适合用来实现面向对象的封装特性,将数据和操作数据的函数隐藏起来,只暴露必要的公共接口,保障数据的安全性。
总结
总的来说,C++中struct和class的区别主要体现在默认访问权限、默认继承方式上,二者在功能上几乎可以互相替代,只是设计初衷和使用习惯不同。开发者可以根据是否需要封装、是否需要默认公开成员来选择使用struct还是class,只要符合项目的代码规范即可。