C++:静态类型语言,包含整个C,C是建立C++的基础,而且C++是强类型语言,对类型检查严格。
C++比C更丰富:支持面向对象,支持泛型编程,支持异常,运算符重载等。
一些变化
- 可以选用g++编译器(不是说只能用g++)。
- 源程序扩展名可以是.cpp .cc .C .cXX 等。
- C中的头文件变为:
#inlcude <cstdio>
。 - 不再使用scanf/printf而是cin/cout。
- 标准的C++头文件不再以.h结尾。
- 所有标准的类、函数、变量、对象都在std的命名空间中。
命名空间:
目的:对标识符的名称进行本地化,不然都在全局命名空间里,最大收益者是标准库。
定义:namespace name{//声明和定义}
using关键字:
using namspace 命名空间名称 //using namespace std;
using 命名空间名称::成员 //using std::in
C++新增的运算符:
::作用域运算符
::g=20;//表示访问的是来自全局作用域的变量g,通过作用域运算符访问被屏蔽的全局变量。
std::cout 作用域操作符,表示使用的是定义在命名空间std中的cout。
Using namespace std; //可以防止重名,公司不同产品
基本数据类型方面
c++增加了布尔数据类型和引用类型。
- Bool:布尔型,占1字节,两个bool类型常量:true 1和false 0
- 引用类型:是一个特殊数据类型,在大多数场合可以取代指针,它是一个变量的别名。
int& j=i; //j是i的引用,不占存储空间,j只是i的别名。
在定义时必须初始化,指定是哪个变量的引用。
引用类型作为函数形参,传引用可以实现传回值(完全替换)
在c++中,函数的实参和形参之间不仅支持传值,还支持传引用。
数组的引用:
#include <iostream>
using namespace std;
void output(int (&a)[5])
{
for(int i = 0; i < 5; i++)
cout<<a[i]<<endl;
}
int main()
{
int a[5]={0};
output(a);
getchar();
return 0;
}
“引用”与指针的区别是什么?
- 引用必须被初始化,指针不必。
- 引用初始化以后不能被改变,指针可以改变所指的对象。
- 不存在指向空值的引用,但是存在指向空值的指针。
指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;
而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。
C++风格的强制类型转换运算符:
类型关键字(表达式) I=int§;
复杂数据类型方面:
C++中,使用结构体,共用体,枚举类型时,可以省略不写struct,union,enum关键字
C++中,结构体是当做类来使用的,可以定义成员函数。
C++中支持匿名联合,union{int x;char c[4];} x = 100;
在C++代码中,可以在任意位置定义变量
在调用函数时,会保存函数调用处的现场信息,调用函数返回后,恢复现场,接着之前的位置继续往下执行,所以调用函数会有一定的时间和空间开销,如果函数体中只有几行代码,调用函数的时间开销甚至比执行函数体中的语句更大
在调用函数时,操作系统会为这次函数调用创建一个独立的栈区,用于存放函数的形参和内部定义的局部变量,在函数执行结束返回后,操作系统会释放这个栈区,那么栈区中的这些变量也就跟着被释放了
在函数方面:
- C++支持带默认参数的函数
- C++支持函数重载(Function Overload) 函数重载
- 参数默认值的指定顺序为从左到右依次指定。Void fun(int a ,int b=2,int c=3)
- 函数的返回类型int不能省略。
- C++中,使用结构体,共用体,枚举类型时,可以省略不写struct,union,enum关键字
- C++中,结构体是当做类来使用的,可以定义成员函数。
- C++中支持匿名联合,union{int x;char c[4];} x = 100;
- 在C++代码中,可以在任意位置定义变量
函数重载:overload,函数名相同,但形参类型列表不同(相同:形参个数相同,并且对应位置的形参类型也相同)。
重写和覆盖:override,子类继承父类,重新实现父类方法。只有函数体不同(参数列表相同,返回值一致,抛出异常一致)。
被重写的方法不能是private。
隐藏:派生类的函数屏蔽了同名基类函数。
- C++支持内联函数(In-Line Function),当然C99也支持,但C89不支持
内联函数和带参数的宏差不多
可避免时空开销,提升效率。但是代码别太多。
include <iostream>
using namespace std;
inline int sum(int a, int b);
int main()
{
int s;
//编译器在遇到内联函数调用时,会将函数调用展开为内联函数体,避免函数调用的时空开销,提升程序运行效率
//内联函数中的代码不要太多,太复杂
s=sum(3,4); //编译器会把这行处理为:s=3+4;
cout<<s<<endl;
return 0;
}
//定义内联函数,使用inline关键字
inline int sum(int a, int b)
{
return a+b;
}
一些库函数:
- 读入未知数目的string对象
Int main()
{
String word;//string类的实例化,和int word一个原理
While(cin >> word)
Cout << word << endl;
Return 0;
}
- Getline 读取整行文本
Int main()
{
String line;
While(getline(cin,line))
Cout << line << endl;
Return 0;
}
String st(“”);
St.size() //求长度
St.empty() //判断是否为空
C++风格的输入输出
Iostream库,istream ostream
流:试图说明字符是随着时间顺序生成或消耗的
- Cin
- Cout
- Cerr(标准错误)
- Clog(产生程序执行的一般信息)
- Endl 操作符(manipulator),换行效果,并刷新与设备相关联的缓冲区(buffer).
忘记刷新输出流可能造成输出停留在缓冲区,如果程序崩溃,将会导致对程序崩溃位置的错误推断。
内存管理
New和delete:操作符,可重载。
- new是先调用构造函数,再分配内存。
- delete是先调用析构函数,再释放内存。
- malloc和free是函数,可覆盖,单纯分配和释放内存。