C++与C语言的过渡
一、什么是C++
C++是本贾尼博士(此人也被称为C++之父),在C语言的基础上对C语言进行补全与引入新内容,正是因为在C语言的基础上进行的,所以C++兼容C语言,在前期学习C++的过程中很多的语法都是相同的,当然也有不同的地方,下面举几个特点。
1.面向对象编程
C++是一种支持面向对象编程的语言,提供了类、对象、继承、多态等的特性,这些在C语言(面向过程编程)里是没有的。
何为类,何为对象,简单来说,类是抽象的,对象是具体的。
比如说,我们学生,学生有自己的属性- - -姓名、性别、年龄、学号等等,学生也有他自己的行为(方法),比如学习,将这些聚合在一起,这就是类,学生类;对象就是某一个具体的学生,他具有这个学生类的属性和行为,这就是对象。
2.标准库不同
C++的标准库是从C语言标准库里继承并以C++的方式重写,位于std的命名空间中。C++提供的库比C语言要多得多,并且更复杂,比如包含有容器,算法,输入输出等的高级功能,而C语言就要相对简单一些,没有提供这些类似的高级功能。
二、解析第一个C++程序
前面总的学习了C语言,也算是对编程语言有一定的基础,话不多说,直接进入第一个C++程序的解析。
#include<iostream> //头文件
using namespace std; //新特性 --- namespace命名空间
int main() //主函数
{
cout << "hello world" << endl; //输出
return 0;
}
我们会发现C++的程序与C语言程序差别还是蛮大的:
首先头文件从stdio.h - - -> iostream ,其次引入了一个新特性命名空间namespace,最后是新的输出方式;但是也会发现老朋友,main函数,同样是整个程序的入口,也具有所有源文件只能存在一个main函数的原则,以及return语句。
下面来一一介绍一下新朋友。
1.头文件iostream
C++的头文件含义和C语言的一致,这里的iostream是一个标准的输入输出流头文件,其中i就是input(输入),o就是output,stream代表流,是用来描述数据的连续传输的,其操作主要靠"<<“流插入和”>>"流提取实现。
2.命名空间namespace
命名空间就是一个完完全全新的概念,命名空间是用来解决C语言命名冲突的问题,何为命名冲突,就如下面的例子:
2.0例子:
例子1:
#include<stdio.h>
//#include<stdlib.h>
int rand = 10; //没有包含sidlib.h时,此变量命名为rand,是一个全局变量,能正常打印
int main()
{
printf("%d\n", rand);
return 0;
}
在上面C语言的程序中,我们想要打印变量叫rand的值,没有包含sidlib.h时可以正常打印,假设程序后面需要使用stdlib库里的内容时,会报一个错误:

这就是命名冲突。
例子2:
当我们到导入第三方库的时候,此库里面的某些变量或者类型等等与我们已经声明定义好的变量或者类型啥的相冲突,导致程序报了一大堆的错误,此时要想修改总不能一个一个将变量或者类型都给改名吧。
为了解决这种命名冲突的情况,所以C++就引入namespace,命名空间。
2.1域:
命名空间本质上是定义一块新的域出来,此域和全局域独立,不同的域内可以定义同名的变量,所以要解决上述rand的问题,定义新的命名空间即可。
在C语言阶段我们接触到了全局域和局部域,C++又新引入了命名空间域,之后还有一个类域,这四个域都能影响变量/函数/类型的编辑查找逻辑,而且全局域和局部域影响生命周期,命名空间域和类域不影响生命周期。
C++标准库都放在⼀个叫std(standard)的命名空间中。
2.2作用:
防止命名冲突,提高代码的可维护性,控制作用域。
2.3定义:
namespace是它的关键字,以这种形式namespace XXX{ 内容 }来使用。
2.3.1普通定义
对上面C语言代码rand的改造:
#include<stdio.h>
#include<stdlib.h>
namespace byte
{
int rand = 10; //此时将rand放进了一个叫byte这个名字的命名空间
}
int main()
{
//这里默认访问的是stdlib库里面的随机值函数
printf("%p\n", rand);
//这里就使用的是byte命名空间的rand变量
printf("%d\n", byte::rand); //这里的::是作用域限定符
return 0;
}
运行结果:

要访问某一命名空间内的成员时,要使用 ‘::’ 这个操作符,名叫作用域限定符。
当然命名空间内不仅仅只是存放变量,函数,类型啥的也都能存放。
2.3.2嵌套定义
命名空间也可以嵌套使用,也就是命名空间里再定义一个命名空间。
示例代码如下:
namespace byte //定义一个byte命名空间
{
int rand = 10;
namespace bit //在byte命名空间里面再定义一个bit命名空间
{
int rand = 50;
}
}
访问bit命名空间内的成员:
//这里就使用的是byte命名空间的rand变量
printf("%d\n", byte::bit::rand);
2.3.3定义同名称的命名空间
命名空间可以在同一个域内反复被定义,这个不会产生命名冲突,定义的同名命名空间会认为是⼀个命名空间。
示例代码如下:
namespace byte //定义一个byte命名空间
{
int rand1 = 10;
namespace bit
{
int rand = 50;
}
}
namespace byte //又定义一个byte命名空间
{
int rand2 = 10;
}
上述byte命名空间的成员就是rand1与rand2。

2.4使用
指定命名空间访问,项⽬中推荐这种⽅式。
示例代码如下:
namespace byte
{
int rand = 10;
}
int main()
{
//指定命名空间访问
printf("%d\n", byte::rand);
return 0;
}
using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
示例代码如下:
#include<iostream>
using namespace std;
namespace byte
{
int num1 = 10;
int num2 = 100;
int num3 = 1000;
}
using byte::num1; //假设这里num1变量使用的频繁,将它从命名空间中展开
int main()
{
cout << num1 << endl; //后续使用其变量的时候就不用指定命名空间了
}
展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。
示例代码如下:
#include<iostream>
using namespace std; //这种写法就是将std命名空间的所有成员展开
namespace byte
{
int num1 = 10;
int num2 = 100;
int num3 = 1000;
}
//全展开
using namespace byte;
int main()
{
cout << num1 << endl; //后续使用其变量的时候就不用指定命名空间了
cout << num2 << endl;
cout << num3 << endl;
}
3.输入输出
C++里输入通常是使用cin,in就是input(输入),c就是character(字符),代表的是基于字符的输入流。
输出通常是使用cout,out就是output(输出),c就也是character(字符),代表的是基于字符的输出流。
endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。
<< 和 >>分别是流插入运算符,流提取运算符。
示例代码如下:
#include<iostream>
#include<String.h>
using namespace std;
int main()
{
//输出整型变量
int a = 0;
cin >> a;
cout << "a = " << a;
return 0;
//输出字符串类的变量
string s = "hello C++!!!";
cout << s << endl;
}
通过代码可以观察到C++的输入输出比C语言的使用起来更加简单,不需要指定输出变量的类型也就是%d,%c,%s这些,并且C++的输⼊输出可以⾃动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是C++的流能更好的⽀持⾃定义类型对象的输⼊输出。
三.总结
上述的知识点其实都是C++对于C语言的补全,可能命名冲突,引入namespace,更加方便的输入输出方式,以及重要的类与对象特性的引入等等。
正如C++名字而言,C语言的更进一步。
5483

被折叠的 条评论
为什么被折叠?



