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

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

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

5c105845926119f2783fc7146eee6aea.png

转行啦

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

C语言与C++中的struct

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

1411a8f77d09bb4a9d8c9b5991f21a2e.png

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 则更适合封装对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Burp破解安装(1.7和2.0)

依赖 由于Brup是使用java语言开发的&#xff0c;因此我们需要本地有jdk8的环境&#xff0c;教程自己百度或者<a href"https://www.runoob.com/java/java-environment-setup.html">https://www.runoob.com/java/java-environment-setup.html</a>&#xff…

C# ASP.NET MVC 微信和支付宝H5支付开发及Demo

微信和支付宝H5支付 最近开发任务遇到了一个要在手机浏览器里面调起微信和支付宝去支付的开发需求&#xff0c;以前都是做的扫码支付或者JSAPI都是在软件内部支付的&#xff0c;没遇到过在自己浏览器内唤醒微信或者支付宝的支付这种开发在开发的过程中遇到了许多问题和坑点这里…

dbnetlib sqlserver不存在或拒绝访问_SQL Server数据库损坏和修复

常见错误解读823错误错误信息是&#xff1a;“在文件%ls中、偏移量为%#016I64x的位置执行%S_MSG期间&#xff0c;操作系统已经向SQL Server返回了错误%ls。”“The operating systemreturned error %ls to SQL Server during a %S_MSGat offset %#016I64x in file %ls.”例如&a…

C# ASP.NET MVC 阿里云短信验证码Demo

相信大家在开发过程中又很多使用到验证码验证的功能&#xff0c;今天将验证码的验证整理一下写了一个Demo 通过本篇后你能学习到: 阿里云短信服务Drapper连接SQL Server进行增改操作JS前端倒计时 完成后效果如下: (一)首先我们要使用短信我们先注册短信服务所需的内容 1.首先…

mybatis generator生成example_[Springboot系列] SpringBoot与Mybatis结合

本文作者&#xff1a;cuifuanMybatis 是一个持久层ORM框架&#xff0c;负责Java与数据库数据交互&#xff0c;也可以简易理解为中介&#xff0c;相对于它&#xff0c;还有个中介是hibernate,不过在mybatis中sql语句的灵活性&#xff0c;可优化性比较强&#xff0c;这也是现在大…

在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(二)---静态文件如何部署...

目前&#xff0c;较为成熟的技术是采用laravelS组件&#xff0c;注意和laravel 区别laravelS多了一个大写的S&#xff0c;由于laravelS默认监听5200端口&#xff0c;所以laravel项目要做一些调整 例如&#xff1a; 静态文件引入的方式-----从静态资源服务器加载我们熟悉的js和c…

Linux上Oracle 11g安装步骤图解(超详细图文教程)附带导入数据和新建数据库教程

首先本文采用Docker方式快速在Linux上安装 目录 1.安装Docker容器 (1)登陆服务器&#xff0c;输入命令安装Docker容器 (2)安装完成后运行下列代码如果弹出Docker版本则表示安装成功 (3)启动Docker并设置跟随系统开机启动 (4)由于国内系统拉取国外镜像缓慢所以我们在开始安…

python中import sys_python import sys出错怎么办

当在pycharm中输入如下代码时&#xff1a;import sys 一、问题&#xff1a; sys下出现红色波浪线&#xff0c;按CtrlF1显示的信息为&#xff1a;no module named sys。 二、原因&#xff1a; 在装Python解释器时&#xff0c;我为了图方便装的是 Python 3.7.0a4 的embeddable版本…

Windows phone7 软件发布:理财计算器(包括wp7房贷计算器,wp7个税计算器,wp7存款利息计算器)...

前一段时间&#xff0c;需要经常用到贷款计算器的功能&#xff0c;这样有利于我们做出更好的决策。但是我们只能通过银行的工作人员的计算器来计算&#xff0c;给我带来了极大的不便和损失&#xff0c;由此便萌生了开发一个Windows phone7版的贷款计算器的功能。 此计算器目前的…

eclipse debug怎么用_利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)

maven搭建安装过程挺简单的&#xff0c;去apache下载apache-maven的zip包&#xff0c;解压到一个目录下&#xff0c;如下图接下来配置windows环境&#xff0c;右击我的电脑--》属性--》高级系统设置--》环境变量--》系统变量--》新建&#xff0c;如下图就是你解压的maven的home…

