1.命名空间 namespace
为什么要使用命名空间:一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突。
::作用域限定符 用来限定变量的所属域
2.c++中可以使用 for(int i = 0; i <10; i++)循环,C语言中会语法报错,此时i不算被定义,之后不可使用
3.register关键字请求“编译器”将局部变量存储于寄存器中
C语言中无法取得register变量地址
在C++中依然支持register关键字
1、C++编译器有自己的优化方式,不使用register也可能做优化
2、C++中可以取得register变量的地址
C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
C++中若对register变量取地址,则该变量不再是寄存器变量,系统自动为其分配地址,变为普通变量
4.未初始化的全局变量为0,为初始化的局部变量为垃圾值,C语言中可以对全局变量重复定义,C++中不可以对全局变量进行重复定义
5.结构体加强在c++中结构体相当于是一种数据类型,如struct Test{};,定义时可以写成Test t;
6.函数参数:C语言中print()可以接受任意个参数,print(void)没有参数
c++中,返回值必须要有类型,即函数必须有类型,形参有无void都一样,都不能传入参数
7.新增bool型,bool a = true a则为1,bool型的值只能是0或1
8.条件表达式:C语言中 :
int a = 1, b = 2;
int c = (a > b) ? a : b;
此时条件表达式的返回值是一个常量2,而不是b这个变量,所以条件表达式不能是左值,因为常量不能被赋值
可以通过 (a > b) ? &a : &b来返回一个地址来作为左值
c++中条件表达式可以作为左值,返回的是变量本身
9.c++中,const int a = 1, a是一个常量,存在与编译器的符号表中,不占用内存,
int *p = (int*)&a 操作系统则会分配四个字节来存放1,但是与a无关,a是一个常量,用1来替换
const与define的区别:两者作用域不同
const int a = 1 //a是一个局部变量,函数内部有效
#define b 1 //宏,代码从这一行向下都有效
10.c++中的引用
引用可以看作一个已定义变量的别名
引用的语法:Type& name = var;
#include <stdio.h>
int main()
{
// 定义一个int型变量a,在内存中占4个字节,
// 变量名 a 就代表了这一块内存,或者说 a 是这块内存的别名
int a = 10;
// 定义了一个引用变量 b ,它是 a 的别名,和 a 代表同一块内存空间
// 对 b 的操作 和 对 a 的操作是一样的
int& b = a;
// 改变 b 等于改变了 a
b = 20;
printf ("%d, %d\n", a, b);
// a 与 b 代表同一块内存空间
printf ("%p, %p\n", &a, &b);
return 0;
}
普通引用在声明时必须用其它的变量进行初始化
普通引用一定要初始化,相当于给a这段内存取了别名叫b
11.int a[10] = {0}; a是一个常指针,不能改变,a++是不成立的
c++中 char &a;a为常指针,占4个字节
引用只能引用一次,即int &a = b后,不能出线对a的其他赋值
12.引用的意义
#include <stdio.h>
void swap1 (int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
void swap2 (int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 10;
int b = 20;
swap2 (&a, &b);
swap1 (a, b);
printf ("%d, %d\n", a, b);
return 0;
}
1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针
2)引用相对于指针来说具有更好的可读性和实用性
13.const
const int *p; 就近原则,const离*近,所以不能改变*p,及不能改变其值
int *const p;const离p近,p不能改变
const int* const p;两者都不能变
14.不能返回局部变量的引用,与返回局部变量的地址类似,函数运行结束后,参数空间都会被释放
15.常引用:
①不能用常量初始化引用(常量不占内存)
②const int &b = 1;常引用可用常量来初始化,系统分配4个字节,存入1,常引用不能修改
③可用变量初始化常引用
16.默认参数
一旦使用了默认参数,之后的参数必须使用默认参数,否则产生歧义
占位参数,留个位置,减少改动
int add(int x, int y, int = 0, int = 0)
17.函数重载
①参数个数不同
②参数类型不同
③参数顺序不同
返回值不能构成重载,重载函数遇到默认参数可能出现歧义
18.面向对象编程:抽象 封装 继承 多态