1. C++运行环境
C++程序直接在操作系统上运行,而java有JVM虚拟机。
2. 关于引用
引用本质也是传地址。
- 声明时必须初始化:即给值。
- 引用初始化后,而不能再做其它变量的别名。
- 引用不可以删除,因为引用指向的是一片已经存了值的空间,删除会使得之前的变量丢失。
? 但是指针可以删除。
2.1 关于引用和类型转换
- 临时变量具有常性。
-
不同类型变量之前做赋值,会存在隐式类型转换。会根据根据右边的变量会生成临时的常量,即:临时变量都是常量。
- 如下:过程中包含着隐式类型转换,右值变量先生成常量再给左边。
- 普通变量可以接收常量,但是引用不可以,如下两个图,所以必须给引用加const。

- 而下,不能赋值是因为中间变量是常量。

改正措施:使用const类型的常量 【当不用指针时,习惯把常量的const放在前面位置】。  但是,使用auto就不会用它的const属性,只要了类型 如下,10.11是常量,但是不会报错。
auto a = 10.11;
此外,auto转换任何类型变量过来,都不会出现const。
不同类型变量转换会产生中间值,但是相同类型变量赋值不会产生中间值。
2.2 符号"&"本身
int a = 10;
int& b = a;
const int c = 10;
const int& d = c;
-
- 如下,&做引用时,不可以把常量给int类型引用,因为权限 放大了了,本来c是常量不可以改变,但是用变量类型的d来接收c,说明d可以改变,相当于c也可以改变,所以权限自行放大必然不可以。
 但是权限缩小是可以的。用const int & m = a; a是int类型,但是起了常量类型别名,权限缩小可以。 -
- 语法层面:
指针和引用完全不同,形成的汇编中发现,指针会开空间,存储变量地址,而引用不开空间,只会对变量取别名。
3. C++部分特殊语法
+ 语法糖:
1. 【范围for】自动取数组中每个元素,取到的类型一定是数组中元素的类型,auto和arr中确定类型都可以。此外,必须是数组名,不能通过函数参数传入的数组,做范围for。
int arr[] = { 1, 2, 3, 4 ,5 };
for (auto e : arr)
cout << e << endl;
如下,范围for不可以用,参数中的数组名其实成了指针,**范围for必须通过数组名来用。**

- 语法层面:
- 空指针:C++11推荐用:nullptr。
- 空NULL也对应:0,而nullptr类型是指针,但是值仍然是0
4. 函数重载
同名同参数可以重载,但只有返回值不同不算重载。 重载必须要参数不同,或者不同类型参数顺序不同。 C语言不支持函数重载,C++才支持,因为函数命名规则机制。
5.inline内联
优点:
- C语言的宏有缺点:语法复杂、C不检查、不支持调试。
- 使用内联,指令会变少,速度快,而指令多意味着性能下降。
注意: 函数太大或有递归,内联就别用。因为inline是空间换时间。 inline关键字函数会被编译器在视为内联函数,调用处可以展开,但是太大的话,编译器有权不展开。 【补充】: auto可以自动补全类型。
6.命名空间
主要是为了解决名字冲突,当:
- 调用一些特定函数时,即使同名,但是加上命名空间调用,就可以区分不同同名的函数。
- 工程太大,模块太多,难免有同名函数。
|