C++
面向过程
面向对象
泛型编程
C++是一种广泛使用的通用编程语言,由Bjarne Stroustrup于1980年代初开发,作为C语言的扩展。C++在保留C语言高效、灵活和接近硬件特性的同时,增加了面向对象编程(OOP)的支持,以及泛型编程、异常处理、模板等现代编程语言的特性。以下是C++语言的主要特点及应用场景:
C++语言的特点
- 面向对象编程(OOP):C++支持封装、继承和多态等面向对象编程的特性,使得代码更加模块化,易于维护和复用。
- 高效性:C++编译成机器码执行,接近硬件,执行效率高,适合开发需要高性能的应用程序,如游戏引擎、实时系统等。
- 泛型编程:通过模板(Templates),C++支持泛型编程,使得函数和数据结构可以独立于它们操作的数据类型进行编写,提高了代码的复用性和灵活性。
- 异常处理:C++引入了异常处理机制,允许程序在发生错误时优雅地处理,而不是简单地终止执行。
- 兼容C语言:C++设计之初就考虑到了与C语言的兼容性,几乎所有的C语言代码都可以在C++编译器中编译通过,这使得C++能够利用C语言庞大的代码库和库函数。
- 标准库:C++标准库提供了大量的实用程序,包括容器(如vector、list)、算法、迭代器、输入输出流等,极大地简化了程序开发。
主要应用场景
- 游戏开发:C++因其高性能和直接访问硬件的能力,成为游戏开发领域的首选语言。许多流行的游戏引擎,如Unreal Engine、CryEngine和Unity(虽然Unity主要使用C#,但其底层核心是用C++编写的)都使用C++。
- 实时系统:C++的高性能使得它非常适合开发需要快速响应的实时系统,如嵌入式系统、操作系统、实时交易系统等。
- 系统/应用软件:许多操作系统(如Windows、Linux的部分组件)、数据库系统(如MySQL)、图形界面库(如Qt、wxWidgets)等都是用C++编写的。
- 科学计算:C++因其性能优势和丰富的数学库(如Eigen、Armadillo)支持,在科学计算领域也有广泛应用,如物理模拟、数据分析等。
- 高性能计算(HPC):C++因其接近硬件的特性和高效的执行速度,被用于开发大规模并行计算和高性能计算应用。
- 服务器软件:C++也被用于开发需要处理大量并发连接和数据的服务器软件,如Web服务器、数据库服务器等。
C++面向过程
输入输出流 | 名字空间 |
---|---|
对C数据类型的拓展 | 类型转换 |
缺省参数与哑元 | 函数重载 |
内联函数 | 动态内存管理 |
引用 |
一、输入输出流
1.1数据的输入输出
1.1.1流的概念
c++中的输入输出可以看做是一连串的数据流, 输入即可视为从文件或键盘中输入程序中的一串数据流,而输出则可以视为从程序中输出一连串的数据流到显示屏或文件中。
与c语言不同的是,对于数据缓冲区,c++更加深层次的理解数据在这段区域中是有方向的
输入流:从输入设备流向内存的字节序列。
输出流:从内存流向输出设备的字节序列。
1.1.2 cout和插入(输出)运算符 <<
当程序执行到cout
语句时,遇到<<运算符就会将要是输出的信息插入到输出流中去,最终将输出流中的数据会被输出到标准输出设备(通常为屏幕)上去。
cout << x;
输出时自动判断基本数据类型
#include <iostream>
using namespace std;
int main(void)
{
int a = 11;
float b = 1.34;
char c = 'z';
/*
*printf("%d %f %c\n",a, b, c):
*/
cout << a << " " << b <<" " << c << endl;
return 0;
}
cout的优势在于自动解析这些基本数据类型。
cout也可以格式化输出。
1.1.3 cin和析取(输入)运算符
cin >> x;
当程序执行到cin语句时,就会停下来等待键盘数据的输入。输入数据被插入到输入流中,数据输完后按Enter键结束。当遇到运算符>>时,就从输入流中提取一个数据,存入变量x中。
#include <iostream>
#include <cstdio>
using namespace std;
int main(void)
{
int x, y, z;
#if 0
scanf("%d %d %d", &x, &y, &z);
printf("%d %d %d\n", x, y, z);
#endif
cin >> x >> y >> z;
cout << x << " " << y << " " << z << endl;
return 0;
}
-
在一条cin语句中可以同时为多个变量输入数据。 各输入数据之间用一个或多个空白作为间隔符
-
cin具有自动识别数据类型的能力,析取运算符>>根据它后面的变量类型从输入流中为他们提取对应的数据。
比如: cin >>x;
假设输入数据2, 析取运算符>>将根据其后x的类型决定输入的2到底是数字还是字符。若x是char类型,则2就是字符;若x是int,float之类的类型,则2就是一个数字。假设输入34,且x是char类型,则只有字符3被存储到x中,4将继续保存在流中。
#include <iostream> using namespace std; int main(void) { int a; double b; char c; cin >> a >> b >> c; cout << " a: " << a << " b: " << b << " c: " << c << endl; return 0; } /* 12.34a a: 12 b: 0.34 c: a */
1.2名字空间
1.2.1名字空间的定义
-
语法格式
namespace xxx_name{ members; }
-
举例
namespace ABC{ int num; struct stu{ int age; char *name; }; double add(int a, int b) { return (double)a+b; } int Min(int a, int b){ return a>b?a:b; } }
1.2.2名字空间的成员访问
名字成员的空间访问主要有三种方法:
-
通过作用域限定符(:😃
#include <iostream> using namespace std; namespace ns1{ void func(void){ cout << "ns1 func" << endl; } } namespace ns2{ void func(void){ cout << "ns2 func" << endl; } } int main(void) { ns1::func(); ns2::func(); return 0; }
-
using引用名字空间单个成员(有一个函数用的特别多)
#include <iostream> using namespace std; namespace ns1{ void func(void){ cout << "ns1 func" << endl; } } namespace ns2{ void func(void){ cout << "ns2 func" << endl; } } int main(void) { ***************** *using ns1::func;* ***************** // ns1::func(); ns2::func(); func(); return 0; }
-
using引用名字空间全部成员(有一个作用域用的特别多)
#include <iostream> using namespace std; namespace ns1{ void func(void){ cout << "ns1 func" << endl; } int a = 100; } namespace ns2{ int a = 200; void func(void){ cout << "ns2 func" << endl; } } int main(void){ ********************* *using namespace ns1;* ********************* ns2::func(); //ns1::func(); func(); cout << a << endl; return 0; }
1.2.3无名名字空间
未命名的名字空间称作无名名字空间。
namespace{ //无名名字空间
int a = 300;
}
cout << ::a<< endl; //无名名字空间成员的引用
1.2.4 名字空间嵌套
指定义在其他名字空中的名字空间。
#include <iostream>
using namespace std;
namespace ns1{
void func(void){
std::cout << "ns1 func" << std::endl;
}
int a = 100;
namespace ns2{
int b = 111;
}
}
int main(void){
cout << ns1::ns2::b << endl;
return 0;
}
//无名名字空间成员的引用
### 1.2.4 名字空间嵌套
指定义在其他名字空中的名字空间。
```c++
#include <iostream>
using namespace std;
namespace ns1{
void func(void){
std::cout << "ns1 func" << std::endl;
}
int a = 100;
namespace ns2{
int b = 111;
}
}
int main(void){
cout << ns1::ns2::b << endl;
return 0;
}