C++ 关键字

本文详细介绍了C++11中的几个关键特性,包括auto关键字的自动类型推断、union共用体的使用场景、mutable关键字允许const成员函数修改特定成员变量以及volatile关键字确保变量值的稳定访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,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 可以保证对特殊地址的稳定访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值