C++语言是对C语言的扩展。所以熟悉C语言的人会发现。本书的第01~18章讲的内容基本上和C语言的内容差点儿相同。

C++一方面对C语言的语法进行了改动。还有一方面又加入一些新的概念。

C++中新增的概念有:bool类型、引用(14章)、类(19~24章)、模板(25~26章)、异常(27章)。

C++相对于C有变化的语法点有:变量分散定义、函数名重载、struct语法。本章着重是比較分析这几个有变化的语法点。

本篇选自《C/C++学习指南》,附录14

权利声明:作者拥有本书的所有权利。作者授权不论什么人都能够自由转载本站点发布的内容,但转载时必须遵守下面限制: ①转载时必须全文转载。不得有不论什么改动,必须包括“权利声明”和“官网地址” ② 仅限于网络转载。即终于结果发布于网络上。凡是不遵守以上两条的转载行为视为侵权行为。除非本人同意,不论什么人不得将本站点内容内容用于不论什么的其它用途。 

官网地址: http://www.afanihao.cn/  留言请到http://www.afanihao.cn/kbase/

1.1         在项目里加入c文件

当文件以.c作为后缀时。编译器以C语言的语法对该文件进行编译。当文件以.cpp作为后缀时。编译器以C++的语法标准对其进行编译。所以,文件的后缀名是有这个约定的,不可以随便更改。

在加入文件时,输入文件名称的后缀是.c,那在编辑这个文件时必须遵守C语言的语法,例如以下图所看到的。

1.2         变量分散定义

这一点在第8章介绍函数略有介绍。

在C语言中,全部的局部变量必须在函数或复合语句的最前面集中定义。简单地说就是变量定义语句要放在前面。不然就报语法错误。

以下的main.c(C语言)代码中,局部变量a,b的均在函数体的前部定义。因而符合C语言的语法要求,

////////////// main.c //////////
#include <stdio.h>
void main()
{
int a; // 变量定义
int b; // 变量定义 a = 10;
printf("a=%d \n", a); b = 11;
printf("b=%d \n", b);
}

以下的main.c(C语言)代码中,局部变量c的定义没有放在前面。不符合C语言的语法要求,因而编译报错,

////////////// main.c //////////
#include <stdio.h>
void main()
{
int a; // 变量定义
int b; // 变量定义 a = 10;
printf("a=%d \n", a); b = 11;
printf("b=%d \n", b); int c ; // 变量定义语句不能放在这里
c = a + b;
printf("c=%d\n", c);
}

显然,这样对于程序猿来说是非常不方便的。于是C++语言去掉了这个限制,让程序猿能够随时随地的定义变量。

1.3         函数名重载

C++同意多个函数使用同样的函数,这称为函数名重载。

而这在C语言中是万万不能够的,在C语言中,全局函数名是不能反复的。比如,在以下的main.c文件里,存在两个名称同样的全局函数do_something,导致编译器报错。

////////////// main.c //////////
#include <stdio.h> void do_something(int x, int y)
{
printf("int , int \n");
}
void do_something(double x, double y)
{
printf("double , double \n");
}
void main()
{
printf("test");
}

这个问题的本质是,在C语言中,以函数名来唯一区分一个全局函数。换句话说,函数名就是函数的唯一ID,显然ID这个东西是不能冲突的。

这导致了在C语言中,给函数起名字也成了一个比較麻烦的事情,对于功能类似的函数,因为不能起同样的名字,所以仅仅好不停地加一些后缀以示差别。比如,

do_something_int_int()

do_something_double_double()

假设你将来阅读一些C语言的代码,相信会有此感受。

C++针对此问题的改进是:以函数名+參数列表来唯一区分函数

所以。在C++中函数名是同意同样的,仅仅要參数列表有所不同就不会冲突。

1.4         struct定义

在C语言中, struct类型的定义必须加上struct的前缀,

而在C++中,struct能够直接使用其类型名来定义

相比之下,应该是C++的语法更简洁一些。所以在用C语言编写代码的时候,老是要加一个struct前缀会让人认为不耐烦。所以C程序猿一般是这么来定义的struct的。在以下的代码中,使用typedef来定义一个object_t的类型。

在C语言的世界里,这么定义struct是通用模式。为的就是在使用的时候少写一个struct前缀。

(可见C程序猿有多么无耐)。

在须要定义链表的时候,C程序猿有两种写法。

struct  Object
{
int id;
struct Object * next; //
};

typedef struct _tag_object
{
int id;
struct _tag_object * next;
}object_t;

相同的,C程序猿会选择另外一种定义方法,唯一目的就是为了在使用的时候少写一个keywordstruct而已。

1.5         C++中的struct

实际上,C++对struct进行提全面的升级,以至于C++的struct差点儿全然等效于class的语法了。凡是class支持的语法。包含成员函数、public/private、继承等所有的语法,struct也都所有支持且意义不变。也就是说,struct是class的同义语(略有区别,后面讲到)。

