一、const
1. const int fun();
函数返回值为 const
2. int fun(const int arg);
参数arg在函数内不可修改
3. int fun() const;
函数为只读函数,这个函数不能访问所有this所能调用的内存,不能对类对象的数据成员(准确说是非静态数据成员)做任何改变
4. 常量(即const)对象
可以调用const成员函数,不能调用非const修饰的函数,非const对象既可以调用const成员函数,也可以调用非const成员函数
5. const用于重载
#include <iostream>
int f1(char* x)
{
return 1;
}
int f1(const char* x)
{
return 2;
}
int main()
{
char s1[] = "aaa";
const char s2[] = "bbb";
std::cout << f1(s2) << std::endl;
return 0;
}
二、volatile
转载自:详解C/C++中volatile关键字
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
为了安全起见,只要是等待别的程序修改某个变量的话,就加上volatile关键字。
一般说来,volatile用在如下的几个地方:
-
中断服务程序中修改的供其它程序检测的变量需要加volatile;
-
多任务环境下各任务间共享的标志应该加volatile;
-
存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
三、检查类型是否为const或volatile限定,添加、移除const或volatile限定
const int ic = 0;
volatile int iv = 0;
std::cout << std::is_const< decltype(ic)>::value;//1
std::cout << std::is_const<int>::value;//0
std::cout << std::is_const<const int*>::value;//0
std::cout << std::is_const<int* const>::value;//1
std::cout << std::is_volatile<decltype(iv)>::value;//1
std::cout << std::is_volatile<int>::value;// 0
std::is_const<const int>::value_type Bool;//Bool是一个没有初始化的bool型变量
std::is_const<const int>::type;
std::remove_const<const int>::type Int;//Int是一个没有初始化的int型变量
std::remove_cv<const volatile int>::type CV;//CV是一个没有初始化的int型变量
int i = 0;
auto&& ret1 = std::as_const<int>(i);//类型为const int&
auto&& ret2 = std::as_const(i);//类型为const int&
auto ret3 = std::as_const(i); //类型为int
std::add_const<int>::type CI = 0; //CI是一个const int型且初始值为0的常量(const必须初始化)