命名空间
- ::-作用域限定符+变量/函数:
- ::a,在全局域中寻找a变量;
- namespace一个命名空间就定义了一个新的作用域,命名空间中所有内容都局限与该命名空间中;
#include <iostream>
int a =0;
namespace my{//也在全局变量里
int a =0;
namespace you{
int b =0;
}
}
using my::a;//直接用a的话默认从my域里寻找,不再是就近原则;只展出my里的a;
using namespace my;//使用任何my里的成员都默认从my里找;直接展出整个my域
int main(){
int a = 3;
printf("hello world\n");
printf("%d",a);//就近原则拿到mian里的a;
printf("%d",::a);//拿到无归属的全局变量a;
printf("%d",my::a);//拿到my里的全局变量a;
printf("%d",my::you::b);//拿到my里的you的全局变量b;
count << a<<endl;//流入对象;
cin>>a;//控制台的东西流向a中;
}
- using namespace std;//std-C++库的命名空间;将std展开;也可以使用std::
- #include <>带.h有命名空间,不带没有;
缺省参数
- 缺省参数是声明定义函数时为函数的参数指定一个默认值。在调用函数时,如果没有制定实参则采用该默认值,否则使用实参;
int put(int a = 10,b = 20){
cout<<"a= "<<a<<endl;
cout<<"b= "<<b<<endl;//没给传参默认a= 10,b=20;
}
- 全缺省/半缺省-只能从右往左缺省,(int a,int b =10,int c= 20 );没缺省位置必须传;
- 缺省参数不能在函数声明中同时出现;声明给定义不给;
- 缺省值必须是常量或全局变量,c不支持;
内联函数
- 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈开销,内联函数提升程序的运行效率
特性
- inline是一种以空间换时间的做法,省去调用函数的额外开销(代码很长/循环/递归的函数不适合使用内联)
- inline是一个建议,如果有上述情况存在,你即使使用了inline关键字,编译器也不会采用;
- inline不建议声明和定义分离,分离会导致链接错误,因为inline被展开,就没有函数地址了,链接就无法找到;
宏的优缺点
- 优点
- 增强代码的复用性
- 提高性能
- 缺点
- 不方便调试宏(因为与编译阶段进行了替换
- 导致代码可读性差,可维护性差,容易误用)
- 没有类型安全的检查。
- C++有哪些技术替换宏?
- 常量定义,换用const
- 函数定义,换用内联函数
auto关键字
- C++11中,从一个存储类型指示符变成一个类型指示符来只是编译器,要求auto声明的变量必须由编译器在编译时期推导而得
- 注意:定义变量时必须进行初始化,在编译阶段会根据初始化表达式来推导auto的实际类型,因此auto并非是一种"类型"的声明,而是一个类型声明时的“占位符”,编译器在编译时期会将auto替换为变量的实际类型;
- 要引用时得加&
- 不能用来作为函数参数,不能直接用来声明数组;
范围for
当使用传统方法遍历一个数组,可以按照如下方式进行:
void TestFor(){
int arry[] = {1,2,3,4,5,6,7,8};
for(int i =0;i<sizeof(array)/sizeof(arr[0]);++i)
arr[i]*=2;
}
使用范围for
void TestFor(){
int array[] = {1,2,3,4,5,6,7,8};
for(auto& e:array)//解引用了
e*=2;
}
- for循环后的括号由冒号":"分为两个部分:第一部分时范围内用于迭代的变量,第二部分表示迭代范围;