一,auto
在C++11之前,可以在声明中使用关键字auto指出变量为自动变量。但是在C++11中,auto用于自动类型推断。
1,基于范围的for循环
C++11新增了一种循环,基于范围的for循环,这简化了常见的循环任务,例如:
int main() {
int nums[] = {1, 2, 3, 4, 5};
for(int x : nums){
cout<<x<<" ";
}
return 0;
}
2,应用于STL中的容器
STL通过为每个容器定义适当的迭代器,能够对内部表示完全不同的容器,编写相同的代码。使用C++11新增的自动类型推断可以进一步简化:对于vector与list,都可使用下面的代码:
int main() {
int nums[] = {1, 2, 3, 4, 5};
vector<int> vect(nums, nums + 5);
for(auto iter = vect.begin(); iter != vect.end(); iter ++){
cout<<*iter<<" ";
}
return 0;
}
二,union
共用体(union)是一种数据类型,它能够存储不同的数据类型,但只能存储其中的一种数据类型。也就是说结构体可以同时存储int、double,共用体只能存储int或double。
1,共用体每次只能存储一个值
union example{
int int_val;
double double_val;
};
int main() {
example obj;
obj.int_val = 10; //存储整数
obj.double_val = 10.5; //存储小数
return 0;
}
2,共用体的长度为其最大成员的长度
union example{
int int_val;
double double_val;
};
int main() {
cout<<sizeof(example)<<endl; //输出结果为 8
return 0;
}
3,何时使用union?
当数据项使用两种或更多的格式时,可节省空间,例如:假设管理一个小商品目录,其中一些商品的ID为整数,一些商品的ID为字符串,就可以像下面这种方式定义结构体
struct Widget{
string name;
double price;
union id{
long id_num;
char id_char[20];
} id_val;
};
三,mutable
有时我们需要让const成员函数有修改对象的某个数据成员的能力。例如一些内部的状态量,对外部用户无所谓,但是对整个对象的运行却大有用处。遇到这种问题,我们可以把一个成员数据定义为mutable(多变的),它表示这个成员变量可以被const成员函数修改却不违法,例如:
class List{
private:
mutable bool is_valid;
public:
void checkList() const{
if(is_valid){
is_valid = false;
} else {
is_valid = true;
}
}
};
四,volatile
C/C++ 中的 volatile 关键字和 const 对应,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。volatile的意思是让编译器每次使用该变量时一定要从内存中取出,而不是使用已经存在寄存器中的值。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile i, 当要求使用 volatile 声明的变量的值的时候,系统总是从它所在的内存读取它的值,即使它前面的指令刚刚从该处读取过数据,而且读取的数据立刻被保存。例如:
volatile int i = 20;
int a = i;
int b = i;
volatile 指出 i 是随时可能发生变化的,每次使用它的时候必须从 i的地址中读取,因而编译器会重新从i的地址读取它的值然后放在 b 中。而优化做法是,由于编译器发现两次从 i读数据的代码之间的代码没有对 i 进行过操作,它会自动把上次读的数据放在 b 中。因此,volatile 可以保证对特殊地址的稳定访问。