C 与 C++ 区别
C 与 C++ 区别
本文介绍 C 与 C++ 之间重要的或者容易忽略的区别。尽管 C++ 几乎是 C 的超集,C/C++ 代码混用一般也没什么问题,但是了解 C/C++ 间比较重要区别可以避免碰到一些奇怪的 bug。如果你是以 C 为主力语言的 OIer,那么本文也能让你更顺利地上手 C++。C++ 相比 C 增加的独特特性可以阅读 C++ 进阶 部分的教程。
宏与模板
C++ 的模板在设计之初的一个用途就是用来替换宏定义。学会模板编程是从 C 迈向 C++ 的重要一步。模板不同于宏的文字替换,在编译时会得到更全面的编译器检查,便于编写更健全的代码,利用 inline 关键字还能获得编译器充分的优化。模板特性在 C++11 后支持了可变长度的模板参数表,可以用来替代 C 中的可变长度函数并保证类型安全。
指针与引用
C++ 中你仍然可以使用 C 风格的指针,但是对于变量传递而言,更推荐使用 C++ 的 引用 特性来实现类似的功能。由于引用指向的对象不能为空,因此可以避免一些空地址访问的问题。不过指针由于其灵活性,也仍然有其用武之处。值得一提的是,C 中的 NULL 空指针在 C++ 中有类型安全的替代品 nullptr 。引用和指针之间可以通过 * 和 & 运算符 相互转换。
struct
尽管在 C 和 C++ 中都有 struct 的概念,但是他们对应的东西是不能混用的!C 中的 struct 用来描述一种固定的内存组织结构,而 C++ 中的 struct 就是一种类, 它与类唯一的区别就是它的成员和继承行为默认是 public 的 ,而一般类的默认成员是 private 的。这一点在写 C/C++ 混合代码时尤其致命。
另外,声明 struct 时 C++ 也不需要像 C 那么繁琐,C 版本:
typedef struct Node_t{
struct Node_t *next;
int key;
} Node;
C++ 版本
struct Node {
Node *next;
int key;
};
const
const 在 C 中只有限定变量不能修改的功能,而在 C++ 中,由于大量新特性的出现,const 也被赋予的更多用法。C 中的 const 在 C++ 中的继任者是 constexpr,而 C++ 中的 const 的用法请参见 常值 页面的说明。
内存分配
C++ 中新增了 new 和 delete 关键字用来在“自由存储区”上分配空间,这个自由存储区可以是堆也可以是静态存储区,他们是为了配合“类”而出现的。其中 delete[] 还能够直接释放动态数组的内存,非常方便。 new 和 delete 关键字会调用类型的构造函数和析构函数,相比 C 中的 malloc() 、 realloc() 、 free() 函数,他们对类型有更完善的支持,但是效率不如 C 中的这些函数。
简而言之,如果你需要动态分配内存的对象是基础类型或他们的数组,那么你可以使用 malloc() 进行更高效的内存分配;但如果你新建的对象是非基础的类型,那么建议使用 new 以获得安全性检查。值得注意的是尽管 new 和 malloc() 都是返回指针,但是 new 出来的指针 只能 用 delete 回收,而 malloc() 出来的指针也只能用 free() 回收,否则会有内存泄漏的风险。
C 与 C++ 区别的更多相关文章
- c#与java的区别
经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...
- jquery和Js的区别和基础操作
jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...
- 【原】nodejs全局安装和本地安装的区别
来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...
- 探究@property申明对象属性时copy与strong的区别
一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...
- X86和X86_64和X64有什么区别?
x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
- MySQL中interactive_timeout和wait_timeout的区别
在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR (HY000): Lost connection to MySQL server ...
- 设置line-height:1.5和line-height:150%或者line-height:150px的区别
直接正题: 看一下line-height可能的值: 其实可以分为两类: (1)不带单位的(如line-height:1.5),这种是推荐使用的: (2)带单位的(如line-heigth:30px/1 ...
- C#中Length和Count的区别(个人观点)
这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...
- select、poll、epoll之间的区别总结
select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...
随机推荐
- CSS+HTML初学跟踪项目记录笔记【防丢失】(文章发布系统)二【鸽了】
贴上源代码 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...
- Go语言函数详解
函数 (1)函数的定义 函数使用func进行定义 函数是基本的代码块,用于执行一个任务 Go语言至少有一个main函数 函数声明告诉了编译器函数的名称,返回类型和参数 //1.无参数无返回值函数的定义 ...
- 0x04.信息收集
探针 被动:借助网上的一些接口查询或者网上已经获取到的,查看历史信息. 主动:使用工具,从本地流量出发,探测目标信息,会发送大量流量到对方服务器上. 谷歌语法 懒人语法:https://pentest ...
- [CSAPP、APUE、UNP]文件、IO
<鸟哥的Linux私房菜:基础学习篇(第四版)> 第5章 Linux的文件权限与目录配置 第6章 LInux文件与目录管理(正在进行) <CSAPP> 第10章 系统级IO 1 ...
- 记一次线上Oracle连接耗时过长的问题
问题现象 1.远程Oracle数据库通过IP:PORT/SERVICE_NAME连接 2.应用服务通过Docker容器部署,访问Oracle联通性测试接口,需要50s左右才能返回连接成功: 3.写了个 ...
- 神经网络优化篇:详解偏差,方差(Bias /Variance)
偏差,方差 注意到,几乎所有机器学习从业人员都期望深刻理解偏差和方差,这两个概念易学难精,即使自己认为已经理解了偏差和方差的基本概念,却总有一些意想不到的新东西出现.关于深度学习的误差问题,另一个趋势 ...
- serdes 常见并口位宽
serdes主要完成串并转换功能.常见的并口位宽如下: GE/10/25GE/32GE 10/20/40/16/32位 50GE ...
- 【译】Visual Studio 17.8 中我最喜欢的特性
对于 Visual Studio 团队来说,这是忙碌的一周,他们准备了 Ignite 和 .NET Conf,并发布了最新版本的 Visual Studio 2022,即17.8版本.有很多很酷的新功 ...
- 如何将 performance_schema 中的 TIMER 字段转换为日期时间
问题 最近有好几个朋友问,如何将 performance_schema.events_statements_xxx 中的 TIMER 字段(主要是TIMER_START和TIMER_END)转换为日期 ...
- IDEA配置自定义标签,实现高亮注释~
为什么要写这么一篇博客呢? 不知道大家有没有这样的一种苦恼,就是在写代码的时候遇到复杂的核心的代码,想加一个特殊的注释方便后期自己或者同事查看,但是这玩意IDEA好像只给我们提供了两个 FIXME : ...