# C++结构体struct和类class的区别
# 简要回答
c++ 中结构体struct和类class的主要区别就是成员的默认属性不同,结构体中成员的默认属性是public,而类中成员的默认属性是private
- 简记
结构体默认开门(public),类默认关门(private)。功能都能用,习惯决定用法。
# 详细回答
C++ 中为了兼容 C 语言而保留了 C 语言的 struct 关键字,并且加以扩充了含义。
在 C 语言中,struct 只能包含成员变量,不能包含成员函数。
而**在 C++ **中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数。
class中的成员默认都是private的,而struct中的成员默认都是public的;
class继承默认是private,struct继承默认是public;
class可以用于定义模板函数,而struct不行。
实际使用中,struct 我们通常用来定义一些 纯数据结构POD(plain old data) 类型(下文拓展有解释什么是POD),它是用来描述一种数据类型的特性,主要用于在内存中表示简单的数据结构。
# 代码示例
#include <iostream> // 引入输入输出库
using namespace std;
// 定义一个结构体:默认 public
struct Point {
int x; // 默认是 public,不需要额外写
int y;
void print() { // 成员函数:结构体也可以有!
cout << "Point: (" << x << ", " << y << ")" << endl;
}
};
// 定义一个类:默认 private
class Person {
string name; // 默认是 private,外部不能直接访问
int age;
public: // 显式写 public 开始对外开放接口
Person(string n, int a) {
name = n;
age = a;
}
void introduce() {
cout << "My name is " << name << ", age " << age << endl;
}
};
int main() {
// 使用结构体
Point p;
p.x = 3; // 直接访问,没问题(public)
p.y = 4;
p.print(); // 调用结构体的方法
// 使用类
Person someone("Tom", 25); // 通过构造函数初始化
// someone.name = "Jerry"; // 错误!name 是 private
someone.introduce(); // 使用公开方法访问信息
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 知识拓展
# 知识图解

# 什么是POD?
答:POD 的全称是 Plain Old Data,翻成中文就是 “普通老实的数据类型”,即只负责存数据,不搞什么花里胡哨的操作。
有以下几个特点
- 没有虚函数、没有继承
- 只有公有的、简单的成员变量
- 没有用户定义的构造函数、析构函数、拷贝构造函数、赋值运算符
- 内存布局是连续的、可预测的
//这就是个经典的 POD 类型:没有构造函数没有继承成员,全是public能直接memcpy拷贝,初始化的时候也不需要构造器干预
struct Point {
int x;
int y;
};
//下面这个就不是 POD,因为有了构造函数
struct FancyPoint {
int x;
int y;
FancyPoint() { x = y = 0; } // 有构造函数了
};
2
3
4
5
6
7
8
9
10
11
# 面试官可能追问
- struct 默认是 public,那能在 struct 中加 private 吗?
答:可以,虽然 struct 默认是 public,但可以在 struct中显式地使用 private 或 protected 来控制成员访问权限。 struct 和 class 在语法上几乎完全等价,只是默认权限不同。
- 默认继承权限影响大吗?怎么体现?
答:有影响。比如用 struct 继承另一个 struct,如果没写继承权限,默认是 public。但如果是class 继承 struct,不写就默认是 private,会导致派生类不能访问父类的 public 成员,可能会出现访问权限错误。
所以写继承时一般都明确写上 public/protected/private 继承,避免依赖默认行为。
这里给一个cpp代码的例子
#include <iostream>
// 父类使用 struct 定义,成员默认 public
struct Base {
void sayHello() {
std::cout << "Hello from Base" << std::endl;
}
};
// 1. 用 struct 继承 struct:默认 public 继承(可以访问)
struct DerivedStruct : Base {
void greet() {
sayHello(); // 正常访问 Base 的成员
}
};
// 2. 用 class 继承 struct:默认 private 继承(访问失败)
class DerivedClass : Base {
public:
void greet() {
sayHello(); // 在类内可以访问(Base 是 private 继承,但类内部仍能访问)
}
};
int main() {
DerivedStruct ds;
ds.sayHello(); // 可以访问,因为 public 继承
DerivedClass dc;
// dc.sayHello(); // 编译错误!sayHello 在 DerivedClass 中是 private
dc.greet(); // 可以正常调用,内部访问没问题
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
← 指针和引用的区别 结构体与联合体的区别 →
评论
验证登录状态...