唯一的一点小差别:对于struct。假设没有声明不论什么改动符(public/protected/private)。则默认全部成员是public的。这一点上class相反,class默认是private的。

细数C++和C的差别的更多相关文章

  1. 细数iOS上的那些安全防护

    细数iOS上的那些安全防护  龙磊,黑雪,蒸米 @阿里巴巴移动安全 0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非 ...

  2. 细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一

    细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一(转) ADO.NET Entity Framework        ADO.NET Entity Framework 是微软以 ADO.N ...

  3. 细数Qt开发的各种坑(欢迎围观)

    1:Qt的版本多到你数都数不清,多到你开始怀疑人生.从4.6开始到5.8,从MSVC编译器到MINGW编译器,从32位到64位,从Windows到Linux到MAC.MSVC版本还必须安装对应的VS2 ...

  4. 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)【转载】

    转自: DBAplus社群 http://www.toutiao.com/m5762164771/ 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上) - 今日头条(TouTiao.com ...

  5. 细数Python Flask微信公众号开发中遇到的那些坑

    最近两三个月的时间,断断续续边学边做完成了一个微信公众号页面的开发工作.这是一个快递系统,主要功能有用户管理.寄收件地址管理.用户下单,订单管理,订单查询及一些宣传页面等.本文主要细数下开发过程中遇到 ...

  6. 细数AutoLayout以来UIView和UIViewController新增的相关API

    本文转载至 http://www.itjhwd.com/autolayout-uiview-uiviewcontroller-api/ 细数AutoLayout以来UIView和UIViewContr ...

  7. 细数MQ那些不得不说的8大好处

    消息队列(MQ)是目前系统架构中主流方式,在大型系统及大数据中广泛采用.对任何架构或应用来说, MQ都是一个至关重要的组件.今天我们就来细数MQ那些不得不说的好处. 好处一:解耦 在项目启动之初来预测 ...

  8. 细数 Windows Phone 灭亡的七宗罪(过程很详细,评论很精彩,但主要还是因为太慢了,生态跟不上,太贪了,厂商不愿意推广)

    曾梦想仗剑走天涯,看一看世界的繁华 年少的心有些轻狂,如今你四海为家 曾让你心疼的姑娘,如今已悄然无踪影 犹记得上大学攒钱买了第一台智能手机Lumia 520时,下载的第一首歌曲<曾经的你> ...

  9. 细数Intellij Idea10个蛋疼问题!

    Intellij Idea以下简称IJ. 昨天细数了IJ上的10大666的姿势,IJ确实很智能,在很多方便可以完爆Eclipes,可在某些方面真的被Eclipse秒杀 1.乱码 在Eclipse中很少 ...

随机推荐

  1. IO库 8.2

    题目:编写一个测试函数,将cin作为参数传入. #include <iostream> using std::istream; istream& func(istream& ...

  2. BZOJ 2245: [SDOI2011]工作安排( 费用流 )

    费用流模板题..限制一下不同愤怒值的工作数就可以了. ------------------------------------------------------------------------- ...

  3. hadoop搭建杂记:Linux下JDK环境变量的设置(三种配置环境变量的方法)

    Linux下JDK环境变量的设置(三种配置环境变量的方法) Linux下JDK环境变量的设置(三种配置环境变量的方法) ①修改/etc/profile文件 如果你的计算机仅仅作为开发使用时推荐使用这种 ...

  4. PHP弱类型:WordPress Cookie伪造

    1 PHP弱类型 PHP是弱类型语言,所以变量会因为使用场景的不同自动进行类型转换.PHP中用 == 以及 != 进行相等判断时,会自动进行类型转换,用 === 以及 !== 进行判断时不会自动转换类 ...

  5. svn添加强制注释,pre-commit结合python

    鉴于组内有些人在提交代码的时候并不写注释,而且没有固定格式,所以准备给svn提交时增加强制注释. 首先找到代码库里的hooks目录,正常建svn库的时候都有这个目录.进入hooks目录,找到pre-c ...

  6. RedHat升级内核成功

    升级前 uname -aLinux localhost.localdomain 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x8 ...

  7. NAND Flash中常用的纠错方式(ECC算法)

    Hanming,RS,BCH —— NAND Flash中常用的纠错方式 因为闪存中会有出错的可能,如果没有使用ECC模块,读出的数据和写入的数据会有不匹配的可能,也许一个文件中只有一两个bit不匹配 ...

  8. HTML5 postMessage 和 onmessage API 具体应用

    HTML5 postMessage 和 onmessage API 具体应用 随着 HTML5 的发展.了解并熟悉 HTML5 的 API 接口是很重要的.postMessage(send) 和 on ...

  9. Android系统的“程序异常退出”[转]

    在应用运行过程中,有很多异常可能会发生,而我们希望在异常发生的时候第一时间的保存现场. 如何处理未捕获的异常呢? 首先我们要实现一个接口  java.lang.Thread.UncaughtExcep ...

  10. Android杂谈--ListView之BaseAdapter的使用

    话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gal ...