C++对于C故有问题的改进
C++继承了所有的C特性,并且提供了更丰富的语法和特性(OOP支持、模板支持等),并且拥有和C语言同样出色的运行效率。针对C语言的固有问题,C++做出了如下的升级:
- 所有变量都可以在需要使用时再定义(C99支持)
- 忽略register关键字,仍然可以取得register变量的地址
- 不允许定义多个同名的全局变量(C允许这样做,并且这些变量最终会被链接到同一块内存上)
- struct关键字现在可以用来定义一个全新的类型(C只是定义一个标识符,不是一种类型)
- 函数声明中的参数列表为空则表示void(在C中,可以传入任意多的参数)
- 所有的标识符都必须显示声明类型(在C中,默认类型是int)
一、所有变量都可以在需要使用时再定义
在C99标准之前,C函数中的所有变量定义都必须要写在函数的开头:
int main()
{
return 0;
}
void func()
{
int a, b, i;
// 运算代码...
a = 10;
// 运算代码...
b = 20;
// 运算代码...
for(i = 0; i < 10; i++) {
// 运算代码...
}
}
这样做的问题在于:如果函数非常复杂,需要使用的变量很多,那么很难根据上下文来判断变量的含义,对于代码的书写和阅读都很不利。因此,自C99标准开始,C支持在变量需要使用时再定义和初始化:
void func()
{
// 运算代码...
int a = 10;
// 运算代码...
int b = 20;
// 运算代码...
for(int i = 0; i < 10; i++) {
// 运算代码...
}
}
而对于C++,在语言设计之初就已经支持了这个特性。所有的对象都可以在函数中的任意位置定义。
二、忽略register关键字,仍然可以取得register变量的地址
在C语言中,register关键字用于请求编译器将变量直接定义在寄存器中(编译器可能会根据实际情况忽略这个请求)。然而,这个功能在C++中是一个鸡肋,因此大多数C++不会针对register关键字进行特殊优化。
int main(int argc, char *argv[])
{
register int a = 0;
int *pa = &a; // C语言不允许这样做,但C++可以。
return 0;
}
三、不允许定义多个同名的全局变量
对于老式的C语言编译器(比如BCC编译器),允许定义同名的全局变量,并且将它们链接到同一块内存上。虽然一些现代化的C编译器(例如gcc, VC)同样不允许这样做,但是这仍然是C的一个黑暗地带。因此,C++完全禁止了这样的做法。现在,C++中的同名的全局变量一定会引发编译错误。
int g_v = 1;
double g_v = 2; // 编译错误: 定义同名的全局变量。
int main(int argc, char *argv[])
{
return 0;
}
四、struct关键字现在可以用来定义一个全新的类型
在C语言中,struct关键字仅仅用于将多个其他数据类型组合在一起,采取一定的对齐方式占用一块连续的内存空间。然而,它定义的只是一个标识符,无法直接使用这个标识符来定义变量,而必须要使用类型别名的方式来为这个标识符定义类型名称。C++针对struct做了重要的扩充。现在,struct被用来定义类类型,不仅直接定义一个新类型,还支持类相关的写法(更多的被用于定义POD(Plain Old Data)类型)。
struct my_struct
{
int a;
float b;
double c;
};
int main(int argc, char *argv[])
{
// C风格的变量定义。
struct my_struct a;
// C++风格的对象定义。
my_struct c;
return 0;
}
五、函数声明中的参数列表为空则表示void
在C中,函数声明中的参数列表如果为空,则意味着该函数可以接受任意多的实参;而在C++中,这种写法与void等价:
int func()
{
//...
return 0;
}
int main(int argc, char *argv[])
{
func(1, 2, 3, 4/*....*/); // C语言允许这样做,这些变量在函数调用时被压栈。
// C++语言不允许这样做,因为参数列表被推断为void。
return 0;
}
六、所有的标识符都必须显示声明类型
C语言中允许使用函数的默认返回类型和变量的默认类型,然而对此C++有更严格的要求,必须显示地声明变量的类型,或者使用自动类型推断(C++11)。
// C语言允许这样做,默认的返回类型为int。
// C++语言不允许这样做,必须显示地指定返回类型,或者使用自动类型推断。
func()
{
return 5;
}
// C++允许的做法
int func() // 显示指定返回类型
{
return 5;
}
auto func() // 自动推断返回类型(C++11)
{
return 5;
}
decltype(auto) func() // 自动推断返回类型(C++11)
{
return 5;
}
C++对于C故有问题的改进的更多相关文章
- 120项改进:开源超级爬虫Hawk 2.0 重磅发布!
沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
- 挑子学习笔记:两步聚类算法(TwoStep Cluster Algorithm)——改进的BIRCH算法
转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/twostep_cluster_algorithm.html 两步聚类算法是在SPSS Modeler中使用的 ...
- ITTC数据挖掘平台介绍(四) 框架改进和新功能
本数据挖掘框架在这几个月的时间内,有了进一步的功能增强 一. 超大网络的画布显示虚拟化 如前几节所述,框架采用了三级层次实现,分别是数据,抽象Node和绘图的DataPoint,结构如下: ...
- C# 3.0新语言特性和改进(一)
引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...
- jqGrid插件getCol方法的一个改进
jgGrid插件是非常常用的一个基于jQuery的表格插件,功能非常强大.我最近也频繁使用.但是这个插件也有一些不够完善的地方.比如这个getCol方法. getCol方法接受三个参数 colname ...
- kaggle入门2——改进特征
1:改进我们的特征 在上一个任务中,我们完成了我们在Kaggle上一个机器学习比赛的第一个比赛提交泰坦尼克号:灾难中的机器学习. 可是我们提交的分数并不是非常高.有三种主要的方法可以让我们能够提高他: ...
- SQL Server 2016中In-Memory OLTP继CTP3之后的新改进
SQL Server 2016中In-Memory OLTP继CTP3之后的新改进 转译自:https://blogs.msdn.microsoft.com/sqlserverstorageengin ...
- Hadoop学习笔记—21.Hadoop2的改进内容简介
Hadoop2相比较于Hadoop1.x来说,HDFS的架构与MapReduce的都有较大的变化,且速度上和可用性上都有了很大的提高,Hadoop2中有两个重要的变更: (1)HDFS的NameNod ...
- Java进击C#——语法之知识点的改进
本章简言 上一章我们讲到关于面向对象思想上C#和JAVA之差别.笔者分别从面向对象的三大特性入手.而本章主要讲一些C#改进的知识点.在.NET Framework 2.0之后出现很多新的知识点.这些知 ...
随机推荐
- $Loj10155$ 数字转换(求树的最长链) 树形$DP$
loj Description 如果一个数x的/约数和/y(不包括他本身)比他本身小,那么x可以变成y,y 也可以变成x.限定所有数字变换在不超过n的正整数范围内进行,求不断进行数字变换且不出现重复数 ...
- Docker+Nginx使用流程(笔记)
Docker+Nginx使用流程 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统 # uname -r 查看你当前的内核版本 # yum -y insta ...
- 移动web 1像素边框
实现方法 border-image 图片 实现 这篇文章是腾讯github上的解决方案border-image来实现的 链接走起 <使用border-image实现类似iOS7的1px底边> ...
- 第一篇博客-- 走上IT路
首先介绍一下本人,我是一名在校大学生,在一次学长分享学习经验时了解到,写博客可以帮助复习.所以这就是我要写博客的原因. 我是非常喜欢网络安全技术,因此我选择了我这个专业.在接下来的一段时间我会在这里记 ...
- 【UEFI&BIOS】---BIOS开机串口报"ERROR: C2:V1050007 IO 93B80003-9FB3-11D4-9A3A-0090273FC14D 6413FA18"的分析
intel的X86 CPU对运行错误的处理已经做的非常完善了,一般即使是开机卡死,跑飞等各种问题也会丢给你相关的提示信息,那么掌握这种错误的分析手段就显得至关重要.在实际开发的过程中,我遇到了一个错误 ...
- dubbo配置文件解读(2)
<dubbo:service/> <dubbo:reference/> <dubbo:protocol/> <dubbo:registry/> < ...
- C# 二分法的解读
注:一定是有序的数组,才可以使用这种算法,如果数组没有排序则先进行排序后再调用此方法. 1.二分法是做什么的呢? 当然是查找数组中的数据了,开个玩笑,哈哈哈. 2.为啥要用这种方式呢? 二分顾名思义, ...
- .NET绘制旋转太极图
.NET绘制旋转太极图 我之前发了一篇<用.NET写"算命"程序>的文章,但有人纷纷提出了质疑,认为没有"科学"(mi xin)依据
- 【python系统学习07】一张图看懂字典并学会操作
点击跳转 - 原文地址 数据类型 - 字典(dict) 目录: 一张图get字典 字典是什么 js的对象 字典长啥样 语法伪代码 示例demo 语法成像 字典怎么用 字典长度获取--len函数 提取字 ...
- python接口自动化中,注册接口随机生成手机号码
如大家所知在注册接口中,手机号参数需要的是未注册的手机号,而在测试用例中,你写入的手机号不一定是未注册的.所以这时需要对注册接口中传入的手机号做处理.下面我就分享一个课程里面学到的一个处理手机号的py ...