我有相当长的一段时间(数月)没有更新文章了。

并不是我放弃了写技术文章,而是因为这段时间,我把精力主要放在了图像智能算法的学习上了。去年12月时,我对图像智能算法还懵懵懂懂,做着 Linux 嵌入式应用程序开发,现在我已经正式入职到算法公司了,收入翻了一番,哈哈,不过累了好多。废话就到这里,我的转行辛酸史,以后再详谈。

转行啦

坦诚的说,就编程语言而言,因为一直在做 Linux 嵌入式程序开发的缘故,我对C语言更加了解一点,读者应该能够发现,我之前的大部分文章都是关于C语言的。不过现在做算法,C++更加适合。C++和C语言虽然很像,但是在细节上还是有所区别的。今天阅读前辈同事的代码时,注意到了 struct 关键字,这个关键字在C++中做了不少扩展。本文将尝试做下总结。

C语言与C++中的struct

struct关键字是C语言中非常重要的关键字,在实际的C语言程序开发中,struct 不仅可以用于封装各种复杂的数据结构,还能够实现一些开发技巧——比如辅助数组赋值、模拟类等等,这些我之前的文章都讨论过。C++不仅保留了C语言中 struct 的功能,还做了不少扩展,具体的可以通过下面这个表说明:

struct在C语言和C++中的区别

请看下面这段C++代码示例,我们首先使用 struct 定义了 S1,接着又定义了 S2,S2 继承了 S1,因此我们可以在 test2 中使用 S1 中定义的成员 a、b。同时也可以看出,C++中的 struct 还可以定义成员函数,包括构造函数和析构函数。

#include using namespace std;struct S1 {    int    a;    int    b;    S1() {        a = 1;        b = 2;    }    void print_mem() {        cout << "a = "<< a << ", b = "<C++ 中的 struct 和 class 关键字

从上面的例子不难看出,C++中的 struct 除了像C语言那样可以定义数据结构外,还可以像 class 关键字那样定义成员函数。不过,二者是有区别的。

成员的默认访问控制属性

首先,struct 默认的访问控制属性是 public,而 class 默认的访问控制属性是 private,这一点可以通过下面这段C++代码示例看出:

struct A {    int a;};class B {    int b;};A ta;ta.a = 1; // 没有问题B tb;tb.b = 2; // 编译报错

继承的默认访问控制属性

类似的,在继承的过程中,struct 和 class 关键字的默认访问控制属性也是有所区别的:struct 默认 public,class 默认 private,例如下面这段C++ 代码:

struct A {    int a;};struct B: A {    int b;};B tb;tb.a = 1; // 正常

这是没有问题的,对象 tb 可以访问由 A 继承而来的成员 a。但是如果将 B 的 struct 改为 class,也即:

struct A {    int a;};class B: A {    int b;};B tb;tb.a = 1; // 编译报错

此时编译就会报错,提示“‘int A::a’ is inaccessible”,因为 class 的默认继承属性为 private。现在我们将 A 的 struct 修改为 class,B 的 class 再改回 struct,会发现,对象 tb 依然能够正常访问成员 a:

class A {public:    int a;};struct B: A {    int b;};B tb;tb.a = 1; // 正常

应注意,这里的讨论重点是继承的默认访问控制属性,因此我们将 A 中的 a 定义为 public 的。

可以看出,当 class 和 struct 混合使用时,默认的访问控制属性由子类决定,而不是由基类决定。不过,依赖默认属性不是特别清晰的写法,在实际的C++程序开发中,更推荐的做法是指明继承的方式:

class B: private A {    ...};class B: public A {    ...};

定义模板

相较于C语言,C++还能够定义模板函数,请看下面这段代码示例:

template                                                                                             void fun(T num) {     cout << "num = " << num << endl;} fun(1); // num = 1fun(1.01); // num = 1.01

在一些开源工程中,我还发现过有使用 class 定义模板函数的,也即使用class替换typename关键字:

template                                                                                             void fun(T num) {     cout << "num = " << num << endl;} 

这种定义方式和上面使用typename的定义方式完全相同,但是 struct 就不能用于定义模板函数,如果读者尝试了,应该会得到编译报错的结果。

小结

本文先是讨论了 struct 关键字在C语言和C++中的不同,不难发现,C++对 struct 关键字是做了不少扩充的,这些扩充让 struct 看起来更像是 class 关键字。事实上,我认为就单纯C++来说,class 关键字是完全可以取代 struct 的,C++ 仍然保留着 struct 关键字,其中一个重要原因就是兼容C语言。既然保留了 struct 关键字,总不能让它完全等价于 class,因此二者在一些细节上有区别,这些轻微的区别往往能够针对不同的需求提供不同的方便:struct 更适合封装数据结构,class 则更适合封装对象。

