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…

[html] 请问60*80的canvas占多少内存?你是怎么计算的?

[html] 请问60*80的canvas占多少内存&#xff1f;你是怎么计算的&#xff1f; 一个像素为1byte&#xff0c;通过getImageData方法可以得到canvas的二进制流个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起…

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…

vs2008使用技巧

在做 asp.net 程序时发布站点如果报错&#xff0c;但是之前编译没有问题的话就要查看一下发布时的错误信息。查看信息是在 视图—>输出 。 &#xff08;我自己在实际的开发时遇到过&#xff0c;自己在文件夹里将一个图片删除掉了&#xff0c;所以导致在项目中无法找到这个图…

[html] 精确获取页面元素位置的方式有哪些?

[html] 精确获取页面元素位置的方式有哪些&#xff1f; let btn document.querySelector(#ele) let {top, left} getComputedStyle(btn) console.log(top:, top, left:, left)个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一…

2019.7.29学习整理python

2019.7.29学习整理python 1.变量 1.1什么是变量&#xff1f; 是变化的量。描述变化的世间万物的状态 1.2变量的组成 变量名&#xff1a;变量名用来引用变量值&#xff0c;但凡需要用变量值&#xff0c;都需要通过变量名。赋值符号&#xff1a;赋值变量值&#xff1a;存放数据&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;这也是现在大…

[html] 页面刷新时sessionStroage会变(会清空)吗?

[html] 页面刷新时sessionStroage会变&#xff08;会清空&#xff09;吗&#xff1f; 不会SessionStroage 是数据页面会话级别的, 当你在打开这个页面的时候会被创建, 并且重新加载或恢复页面仍会保持原来的页面会话...当你在关闭对应浏览器Tab的时候会被清出个人简介 我是歌…

sql 数据库 实例删除

前言&#xff1a;一直纠结于我的数据库sql2005实例2种登陆模式都登不上&#xff0c;今天决定把它删掉重新安装了下&#xff0c;操作步骤是我百度来的&#xff0c;这里做下记录&#xff0c;也能给一些遇到相同情况的朋友方便 SQL Server的安装和卸载是每个SQL Server用户都应该掌…

在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版本…

[html] canvas透明度是0.6的矩形和透明度是0.2的矩形叠加到一起,透明度是多少

[html] canvas透明度是0.6的矩形和透明度是0.2的矩形叠加到一起&#xff0c;透明度是多少 首先是透明度值的计算。颜色在本质上是光的产物&#xff0c;假设把透明度理解为玻璃的透光性&#xff0c;则一切就变得很easy。比如一个 alpha 0.2 的颜色&#xff0c;就能够将其想像为…

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

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

大地SEO教程学习笔记之八:

仔细分析一下pagerank的构建&#xff1a; 全局结构&#xff1a;&#xff08;1&#xff09;局部结构&#xff08;2&#xff09;web结构&#xff08;矩阵&#xff09;。 细化结构&#xff1a;&#xff08;1&#xff09;分类结构&#xff08;矩阵&#xff09;&#xff0…

[html] 请实现一个文章阅读的进度条

[html] 请实现一个文章阅读的进度条 chrome 浏览器中&#xff0c;通过document.documentElement.scrollTop获取页面滚过高度&#xff0c;通过document.documentElement.scrollHeight获取页面总高度&#xff0c;通过document.documentElement.clientHeight获取当前内容高度。通…

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

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

如何实现一个符合泊松分布的即时消息发生器?

最近在做项目的时候遇到了这个问题&#xff0c;很是苦恼&#xff0c;要怪只能怪自己的数学底子太差&#xff0c;需要好好的补补。 目前有一个最简单的想法&#xff1a; int lamda 5; // 利用lamda值计算出来符合泊松分布的一串数字 int sleepTime poisonDistribution(lamda);…