【转载】ARM芯片介绍

ARM芯片介绍 作者&#xff1a;nbnb001 原文网址&#xff1a;http://bbs.imp3.net/thread-894970-1-1.html 一、ARM9系列 较小的核心面积带来较低的成本&#xff0c;相对比较省电&#xff0c;但难以冲击更高的频率&#xff0c;总体效能有限。 1. 威盛WM8505/WM8505 主频&#xf…

action请求是什么意思_凭什么说大疆Osmo Action可以干掉 GoPro hero7?

国内影像器材相关厂商中&#xff0c;大疆的研发实力显然处在第一阵营中的领军位置。这样评价它&#xff0c;不光是因为大疆这些年推出的产品在成像品质上都极为优秀&#xff0c;更是因为在爱好者眼中&#xff0c;这是一家“发起疯来连自家产品都打压”的技术疯子。和别人竞争&a…

数据共享如何改变世界_如何改变他人?“我不会去改变这个世界,我们会去改变自己”。...

我们每一个人都经常觉得&#xff0c;如果要是别人改变了的话&#xff0c;我们就会变得快乐&#xff0c;如果别人会做这一点的话&#xff0c;我就会变成快乐。我们就是一直不断地去努力&#xff0c;而且也希望别人可以改变。我见到很多的人&#xff0c;来参加我们的课程&#xf…

在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(nginx配置篇章)

laravel项目中的配置 原文出处&#xff1a;https://laravelacademy.org/post/19700.html&#xff0c;感谢原文作者让laravel这款可爱的php框架&#xff0c;进入了高并发的殿堂如果你已经成功安装了laravelS组件&#xff0c;并用他接管了你的laravel项目&#xff0c;那么接下来…

编程之美-2.17-数组循环移位

1. 简述 设计一个算法&#xff0c;把一个含有N个元素的数组循环右移K位&#xff0c;要求时间复杂度为O(N)&#xff0c;且只允许使用两个附加变量。 2. 思路 其实看到题目中只允许两个附加变量应该也能想到&#xff0c;就是两个变量倒来倒去就行了。如果熟悉希尔排序的话&#x…

Rails 3:提高Ajax应用速度

Rails 3&#xff1a;提高Ajax应用速度 http://developer.51cto.com 2011-05-18 09:45 Stefan Siebel 51CTO 我要评论(0)我建立了一个列表网站&#xff0c;ListKungFo&#xff0c;其中大量使用了Ajax&#xff0c;目前为止网站运行非常良好。而过去两周里&#xff0c;我一直在…

opencv支持python3吗_Python3.4+opencv3

1、安装Python 3.4 for Windows 好的这好像没有什么可以说的 2、下载OpenCV 3和Numpy(OpenCV依赖Numpy库) 大家在这里就出了问题。如果使用直接使用pip install pyopencv安装一定会出错。这里使用了Python界活雷锋封装的安装包&#xff0c;大家根据自己的系统下载&#xff1a; …

cacti安装配置详解_MySQL实战001:8.0免安装版服务配置详解

首先我们需要先下载MySQL的安装包&#xff0c;MYSQL官方下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/&#xff0c;这里我下载的是MySQL Community Server 8.0.15版本&#xff0c;以前MySQL还有安装版&#xff0c;现在都是压缩版&#xff0c;解压之后将环境配置…

laydate时间控件有时候无效_新角度,如何无效没用地听课

嗨喽&#xff0c;大家好。这一期我想向大家展示一下如何无效地听课。1.上课的时候&#xff0c;全程集中注意力&#xff0c;每一秒都不能放松&#xff0c;使自己的大脑保持高度紧张中。我们这么年轻&#xff0c;精神充沛得很&#xff0c;只要累不死就往死里学。 2.下课的时候也不…

anaconda python删除pyltp_Anaconda使用

Anaconda 是什么&#xff1f;Anaconda 是一个可用于科学计算的 Python 发行版&#xff0c;支持 Linux、Mac、 Windows系统&#xff0c;内置了常用的科学计算包。它解决了官方 Python 的两大痛点。第一&#xff1a;提供了包管理功能&#xff0c;Windows 平台安装第三方包经常失败…