c++ class struct同名_相对于C语言,C++对struct做了非常多的扩充,功能更全面了相关推荐

  1. c++ class struct同名_第二课C到C++的关系

    一.C与C++的关系 C与C++的关系示意图如下图所示: 从图中可以看出以下几点: (1) C++继承了所有的C特性 (2) C++在C的基础上提供了更多的语法和特性 (3) C++的设计目标是运行效 ...

  2. c++ class struct同名_如何把C++的源代码改写成C代码?而C改C++只需一步!

    ★ 如何把C++的源代码改写成C代码? C++解释器比C语言解释器占用的存储空间要大,想要在某些特定场合兼容C++代码,同时为了节省有限的存储空间,降低成本,也为了提高效率,将用C++语言写的源程序用 ...

  3. 录屏 模拟器_系统自带的录屏好用吗?其实有功能更强大的软件

    我在西瓜上面发过一个模拟装机的视频,说实话播放量也不高,不过令我意想不到的是好多朋友对视频本身没啥兴趣,但是私信我屏幕录制用的什么软件? 这当然没什么好隐藏的,今天就详细告诉大家,就是班迪录屏. 使用 ...

  4. 利用靶区勾画的RT struct文件分析相关联的Dicom图像中肿瘤部分的CT(HU)值分布(升级版)

    利用靶区勾画的RT struct文件分析相关联的Dicom图像中肿瘤部分的CT(HU)值分布(升级版) % ============================================== ...

  5. 取两个数较小值c语言_如何提升C语言安全性,达到RUST的安全性

    可信C语言:让C语言达到和RUST一样的安全性 1. 所有权 所有运行的程序都必须管理其使用计算机内存的方式.一些语言中具有GC(Garbage Collection)机制,在程序运行时不断地寻找不再 ...

  6. c语言结构体语法分析,C语言结构体struct的语法解析

    本节内容需要结合视频讲解才能更容易理解,视频播放地址如下: 用java开发编译器 本节,我们着重研究结构体定义,也就是struct 这种变量定义,C语言编译器是如何解析的,本节我们要解析的结构体定义如 ...

  7. C语言结构体struct的语法解析

    本节内容需要结合视频讲解才能更容易理解,视频播放地址如下: 用java开发编译器 本节,我们着重研究结构体定义,也就是struct 这种变量定义,C语言编译器是如何解析的,本节我们要解析的结构体定义如 ...

  8. c语言程序设计实验13文件,第13章_文件---《C语言程序设计》实验指导.ppt

    第13章_文件---<C语言程序设计>实验指导 第十三章 主要内容 13.1 C文件概述 13.2 文件类型指针 13.3 文件的打开与关闭 13.4 文件的读写 13.5 文件的定位 1 ...

  9. python 循环赋值_计算机二级Python语言程序设计 第2章Python语言基本语法元素

    第二章学习知识导图 本章概述:本章目的是了解基础的Python相关知识 考点主要是: 1) 程序的基本语法元素:程序的格式框架.缩进.注释.变量.命名.保留字.数据类型.赋值语句.引用 2) 基本输入 ...

最新文章

  1. 「GAN优化」如何学会以正确的姿势定量评价你的GAN
  2. Django-路由控制
  3. 面试官系统精讲Java源码及大厂真题 - 20 SynchronousQueue 源码解析
  4. webrtc静音检测
  5. wxpython textctrl_如何从wxpython中的textctrl接受值
  6. SpringSecurity系列(四) Spring Security 实现权限树形菜单
  7. python数据分析模型选择_python学习-数据分析2(分类型数据处理+SVM建模)
  8. BZOJ3456: 城市规划 多项式求逆
  9. iOS / OXS LeanCloud云存储方案简单测试记录
  10. 信号与系统----导论1杂谈为什么要学信号与系统
  11. python结巴分词_Python中文分词工具之结巴分词用法实例总结【经典案例】
  12. 品铂平板电脑刷linux,细说平板电脑刷机方法
  13. Shark为何被抛弃?
  14. 故障解决 | win10没声音及找不到Realtek高清音频管理器
  15. 基于片内Flash的提示音播放程序
  16. 手机下载的Termux如何利用you-get 下载视频
  17. 一文带你了解降压型稳压芯片原理
  18. Typescript1-基本语法
  19. 物联网通信技术第7章 自组织网络(非常全,持续更新)
  20. 楼市步入慢行道 购房窗口期显现?

热门文章

  1. 2018程序员最佳ssh免费登陆工具
  2. C++学习基础篇 —— 引用()的用法和应用
  3. 定时关机,适用于windows系统
  4. chrome浏览器的跨域设置,前端修改跨域问题
  5. [html] 在head标签中必不少的是什么?
  6. [html] 页面的重绘和回流是什么?
  7. [css] 什么是zoom?它有什么作用?
  8. [css] 举例说明在css3中怎么实现背景裁剪?
  9. 工作252:uniapp--实战--uview---tabber
  10. 前端学习(2590):前端权限的菜单控制