C++ class和struct的区别

2023-05-16

最开始是在ROS的消息头文件里面看到,见这篇博文:https://blog.csdn.net/sinat_16643223/article/details/114730336

我在《C++primer》里多次看到用struct了

转载自:http://c.biancheng.net/view/2235.html

C++ class和struct到底有什么区别

< 类其实也是一种作用域 C++ string(C++字符串) >

C++ 中保留了C语言的 struct 关键字,并且加以扩充。在C语言中,struct 只能包含成员变量,不能包含成员函数。而在C++中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数。

C++中的 struct 和 class 基本是通用的,唯有几个细节不同:

  • 使用 class 时,类中的成员默认都是 private 属性的;而使用 struct 时,结构体中的成员默认都是 public 属性的。
  • class 继承默认是 private 继承,而 struct 继承默认是 public 继承(《C++继承与派生》一章会讲解继承)。
  • class 可以使用模板,而 struct 不能(《模板、字符串和异常》一章会讲解模板)。


C++ 没有抛弃C语言中的 struct 关键字,其意义就在于给C语言程序开发人员有一个归属感,并且能让C++编译器兼容以前用C语言开发出来的项目。

在编写C++代码时,我强烈建议使用 class 来定义类,而使用 struct 来定义结构体,这样做语义更加明确。

使用 struct 来定义类的一个反面教材:

 
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct Student{
  5. Student(char *name, int age, float score);
  6. void show();
  7.  
  8. char *m_name;
  9. int m_age;
  10. float m_score;
  11. };
  12.  
  13. Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){ }
  14. void Student::show(){
  15. cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
  16. }
  17.  
  18. int main(){
  19. Student stu("小明", 15, 92.5f);
  20. stu.show();
  21. Student *pstu = new Student("李华", 16, 96);
  22. pstu -> show();
  23.  
  24. return 0;
  25. }

运行结果:
小明的年龄是15,成绩是92.5
李华的年龄是16,成绩是96

这段代码可以通过编译,说明 struct 默认的成员都是 public 属性的,否则不能通过对象访问成员函数。如果将 struct 关键字替换为 class,那么就会编译报错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ class和struct的区别 的相关文章

  • 时间:2019-03-17 标签:c#backgroundworker和partialclass

    我在实现从堆栈溢出获得的代码时遇到问题 它是关于终止后台工作进程的 我的代码如下 using System using System Collections Generic using System Data using System Dr
  • 单个成员结构的对齐和大小保证

    给定一个 可能非 POD struct具有单个成员 没有继承 也没有虚方法 struct Foo Bar value Foo do something C 是否保证Foo将具有相同的对齐方式并且sizeof as Bar 如果不能 那么可以
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public
  • 如何调用超类方法,就像在派生类中定义的那样?

    我有这些课程 class Control get code return 3 getCodeChain var result this code if super getCodeChain result result concat supe
  • 来自另一个类的 Qt C++ GUI 调用

    我通过 gui 拖放创建了一个按钮和一个文本浏览器 UI 以及单击按钮功能是在 mainwindow cpp 中创建的 有一个 main cpp 但这是无关紧要的 因为在单击开始按钮之前程序不会启动 include mainwindow h
  • 具有单个成员的结构是否具有与成员类型相同的性能?

    Does struct单个成员是否具有与成员类型相同的性能 内存使用和速度 Example 这段代码是一个struct与单个成员 struct my int int value 是的表现my int与 一样int 同意 harper htt
  • 将字符串解析为结构变量

    我试图将字符串解析为其中包含不同变量的结构向量 这是我到目前为止所拥有的 但似乎不起作用 struct client string PhoneNumber string FirstName string LastName string Ag
  • 在另一个文件中扩展类的正确方法是什么?

    这就是我在 foo php 中的内容 class Foo public foo NULL public foo2 NULL public function setFoo foo foo2 this gt foo foo this gt fo
  • TypeScript - 如何从方法的参数推断类泛型类型?

    我正在尝试从稍后调用的方法参数中输入类泛型 在我们调用带有泛型参数的方法之前 类的泛型类型是不知道的 然后 对于任何其他方法 将传递泛型类型 老实说 对我来说 这似乎是一个非常复杂的功能 我什至不确定 TypeScript 是否有办法做到这
  • 从 array_map 匿名函数内部调用类方法

    我正在尝试从一个对象中调用我的对象的方法之一array map匿名函数 到目前为止 我收到了预期的错误 致命错误 不在对象上下文中时使用 this 我知道为什么我会收到此错误 我只是不知道如何实现我想要的目标 有人有任何建议吗 这是我当前的
  • 已删除的类实例上的方法仍然有效吗?

    我在 Visual C 2010 上有这段代码 include
  • jqGrid如何将额外的类应用于标题列

    我想在特定列上应用一个额外的类 我知道通过在 colModel 中指定这一点对于行是可能的 但这些类仅应用于 结果行 中的列 而不应用于标题 我想要达到的是通过简单的类名隐藏较小视口的特定列 与 Twitter Bootstrap 一起使用
  • 在Java中从控制台打开包中的类

    因此 当我尝试从命令提示符打开一个不在包中的 java 类时 一切正常 但是当我尝试打开一个包中的类时 它会给我 NoClassDefFoundError 错误 当我尝试打开类 java somepackage someclass 时列出包
  • 返回具有关联类型的特征

    struct A struct PropA struct B struct PropB trait AB type prop fn a self gt fn b self p Self prop gt impl AB for A type
  • CSS class 和 id 同名

    css class 和 id 同名有什么问题吗 就像文章 帖子页脚的 footer 和页面页脚的 footer 一样 不 完全可以接受 一个类是使用 a 来定义的 并且 ID 是使用定义的 因此 就浏览器而言 它们是两个完全独立的项目 唯一
  • 当 C# 位于同一包含类中时,为什么以及如何允许访问类本身之外的私有变量?

    我不知道这个问题是否具有足够的描述性 但是这种行为为什么以及如何存在 public class Layer public string Name get set private IEnumerable children public IEn
  • 在 foreach 循环中更改另一个结构内的结构

    打印以下代码 调用 MyMethod 时 0 0 0 1 我希望它打印 0 0 1 1 为什么是这样 Code private struct MyStruct public MyInnerStruct innerStruct private
  • 如何在 Eclipse 中获得完全限定的类名?

    有没有一种快速方法可以在 Eclipse 中单击 Java 类并获取其完全限定名称 或将其复制到剪贴板 2016年6月29日编辑 正如 Jeff 所指出的 您只需要执行以下第二步 1 Double click on the class na
  • VBA全局类变量

    我的障碍是试图让多个子程序识别类变量 当我尝试全局声明它们时 出现编译错误 无效的外部过程 然后 当我运行公共函数或子函数来声明变量时 它们在其他子函数中保持未定义状态 我希望多个子程序能够识别变量 因为它们的值应该通过用户窗体进行更改 然

随机推荐