1.命名空间namespace1.c中的四种域函数局部域全局域命名空间域类域。前两种不仅影响编译时的查找逻辑还影响变量的生命周期后两种不影响生命周期生命全局2.当全局的a与局部的a同时存在时局部内使用局部a局部没有默认优先用全局3.a使用全局的abita使用bit的a4.namespace只能定义在全局可以嵌套定义5.在同一工程多文件定义的同名namespace认为是同一namespace6.C标准库都放在std中7.命名空间使用1*bita2*using namespace bit3*using bita2.缺省参数C语言不支持1.定义缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时如果没有指定实参 则采⽤该形参的缺省值否则使⽤指定的实参缺省参数分为全缺省和半缺省参数。有些地⽅把 缺省参数也叫默认参数2.全缺省就是全部形参给缺省值半缺省就是部分形参给缺省值。C规定半缺省参数必须从右往左依次连续缺省不能间隔跳跃给缺省值。3.带缺省参数的函数调⽤C规定必须从左到右依次给实参不能跳跃给实参。4.函数声明和定义分离时缺省参数不能在函数声明和定义中同时出现规定必须函数声明给缺省 值。3.函数重载C语言不支持1.定义C⽀持在同⼀作⽤域中出现同名函数但是要求这些同名函数的形参不同可以是参数个数不同或者类型不同。返回值不构成重载调用时无法根据参数确定调用哪个4.引用定义变量的别名类型 引⽤别名 引⽤对象;本质是传址1.引用在定义时必须初始化不能空引用2.一个变量可以有多个引用3.引用只能引用一个实体eg:int ba;int c20;bc;这里是赋值而非引用4.const引用可以引⽤⼀个const对象但是必须⽤const引⽤。const引⽤也可以引⽤普通对象因为对象的访问权限在引⽤过程中可以缩⼩但是不能放⼤。不需要注意的是类似int rb a*3;变量运算double d 12.34; int rd d;类型转换这样⼀些场景下a*3的和结果保存在⼀个临时对象中int rd d也是类似在类型转换中会产⽣临时对象存储中间值也就是时rb和rd引⽤的都是临时对象⽽C规定临时对象具有常性所以这⾥就触发了权限放⼤必须要⽤常引⽤才可以。所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象C中把这个未命名对象叫做临时对象。5.sizeof中含义不同引⽤结果为引⽤类型的⼤⼩但指针始终是地址空间所占字节个数(32位平台下占4个字节64位下是8byte)5.inline⽤inline修饰的函数叫做内联函数编译时C编译器会在调⽤的地⽅展开内联函数这样调⽤内联 函数就需要建⽴栈帧了就可以提⾼效率。•inline对于编译器⽽⾔只是⼀个建议也就是说你加了inline编译器也可以选择在调⽤的地⽅不展开不同编译器关于inline什么情况展开各不相同因为C标准没有规定这个。inline适⽤于频繁调⽤的短⼩函数对于递归函数代码相对多⼀些的函数加上inline也会被编译器忽略。•C语⾔实现宏函数也会在预处理时替换展开但是宏函数实现很复杂很容易出错的且不⽅便调试C设计了inline⽬的就是替代C的宏函数。•vs编译器 debug版本下⾯默认是不展开inline的这样⽅便调试debug版本想展开需要设置⼀下以下两个地⽅。•inline不建议声明和定义分离到两个⽂件分离会导致链接错误。因为inline被展开就没有函数地址链接时会出现报错。6.nullptr空指针以后用这个NULL实际是⼀个宏在传统的C头⽂件(stddef.h)中可以看到如下代码#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0)//在C语言中void*可以给任意其他类型指针 #endif #endifC中NULL可能被定义为字⾯常量0或者C中被定义为⽆类型指针(void*)的常量。不论采取何种定义在使⽤空值的指针时都不可避免的会遇到⼀些⿇烦本想通过f(NULL)调⽤指针版本的f(int*)函数但是由于NULL被定义成0调⽤了f(int x)因此与程序的初衷相悖。f((void*)NULL);调⽤会报错。•C11中引⼊nullptrnullptr是⼀个特殊的关键字nullptr是⼀种特殊类型的字⾯量它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题因为nullptr只能被隐式地转换为指针类型⽽不能被转换为整数类型。
C++:1.基础
1.命名空间namespace1.c中的四种域函数局部域全局域命名空间域类域。前两种不仅影响编译时的查找逻辑还影响变量的生命周期后两种不影响生命周期生命全局2.当全局的a与局部的a同时存在时局部内使用局部a局部没有默认优先用全局3.a使用全局的abita使用bit的a4.namespace只能定义在全局可以嵌套定义5.在同一工程多文件定义的同名namespace认为是同一namespace6.C标准库都放在std中7.命名空间使用1*bita2*using namespace bit3*using bita2.缺省参数C语言不支持1.定义缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时如果没有指定实参 则采⽤该形参的缺省值否则使⽤指定的实参缺省参数分为全缺省和半缺省参数。有些地⽅把 缺省参数也叫默认参数2.全缺省就是全部形参给缺省值半缺省就是部分形参给缺省值。C规定半缺省参数必须从右往左依次连续缺省不能间隔跳跃给缺省值。3.带缺省参数的函数调⽤C规定必须从左到右依次给实参不能跳跃给实参。4.函数声明和定义分离时缺省参数不能在函数声明和定义中同时出现规定必须函数声明给缺省 值。3.函数重载C语言不支持1.定义C⽀持在同⼀作⽤域中出现同名函数但是要求这些同名函数的形参不同可以是参数个数不同或者类型不同。返回值不构成重载调用时无法根据参数确定调用哪个4.引用定义变量的别名类型 引⽤别名 引⽤对象;本质是传址1.引用在定义时必须初始化不能空引用2.一个变量可以有多个引用3.引用只能引用一个实体eg:int ba;int c20;bc;这里是赋值而非引用4.const引用可以引⽤⼀个const对象但是必须⽤const引⽤。const引⽤也可以引⽤普通对象因为对象的访问权限在引⽤过程中可以缩⼩但是不能放⼤。不需要注意的是类似int rb a*3;变量运算double d 12.34; int rd d;类型转换这样⼀些场景下a*3的和结果保存在⼀个临时对象中int rd d也是类似在类型转换中会产⽣临时对象存储中间值也就是时rb和rd引⽤的都是临时对象⽽C规定临时对象具有常性所以这⾥就触发了权限放⼤必须要⽤常引⽤才可以。所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象C中把这个未命名对象叫做临时对象。5.sizeof中含义不同引⽤结果为引⽤类型的⼤⼩但指针始终是地址空间所占字节个数(32位平台下占4个字节64位下是8byte)5.inline⽤inline修饰的函数叫做内联函数编译时C编译器会在调⽤的地⽅展开内联函数这样调⽤内联 函数就需要建⽴栈帧了就可以提⾼效率。•inline对于编译器⽽⾔只是⼀个建议也就是说你加了inline编译器也可以选择在调⽤的地⽅不展开不同编译器关于inline什么情况展开各不相同因为C标准没有规定这个。inline适⽤于频繁调⽤的短⼩函数对于递归函数代码相对多⼀些的函数加上inline也会被编译器忽略。•C语⾔实现宏函数也会在预处理时替换展开但是宏函数实现很复杂很容易出错的且不⽅便调试C设计了inline⽬的就是替代C的宏函数。•vs编译器 debug版本下⾯默认是不展开inline的这样⽅便调试debug版本想展开需要设置⼀下以下两个地⽅。•inline不建议声明和定义分离到两个⽂件分离会导致链接错误。因为inline被展开就没有函数地址链接时会出现报错。6.nullptr空指针以后用这个NULL实际是⼀个宏在传统的C头⽂件(stddef.h)中可以看到如下代码#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0)//在C语言中void*可以给任意其他类型指针 #endif #endifC中NULL可能被定义为字⾯常量0或者C中被定义为⽆类型指针(void*)的常量。不论采取何种定义在使⽤空值的指针时都不可避免的会遇到⼀些⿇烦本想通过f(NULL)调⽤指针版本的f(int*)函数但是由于NULL被定义成0调⽤了f(int x)因此与程序的初衷相悖。f((void*)NULL);调⽤会报错。•C11中引⼊nullptrnullptr是⼀个特殊的关键字nullptr是⼀种特殊类型的字⾯量它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题因为nullptr只能被隐式地转换为指针类型⽽不能被转换为整数类型。