卡码笔记
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
  • 基础与语法

    • 介绍c++一下三大特性
    • 指针和引用的区别
    • 结构体和类的区别
      • 简要回答
      • 详细回答
      • 代码示例
      • 知识拓展
      • 知识图解
      • 什么是POD?
      • 面试官可能追问
    • 结构体与联合体的区别
    • static关键字和const关键字的作用
    • extern C的作用
    • volatile关键字的作用
    • inline函数与宏的区别与优劣
    • auto和decltype的区别
    • sizeof和strlen的区别
    • 浮点数比较方法
    • 静态局部变量,全局变量,局部变量的特点,以及使用场景
    • C++中四种类型转换
  • 面向对象

  • STL 与容器

  • 内存管理

  • C++11 与现代 C++

  • 智能指针

  • 并发与 I/O

# 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;
 }
1
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

# 知识拓展

# 知识图解

image

# 什么是POD?

答:POD 的全称是 Plain Old Data,翻成中文就是 “普通老实的数据类型”,即只负责存数据,不搞什么花里胡哨的操作。

有以下几个特点

  1. 没有虚函数、没有继承
  2. 只有公有的、简单的成员变量
  3. 没有用户定义的构造函数、析构函数、拷贝构造函数、赋值运算符
  4. 内存布局是连续的、可预测的
  //这就是个经典的 POD 类型:没有构造函数没有继承成员,全是public能直接memcpy拷贝,初始化的时候也不需要构造器干预
  struct Point {
    int x;
    int y;
};
//下面这个就不是 POD,因为有了构造函数
struct FancyPoint {
    int x;
    int y;
    FancyPoint() { x = y = 0; }  // 有构造函数了
};
1
2
3
4
5
6
7
8
9
10
11

# 面试官可能追问

  1. struct 默认是 public,那能在 struct 中加 private 吗?

答:可以,虽然 struct 默认是 public,但可以在 struct中显式地使用 private 或 protected 来控制成员访问权限。 struct 和 class 在语法上几乎完全等价,只是默认权限不同。

  1. 默认继承权限影响大吗?怎么体现?

答:有影响。比如用 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;
}

1
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
Last Updated: 3/10/2026, 6:08:48 PM

← 指针和引用的区别 结构体与联合体的区别 →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