当前位置: 首页 > news >正文

C++ class和struct的区别

  在C++中,classstruct本质上非常相似,它们都可以用来定义用户自定义类型,并且都可以包含数据成员和成员函数。但是,它们之间有一些关键的区别和习惯用法:


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
    • 常用于数据的存储和传递,而不需要复杂的行为。

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. 代码生成与性能

  • 从编译器的角度来看,classstruct在生成的代码上几乎是相同的。区别主要是语法和访问控制的默认设置。

6. 可混用性

  在C++中,可以自由选择使用classstruct来实现某些功能,两者可以混合使用。例如:

struct Data {int value;Data(int v) : value(v) {}
};class Processor {
public:void process(Data& d) {d.value *= 2; // 访问Data的public成员}
};

总结

特性classstruct
默认访问控制privatepublic
继承时的默认访问控制privatepublic
常见用途面向对象编程,封装复杂逻辑和行为定义简单的数据结构(POD类型)
是否支持成员函数支持支持
是否支持继承支持支持
习惯用法数据成员通常是private,通过函数访问数据成员通常是public,直接访问

  虽然从技术上来说两者的功能相近,但在实际开发中,推荐按照惯例使用:

  • class:用于复杂的、面向对象的设计。
  • struct:用于简单的数据结构或 POD 类型,类似于C语言中的struct
http://www.xdnf.cn/news/631801.html

相关文章:

  • AI专题:如何把DeepSeek变成你的AI个人助手
  • 虚拟环境中的PyQt5 Pycharm设置参考
  • 多态的总结
  • http协议和session会话
  • 变革性的聚变路线:基于FRC构型的可控核聚变
  • leetcode 862. 和至少为 K 的最短子数组
  • 2025深圳国际无人机展深度解析:看点、厂商与创新亮点
  • 何谓第二大脑?读书笔记
  • 进一步学习线程相关知识
  • 《打破枷锁:Python多线程GIL困境突围指南》
  • AUTOSAR图解==>AUTOSAR_SRS_LIN
  • 【MySQL】第十弹——事务
  • 夏日旅行(广度优先搜索)
  • YOLO11解决方案之使用 Streamlit 应用程序进行实时推理
  • Linux-读者写著问题和读写锁
  • 长序列高时空分辨率月尺度温度和降水数据集(1951-2011)
  • Java面向对象 一
  • Elsevier期刊的Latex投稿论文如何设置Table、Fig、Algorithm和交叉引用为天蓝色
  • 【信息系统项目管理师】一文掌握高项常考题型-项目进度类计算
  • 2025年八大员【标准员】考试题库及答案
  • 从 0 到 1!Java 并发编程全解析,零基础入门必看!
  • DAY34打卡
  • 黑马点评-乐观锁/悲观锁/synchronized/@Transactional
  • java刷题(6)
  • Netty学习专栏(三):Netty重要组件详解(Future、ByteBuf、Bootstrap)
  • RPG游戏设计战斗篇——战法牧协同作战体系研究
  • itextpdf根据模板生成pdf导出pdf遇到的问题
  • 【商业分析】充分了解“特性”和“功能”的区别,加强资源的聚焦度。
  • Java中的String的常用方法用法总结
  • Linux基础命令详解:touch、cat、more 的使用技巧与实战