• const volatile


    一、const

    指针常量与常量指针

    去掉const限定(类型退化)

    const_cast

    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用在如下的几个地方:

    1. 中断服务程序中修改的供其它程序检测的变量需要加volatile;

    2. 多任务环境下各任务间共享的标志应该加volatile;

    3. 存储器映射的硬件寄存器通常也要加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必须初始化)
    
  • 相关阅读:
    魔术方法___toString()
    魔术方法__set()
    魔术方法__get()
    php面向对象之final关键字用法及实例
    php面向对象之什么是抽象类?及抽象类的作用
    php面向对象之对象克隆方法
    php面向对象之对象比较用法详解
    php面向对象之instanceof关键字的用法
    php表单怎么提交到数据库?
    php表单的验证详解
  • 原文地址:https://www.cnblogs.com/mmmmmmmmm/p/14088182.html
Copyright © 2020-2023  润新知