const和constexpr

const和constexpr

#include <iostream>

using namespace std;
/**
const
    //限定修饰,防止在之后的代码中被修改
        1,如果由一个常量表达式赋值,在编译时执行
        2,如果不是常量表达式(无法具体确认他的值),在运行时赋值;
    //只在本文件中有效(默认状态下),如果要在其他文件使用这个常量
        1,在每个文件中都定义一次(每个文件的该常量都是单独的一个)
        2.加extern 定义:extern const int a=10; 其他文件中声明:extern const int a;(多个文件中的a都是一个内存)
constexpr
    //和const一样,但声明的同时必须给他附一个常量表达式,且只在编译的时候初始化
    //如果你认为一个变量是常量表达式(在编译的时候就能确认他的值),那就直接声明为constexpr
        而不是const(const)无法保证你在声明的的时候到底是不是确认的一个值,有可能在运行时初始化的结果和你想的不一样

常量标达式:
    const int a=20;//a 是常量表达式,20是
    const int b=a+1;//b 是,a+1是
    int c=20;//c 不是,在运行是才确定他的值,20是
    const int d=get_len();//d 不是,函数只有运行的时候才能确定他的返回值,get_len不是
                          //听说有一种constexpr函数,如果该函数是constexpr函数,get_len()是常量表达式,d也是;
    //还有一点与const不同的是,const可以修饰所有对象,而constexpr 只能修饰字面值类型(算数类型(基本的类型int,char,,,),引用,指针)
        而自定义类就不行,(包括库里定义的类)
*/
char aaa[10]="123456789";
const char *  pp=aaa;
constexpr char * ppp=aaa;
//这两个根本不一样,一个是指针指向常量
//一个是指针指自己不能被修改

/***关于constexpr实在是感觉怪怪的,一想到平时都不会怎么用到这些玩意36D的胸口就一阵绞痛。。。日后回了在更吧。。。***/
int main()
{
    const int a=10;//编译时初始化
    //a=20; //错误 const限定一次定义后不能被修改
    //const int c;//错误 必须在初始化的时候赋初值i
    int d=a;//可以给一个变量对象赋值,只是把一个数子赋给了d变量,再没有其他关系
    const int e=d;//可以把一个变量的值赋给常量,只是把一个数子赋给了d变量,再没有其他关系

    const int &ai=a;//可以将一个常量引用一个常量,引用后自然也不能修改
    //ai=2;//错误不能修改
    const int &di=d;//可以用一个常引用引用一个变量,但是不能通过该引用改变该变量的值
    //di=2;//错误 不能修改
    d=2;//当然我可以用他自己来改变,这样di自然也变了,但不是且不能通过他来改变

    const int *p1;//一个指针变量,指向一个常量
    p1=&a;
    p1=&d;//可以让常量指针,指向一个变量,但和上面的引用一样不能用这个指针修改他指向的内存的值(就不举例了)
    int *const p2=&d;//一个常量,是指针类型的 因为他是一个常量必须赋初值,这个指针就只能指向这一个固定的地方
    *p2=4;//指针指向的地址不可以被修改,但他指向的值是个变量可以修改,
    const int *const p3=&a;//一个指针是常量,指向的内容也是常量,他自己不可修改,他指向的内容也不可修改,
                             //当然他也要遵循上面的基本规则,定义的时候赋初值,
    const int *const p4=&d;//和上面一样,可以给他赋一个变量地址,但以后不能通过该指针修改变量的值。
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章