c++ class struct同名_相对于C语言,C++对struct做了非常多的扩充,功能更全面了
我有相当长的一段时间(数月)没有更新文章了。
并不是我放弃了写技术文章,而是因为这段时间,我把精力主要放在了图像智能算法的学习上了。去年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做了非常多的扩充,功能更全面了相关推荐
- c++ class struct同名_第二课C到C++的关系
一.C与C++的关系 C与C++的关系示意图如下图所示: 从图中可以看出以下几点: (1) C++继承了所有的C特性 (2) C++在C的基础上提供了更多的语法和特性 (3) C++的设计目标是运行效 ...
- c++ class struct同名_如何把C++的源代码改写成C代码?而C改C++只需一步!
★ 如何把C++的源代码改写成C代码? C++解释器比C语言解释器占用的存储空间要大,想要在某些特定场合兼容C++代码,同时为了节省有限的存储空间,降低成本,也为了提高效率,将用C++语言写的源程序用 ...
- 录屏 模拟器_系统自带的录屏好用吗?其实有功能更强大的软件
我在西瓜上面发过一个模拟装机的视频,说实话播放量也不高,不过令我意想不到的是好多朋友对视频本身没啥兴趣,但是私信我屏幕录制用的什么软件? 这当然没什么好隐藏的,今天就详细告诉大家,就是班迪录屏. 使用 ...
- 利用靶区勾画的RT struct文件分析相关联的Dicom图像中肿瘤部分的CT(HU)值分布(升级版)
利用靶区勾画的RT struct文件分析相关联的Dicom图像中肿瘤部分的CT(HU)值分布(升级版) % ============================================== ...
- 取两个数较小值c语言_如何提升C语言安全性,达到RUST的安全性
可信C语言:让C语言达到和RUST一样的安全性 1. 所有权 所有运行的程序都必须管理其使用计算机内存的方式.一些语言中具有GC(Garbage Collection)机制,在程序运行时不断地寻找不再 ...
- c语言结构体语法分析,C语言结构体struct的语法解析
本节内容需要结合视频讲解才能更容易理解,视频播放地址如下: 用java开发编译器 本节,我们着重研究结构体定义,也就是struct 这种变量定义,C语言编译器是如何解析的,本节我们要解析的结构体定义如 ...
- C语言结构体struct的语法解析
本节内容需要结合视频讲解才能更容易理解,视频播放地址如下: 用java开发编译器 本节,我们着重研究结构体定义,也就是struct 这种变量定义,C语言编译器是如何解析的,本节我们要解析的结构体定义如 ...
- c语言程序设计实验13文件,第13章_文件---《C语言程序设计》实验指导.ppt
第13章_文件---<C语言程序设计>实验指导 第十三章 主要内容 13.1 C文件概述 13.2 文件类型指针 13.3 文件的打开与关闭 13.4 文件的读写 13.5 文件的定位 1 ...
- python 循环赋值_计算机二级Python语言程序设计 第2章Python语言基本语法元素
第二章学习知识导图 本章概述:本章目的是了解基础的Python相关知识 考点主要是: 1) 程序的基本语法元素:程序的格式框架.缩进.注释.变量.命名.保留字.数据类型.赋值语句.引用 2) 基本输入 ...
最新文章
- 「GAN优化」如何学会以正确的姿势定量评价你的GAN
- Django-路由控制
- 面试官系统精讲Java源码及大厂真题 - 20 SynchronousQueue 源码解析
- webrtc静音检测
- wxpython textctrl_如何从wxpython中的textctrl接受值
- SpringSecurity系列(四) Spring Security 实现权限树形菜单
- python数据分析模型选择_python学习-数据分析2(分类型数据处理+SVM建模)
- BZOJ3456: 城市规划 多项式求逆
- iOS / OXS LeanCloud云存储方案简单测试记录
- 信号与系统----导论1杂谈为什么要学信号与系统
- python结巴分词_Python中文分词工具之结巴分词用法实例总结【经典案例】
- 品铂平板电脑刷linux,细说平板电脑刷机方法
- Shark为何被抛弃?
- 故障解决 | win10没声音及找不到Realtek高清音频管理器
- 基于片内Flash的提示音播放程序
- 手机下载的Termux如何利用you-get 下载视频
- 一文带你了解降压型稳压芯片原理
- Typescript1-基本语法
- 物联网通信技术第7章 自组织网络(非常全,持续更新)
- 楼市步入慢行道 购房窗口期显现?