1.综述C++
1.1 C++产生背景
C语言作为结构化和模块化的语言,在处理较小规模的程序时,比较得心应手。但是当问题比较复杂,程序的规模较大的时,需要高度的抽象和建模时,c语言显得力不从心。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming)思想,这需要设计出支持面向对象的程序设计语言。Smalltalk 就是当时问世的一种面向对象的语言。而在实践中,人们发现c语言已深入人心,使用如此之广泛,以至于最好的办法,不是发明一种新的语言去取代它,而是在原有的基础上发展它。在这种情况下c++(plus plus)应运而生,最初这门语言并不叫c++而是c with class (带类的c)。
1.2 应用领域
1)应用软件(嵌入式应用)
如果项目中,既要求效率又要建模和高度抽像,那就选择 c++。
2)系统层软件开发
C++的语言本身的高效。
3)服务器程序开发
面向对像,具有较强的抽像和建模能力。
4)游戏, 络,分布式,云计算
效率与建模
2.C++内容和C语言的加强
2.1 C++内容
C++就名字而言,C++完全兼容C,在基础之上增加了++,其中主要包括c 的基础语法的扩展,面向对像(继承,封装,多态),模板、STL等。
学习C++语言的工具:
Linux:g++编译器 后缀:cpp 比如 :hello.cpp
g++ hello.cpp -o hello
Windows:IDE集成开发环境(vs , dev-c++, qt creator等)
2.2 C语言的加强
2.1.1 namespace命名空间及输入输出
C++命名空间基本常识:所谓namespace(关键字),是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
一 头文件区别 :
和<iostream.h>格式不一样,前者没有后缀,后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因此,
1)当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;
2)当使用的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
二 由于namespace的概念,
使用C++标准程序库的任何标识符时,可以有三种选择:
1)直接指定标识符。例如std::ostream而不是ostream。完整语句如下:比如:
std::cout << std::hex << 3.4 << std::endl;
2)使用using关键字。
using std::cout;
using std::endl;
using std::cin;
以上程序可以写成 :
cout<< std::hex << 3.4 << endl;
3)最方便的就是使用using namespace std; 例如: using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写: cout <<hex << 3.4 << endl;因为标准库非常的庞大,所以程序员在选择的类的名称或函数名 时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问 题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。所以就有了<iostream.h> 和等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加”.h”。C++输入输出标准输入流(cin):预定义的对象 cin 是 iostream 类的一个实例。cin 对象附属到标准输入设备,通常是键盘。cin 是与流提取运算符 >> 结合使用。
如下所示:
标准输出流(cout):预定义的对象 cout 是 iostream 类的一个实例。cout 对象”连接”到标准输出设备,通常是显示屏。cout 是与流插入运算符 << 结合使用。如下所示:
cout<<”a= ” << a << ”b = ” << b << endl
带换行符的结束:endl
2.1.2 C++命名空间定义以及使用方法
在C++中,名称(name)可以是符 常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突。
标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。std是c++标准命名空间,c++标准程序库中的所有标识符都被定义在std中,比如标准库中的类iostream、vector等都定义在该命名空间中,使用时要加上using声明(using namespace std) 或using指示(如std::string、std::vector).
C中的命名空间 | C++中的命名空间 |
---|---|
在C语言中只有一个全局作用域 | 命名空间将全局作用域分成不同的部分 |
C语言中所有的全局标识符共享同一个作用域 | 不同命名空间中的标识符可以同名而不会发生冲突 |
标识符之间可能发生冲突 | 命名空间可以相互嵌套 |
全局作用域也叫默认命名空间 |
C++命名空间的定义:
//自定义命名空间
2.1.2 C++对C语言的增强
- 实用性增强
在c++中,声明变量的位置是比较随意,在定义的时候就直接声明;而在C语言,要求统一放在函数最前面
- 语法检测性增强
- 对于struct(结构体)的处理方式
在C语言中,对struct是把它当作一个集合,使用时,要加struct在C++中,对于struct是把它当作一个类型—类,该类中的成员都是公开的
- 对三目运算符
在c语言中,三目运符(a>b:b) 返回的是一个字面上的量,所以不能左值 (a>b:b) = 10; //在C++中,三目运算符是可以做左值,是因为三目运算符判断返回的是一个变量
- 对于const
对于C 而言,const是一个只读变量,且分配空间
对于C++而言: const修饰的变量为一个常量,有可能没有分配空间
const与#define相同和区别
相同:
区别:
c++面试题:谈C 和 C++中的const,并且const跟#define有什么区别
- 枚举
在C语言中,枚举就是一个整型的常量,初始化时,可以直接使用整型的值
enum paly select = UP; //在C++中,对枚举类型变量初始化,只能是枚举中定义的变量来进行初始化,默认值也是从零开始
cout << “select” << select << endl;
总结:
1)输入输出是以流的形式进行 —– #include
2)命令空间(namespace)
定义 :
namespace spaceA(名字){
int a;
}
使用:通过::(域操作符)
using namesapce spaceA; —->using 叫作指示符
using spaceA::a —–> using 表示声明
思考:
namespace spaceA{
int a; //属于spaceA
}
int a = 10; //全局的作用域
int main()
{
}
3)const
在 C语言中,只读变量
在C++中,是真正的常量,该关键字修饰的变量是否占内存,要根据具体的情况来定
const 修饰的变量是放在一个符 表中,通过key-vauel来对应,所以它是一个真正的常量,可以实现#define的作用
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!