1.类型增强
检查更加严格
- 比如,把一个 const 类型的指针赋给非 const 类型的指针。c 语言中可以通的过,但是在 c++中则编不过去
const int a = 100; int b = a; const int *pa = &a; int *pb = pa;
增加bool类型
- c语言中使用0和!0来表示逻辑的真假,但是在c++中使用bool类型表示逻辑的真(true)假(false);
bool flag = true; bool flag1 = false; cout<<"flag = "<<flag<<endl; //1 cout<<"flag = "<<flag1<<endl; //0 cout<<sizeof(bool); //1
真正的枚举
- c 语言中枚举本质就是整型,枚举变量可以用任意整型赋值。而 c++中枚举变量,只能用被枚举出来的元素初始化。
enum num {one = 3, two, three}; int a = one; cout<< a <<endl; //3 cout<< three <<endl; //5
表达式的值可被赋值
- c 语言中表达式通常不能作为左值的,即不可被赋值,c++中某些表达式是可以赋值的。
int a, b, c = 10; (a = b) = 20; cout<< a << b <<endl; (a>c?b:c) = 50; cout<< "a = "<< a << " b = " << b << " c = " << c <<endl; // a=20 b=50 c=10
2.输入与输出(cin/cout)
cin && cout
- cin 和 cout 是 C++的标准输入流和输出流。他们在头文件 iostream 中定义
cout<<"your name is: "<<name<<endl; cout<<"your age is: "<<age<<endl;
格式化
- 包含于头文件 #include <iomanip> 中
- 设置域宽及位数:对于实型,cout 默认输出六位有效数据,setprecision(4) 可以设置有效位数,setprecision(n)<<setiosflags(ios::fixed)合用,可以设置小数点右边的位数。
float i = 1.33333; cout<< i <<endl; //1.33333 cout<<setw(8)<<i<<endl //_1.33333 <<setw(5)<<100<<endl //__100 <<setprecision(4)<<setiosflags(ios::fixed)<<i<<endl; //1.3333
按进制输出
-
按十六进制、十进制、八进制、默认十进制 输出
//按十六进制、十进制、八进制、默认十进制 输出 int m = 15; cout<< hex << m << endl; // f cout<< dec << m << endl; // 15 cout<< oct << m << endl; // 17 cout<< setbase(10) << m << endl;// 15
设置填充符
- 还可以设置域宽的同时,设置左右对齐及填充字符
//还可以设置域宽的同时,设置左右对齐及填充字符。 cout<<setw(10)<<1234<<endl; //______1234 cout<<setw(10)<<setfill('0')<<1234<<endl; //0000001234 cout<<setw(10)<<setfill('0')<<setiosflags(ios::left)<<1234<<endl; //1234000000 cout<<setw(10)<<setfill('-')<<setiosflags(ios::right)<<1234<<endl;//------1234
3.函数重载(function overload)
函数重载规则:
- 函数名相同;
- 参数的类型,个数, 顺序不同,均可构成函数重载;
- 返回类型不同则不能构成重载;
void func(int a); //ok void func(char a); //ok void func(char a,int b); //ok void func(int a, char b); //ok char func(int a); //与第一个函数有冲突
void func(int a) { cout<< "func(int a)" <<endl; } void func(int a, char b) { cout<< "func(int a, char b)" <<endl; } void func(char b, int a) { cout<< "func(char b, int a)" <<endl; } int main(void) { int a; char b; func(a); //func(int a) func(a,b); //func(int a, char b) func(b,a); //func(char b, int a) return 0; }
函数匹配原则
- 严格匹配,找到则调用;
- 通过隐士转换寻求一个匹配;
void func(int a) { cout<< "func(int a)" <<endl; } void func(double c) { cout<< "func(double a)" <<endl; } int main(void) { func(1); //func(int a) func(2.2); //func(double a) return 0 }
重载底层实现
- c++利用name mangling(倾轧)技术,来改名函数名,区分参数不同的同名函数;
- 实现原理:用 v-c- i-f- l- d 表示 void char int float long double 及其引用。上例中的函数根据条件的不同,可能被倾轧成如下函数:
func_i(a); //func(int a) func_f(a,b); //func(int a, char b) func_l(b,a); //func(char b, int a)
extern "C"
- 倾轧name mangling 发生在两个阶段,.cpp 编译阶段,和.h 的声明阶段。只有两个阶段同时进行,才能匹配调用。
- 我们知道C++是能够兼容C的,如果我们有了一个C语言的头文件和其对应的库,在C++中如何使用它呢?在include该头文件的时候当然要加入extern "C",否则按照C++的符号进行符号修饰,那么在库中就会找不到该符号了。
- 使用extern “C”, 告诉编译器按照c语言的规则进行编译。
4.操作符重载(operator overload)
5.默认参数
6.引用
7.内存管理(new/delete operation)
new/delete 与 malloc/free的区别:
- malloc/free属于c库函数,new/delete属于c++关键字;
申请单变量
申请多维数组
8.内联函数(inline function)
9.类型增强
10.命名空间(namespace)
" :: ":作用域运算符