C++读作“C加加”,是“C Plus Plus”的简称,C++ 是在C语言的基础上增加新特性,从语法上看,C语言是 C++ 的一部分,C语言代码几乎不用修改就能够以 C++ 的方式编译。
对于C和C++的关系,有很多种说法,从表面上看,很容易认为C++是C的升级版,C++比C高大上,C过时了,有这种想法说明他不了解C/C++语言,我们先来看看世界编程语言排行榜,下表是2019的数据(过去十年的数据也大致如此)。
从上表中看出,这个世界上的C程序员比C++程序员多很多。
这么多年了,我也搞不清楚自己是C程序员,还是C++程序员,好像没什么差别。
C++有很多新的特征,这些新特征并不一定实用,甚至很烦人。但是,C++的开发效率确实比C要高,所以我仍然采用断章取义的方式来介绍C++的知识。不管是C还是C++,实用就好。
一、C++程序的命名规则
C++头文件一般采用.h后缀,也用有.hpp的。
C++程序文件一般采用.cpp后缀,也有用.cc的,建议采用.cpp,C++对程序文件的命名没有强制要求,采用.cpp为后缀是大部分程序员的习惯。
二、C++程序的编译
在某些操作系统中,C和C++是同一个编译器,在CentOS中,C的编译器是gcc,C++的编译器是g++。
1、安装g++编译器
用root用户登录服务器,执行以下命令安装或升级gcc-c++编译器。yum -y install gcc-c++
如果您的CentOS系统没有安装gcc-c++,以上命令就会安装最新版本的gcc-c++,如果已经安装了gcc-c++,就会更新到最新版本的gcc-c++,所以,以上命令不管执行多少次都没有问题。
安装gcc-c++的前提条件是服务器必须可以访问互联网。
2、编译C++程序
编译C程序的命令是gcc,编译C++程序的命令是g++,g++命令和gcc命令的用法相同,把gcc改为g++就可以了,我们在学习C语言时编写的那些示例程序,基本上都可以用g++来编译。
三、C++是面向对象语言
C语言是面向过程的编程语言,C++是面向对象的编程语言,很多人认为面向对象会比面向过程的方法更先进。仁者和智者的说法各有不同,大家慢慢体会,不能人云亦云。
C++的对象,确实可以大幅的提升了C程序员的开发效率,降低程序员犯错的机会。
四、C++输入和输出
在C语言中,我们使用scanf和printf来对数据进行输入输出操作。在C++语言中,增加了cin和cout输入输出,但是我从来不用它,因为它不实用,对格式化的支持实在是太麻烦。
printf实在太完美,太强大。
五、C++异常
C++增加了异常机制,但是,它从诞生开始就一直有争议。
我没有发现C++的异常有什么实用价值,也从来没有用过它。
六、C++命名空间和模板
了解一下命名空间和模板的概念和用法是可以的,会使用就行,但我不建议自定义命名空间和模板,没必要把程序搞得那么麻烦。
七、C++布尔类型(bool)
C语言并没有彻底从语法上支持“真”和“假”,只是用 0 和非 0 来代表。这点在 C++中得到了改善,C++ 新增了 bool 类型(布尔类型),它占用 1 个字节长度。bool 类型只有两个取值,true 和 false:true 表示“真”,false 表示“假”。
bool是类型名字,也是 C++ 中的关键字,它的用法和 int、char、long 是一样的,可以用=赋值,可以用于函数的参数和返回值。bool flag=true; // 定义bool型变量flag,赋值为true
if (flag) printf("flag is true");
else printf("flag is fals");
flag=false; // 把flag赋值为false
if (flag) printf("flag is true");
else printf("flag is fals");
八、C++定义变量的位置
ANSI C规定,所有局部变量都必须定义在函数开头,在定义变量之前不能有其他的执行语句。C99标准取消这这条限制,但是某些编译器对C99的支持很不积极,仍然要求变量定义在函数开头,或者只支持一部分。
取消限制带来的另外一个好处是,可以在 for 循环的控制语句中定义变量。int total=0;
for(int ii=1; ii<=100 ;ii++)
{
total = total + ii;
}
这个很棒,程序更简洁,更自由。
九、C++函数的缺省参数
在C语言中,函数在声明的时候指定了参数列表,调用的时候函数参数的个数、顺序和数据类型必须与函数声明参数列表相同,但是在C++中,声明函数的时候,可以为函数指定缺省参数,调用时缺省参数可以不填写。例如:int writetofile(FILE *fp,char *strbuf,bool enbuffer=true); // 指定参数enbuffer的缺省值为true
enbuffer参数表示是否启用缓冲区,writetofile函数被调用的时候,如果只写fp和strbuf参数,不写enbuffer参数,enbuffer参数将缺省为true,例如:writetofile(fp,strbuf); // 调用函数的时候,如果第三个参数enbuffer不填,就用缺省值true
这个不错,程序更简洁。
十、C++动态内存管理
在C语言中,动态管理内存用 malloc() 函数,释放内存用 free() 函数。
在C++中,这两个函数仍然可以使用,但是C++又新增了两个关键字,new 和 delete,new 用来动态分配内存,delete 用来释放内存。
和C语言的动态内存管理一样,C++动态内存管理的应用场景不多。
十一、C++的学习的策略
在我看来,C++至少有70%的内容没有实用价值,在这个阶段,我们先只学习C++中重要的、有实用价值的内容,十天左右的时间可以完成,如下:
1)C++函数重载;
2)类的基本知识。
3)引用。
4)string类。
5)vector容器。
6)类的继承。
然后学习Linux编程基础,再进入职业技能教程,在学习完职业技术程后,您的学习能力和判断能力远远超过今日,再回头来看看C++的其它知识,网上的免费视频到处都是,三天就可以完成。
学习的技巧很重要,在基础知识上花太多的时间容易打击学习的积极性,那些没有实用价值的知识还会浪费您宝贵的时间。
十二、课后作业
编写您最后一个C程序,生成一个makefile文件,把您在学习C语言基础时写的源代码用C++来编译,个别用到_public.h和_public.c的程序例外用手工处理。顺便看看C++编译器和C有什么不同。
源代码:/*
* 程序名:task.c,此程序生成一个makefile文件,把您在学习C语言基础时写的源代码用C++来编译,个别用到_public.h和_public.c的程序例外用手工处理。顺便看看C++编译器和C有什么不同。
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include
#include
#include
#include
int main(int argc,char *argv[])
{
if (argc != 2) { printf("请指定目录名。\n"); return -1; }
char strfilename[100][31]; // 存放文件名列表。
memset(strfilename,0,sizeof(strfilename));
DIR *dir; // 定义目录指针
// 打开目录
if ( (dir=opendir(argv[1])) == 0 ) return -1;
// 用于存放从目录中读取到的文件和目录信息
struct dirent *stdinfo;
int itotalcount=0; // 文件总数。
while (1)
{
// 读取一条记录并显示到屏幕
if ((stdinfo=readdir(dir)) == 0) break;
if ( (stdinfo->d_type==8) && (strcmp(stdinfo->d_name+strlen(stdinfo->d_name)-2,".c")==0) )
{
printf("name=%s,type=%d\n",stdinfo->d_name,stdinfo->d_type);
strncpy(strfilename[itotalcount],stdinfo->d_name,strlen(stdinfo->d_name)-2);
printf("name=%s\n",strfilename[itotalcount]);
itotalcount++;
}
}
closedir(dir); // 关闭目录指针
FILE *fp=0;
if ( (fp=fopen("Makefile","w"))==0)
{
printf("fopen(Makefile) failed.\n"); return -1;
}
int ii=0;
// 生成all:部分。
fprintf(fp,"all:");
for (ii=0;ii
fprintf(fp,"\n\n");
// 生成每个程序的编译指令。
for (ii=0;ii
{
fprintf(fp,"%s:%s.c\n",strfilename[ii],strfilename[ii]);
fprintf(fp,"\tgcc -o %s %s.c\n\n",strfilename[ii],strfilename[ii]);
}
// 生成clean:部分。
fprintf(fp,"clean:\n\trm -rf ");
for (ii=0;ii
fprintf(fp,"\n");
fclose(fp); // 关闭文件指针。
}
十三、版权声明
C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
作者:码农有道
如果文章有错别字,或者内容有错误,或其他的建议和意见,请您联系我们指正,非常感谢!!!