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;
}