C++中的结构和类

编程语言及工具

104人已加入

描述

C++ 仍然是嵌入式开发的少数​​语言,但当项目变得太大而无法有效使用 C 时,开发人员通常会采用 C++。这些开发人员通常从 C 过渡到 C++,语言之间的细微差异代表了他们学习曲线的重要部分。C++ 有结构,就像 C 一样,因为它们是不一样的。C++ 有类,它们与结构非常相似。本文解开这些语言元素的细节。

C中的结构

C 中的结构是自定义的复合数据项(对象),可以由现有的内置数据类型(intchar等)、位字段(指定位大小的整数)和其他结构构建。这个想法是聚合一些属于一起的数据项。例如,保存 3 维坐标的结构可能如下所示:

结构坐标
{
   浮动 x;
   浮动y;
   浮动z;
};

这段代码告诉编译器结构坐标是什么样的。然后,您可以继续声明这种类型的变量:

结构坐标位置;

变量位置结构坐标类型,它的内部字段可以使用“点”运算符来寻址:

位置.x = 1.0;
位置.y = 2.0;
位置.z = 9.99;

当然,使用三个单独的浮点变量(名称如location_x等)可以实现类似的效果。但是,将位置作为可以传递给函数等的单个变量来处理要容易得多。

包含位字段的能力为结构提供了 C 中其他地方不具备的能力。下面是一个例子:

结构位寄存器
{
   未注册:3;
   未签名:3;
   无符号极性:2;
};

struct bitreg类型变量中的每个字段都有特定的位大小。编译器确保数据以合理的方式存储,因此我们希望这样的变量适合一个字节。此外,所有用于访问字节内字段的“bit bashing”代码都是自动生成的。因此,程序员可以简单地访问它们:

结构位寄存器控制;
 
控制.up = 1;
control.down = 2;
control.polarity = 3;

在大多数情况下,在 C 中使用结构非常简单,并且使代码更易于理解,而不会影响执行效率。但是,嵌入式开发人员应该注意两点:

  • 现代高端(通常为 32 位)处理器具有易于使用结构的指令集。事实上,它们就是为此而设计的。然而,大多数低端 CPU 不提供这样的效率,因此结构的使用需要小心。
  • 位域是一个很好的特性,可以产生高效且可读的代码。嵌入式开发人员可能会立即发现一个机会:使用位域访问设备控制寄存器。许多外围设备具有包含各种位字段的 1 字或 1 字节宽的寄存器。这看起来像一个伟大的匹配,有时它可以工作。但是有两个问题:
    • 位域的确切布局由编译器确定。如果一切都正确映射到设备上,则代码可能会正常工作。但是,编译器的更改,甚至只是编译器的更新,都可能会破坏代码。
    • 编译器生成的用于访问位字段的代码很可能会使用许多 AND/OR 操作和对寄存器的多次访问,这可能会出现问题。此外,某些设备寄存器是只写的,并且永远不会包含在编译器生成的代码中。

尽管 C 结构看起来有点像一种新的数据类型,但实际上并非如此。一个数据类型通常会有一系列可以对其执行的操作;这不是 C 结构的情况。要对 C 结构做任何事情,除了创建指向它的指针之外,您需要访问内部字段。这个问题在 C++ 中得到解决。

C++ 中的类

C++ 语言具有许多面向对象的功能。其中之一是的概念,它可以描述更像一种新数据类型的东西。可以从类中实例化一个变量(通常称为对象) ;即它是这种新类型的对象。

C++ 类具有与 C 结构几乎完全相同的语法和一些非常相似的功能。但是,有一些重要的区别:

  • 一个类也可以包含函数(称为方法)。
  • 成员变量和方法对外界是隐藏的,除非它们的声明遵循公共:
  • 可以有一对特殊的方法——构造函数和析构函数——分别在创建和销毁类的实例(对象)时自动运行。
  • 可以使用特殊方法(成员函数)定义处理新数据类型的运算符。
  • 一个类可以用作定义另一个类的基础(这称为继承)。
  • 声明一个新类型的变量(类的一个实例;一个对象)只需要类的名称——关键字class不是必需的。

此示例中说明了大多数这些功能:

我的班级
{
   字符一个;
   诠释 b;
上市:
   无效的乐趣();
   我的课();
   〜我的类();
};
 
我的类我的obj;
 
myobj.fun();

成员变量ab只能被三个成员函数fun()myclass()~myclass() 访问后两个函数是构造函数和析构函数。只有fun()可能被用户代码调用。所有三个函数的实际代码将在别处定义,并使用::运算符与类相关联,因此:

 
无效 myclass::fun()
{
  ...

C++ 中的结构

除了类之外,C++ 还具有向后兼容 C 的结构。但是,C++ 结构还具有与类相同的附加功能。这只是 C++ 中结构和类之间的一个区别。正如我们所见,类中成员变量和函数的默认可访问性是私有的;结构中的默认值是公共的。因此,早期类的功能也可以这样表示:

结构体
{
   无效的乐趣();
   我的课();
   〜我的类();
私人的:
   字符一个;
   诠释 b;
};

在 C++ 中使用类和结构

获得此信息后,建议您不要过度利用它。当您需要额外功能时,仅将结构用于它们在 C 和类中提供的功能有很多原因。首先,这是代码可读性的问题。另一个开发人员可能对细节不是很清楚,以“非标准”方式编写的代码会令人困惑。

编写代码时的一个关键优先事项是确保它是可读的(=可维护的)。有人——可能是你——可能需要在一年后查看这段代码并了解它的作用。一些建议:假设将维护您的代码的人是一个武装的精神病患者,他的耐心有限,并且知道您的家庭住址。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分