const关键字
https://www.cnblogs.com/jiabei521/p/3335676.html
常类型是指使用类型修饰符const说明的类型,常类型变量或是对象的值是不能被更新的。
const修饰符可以把对象转变成常数对象,
意思就是说利用const进行修饰的变量的值在程序的任意位置将不能再被修改,就如同常数一样使用!
任何修改该变量的尝试都会导致编译错误
因为常量在定义之后就不能修改,所以const对象在定义时就必须初始化:
对于类中的const成员变量必须通过初始化列表进行初始化,如下所示:
class A
{
public:
A(int i);
void print();
const int &r;
private:
const int a;
static int b;
};
const int A::b=10;//类列表初始化
A::A(int i):a(i),r(a)//类列表初始化
{
}
const对象默认为文件作用域
//在全局的const变量
int const a = 10;
//仅仅在当前文件有效
// 若要在整个文件中使用当前定义的常量
// 需要在定义时加上extren关键字
extern const int BufferSize = 1024;
// 如此这个buffersize对整个程序可见
const 对象的引用
const int n = 16;
const int &nl = n;//合法
int &nll = n; //error
int f = 0;
const int &fl = f;
const int &fll = f + n;
非const引用只能绑定到与该引用相同类型的对象。 const引用则可以绑定到不同但相关的类型的对象或绑定到右值。
double a = 0.01;
const int &aa = a;
//合法 仅有整数位
int &aaa = a;
//不合法 报错
// 若不报错 在后续代码中万一修改了 aaa 对 a 的影响是未知的
const对象的动态数组
如果我们在自由存储区中创建的数组存储了内置类型的const对象,则必须为这个数组提供初始化: 因为数组元素都是const对象,无法赋值。实现这个要求的唯一方法是对数组做值初始化
const int * p = new const int[100]
// error
const int * p2 = new const int[100]()
// OK
C++允许定义类类型的const数组,但该类类型必须提供默认构造函数:
const string * pstr = new string[100];
// 这里便会调用string类的默认构造函数初始化数组元素。
指针和const的关系
int a = 1;
const int *b = &a; // 底层const
int * const c = &a; // 顶层const
int h;
b = &h;
c = &h; // error
(*c)++;
(*b)++; // error
底层const指针########不能通过指针改变指向数据的值 但可以改变指针的指向
顶层const指针########可以通过指针改变指向数据的值 但不能改变指针的指向
const int f = 1;
const int * ff = &f;
const int * const fff = &f;
int * const ffff = &f; //error
对于const对象 不能通过底层const指针指向 编译器报error
typedef 定义的指针
别名是常量
typedef char * wsad;// !! w 是一个指针常量 》> 底层const
// wsad a; // 不允许改变 a 的值(a是指针)
!!! 1 a 是一个指针常量 >> 底层const################不允许改变 a 的值(a是指针)
int main(int argc, char** argv)
{
char aa = 'a';
char r = 'r';
wsad a = &aa;
// 相当于 const (char *) a = &aa;
(*a)++;// OK
a = r;//error
}
constexpr
常量表达式:是指值不会改变的、并且在编译时期就可以计算得到结果的式子。
在C++中const可以由常量表达式进行声明 也可以用函数返回值进行声明(不确定的数)
{即const的声明不一定用常量表达式}
{即在运行时才会拿到结果}
constexpr 变量
C++ 允许将变量声明为constexpr
类型 以便由编译器来验证变量的值是否为一个常量表达式
声明为 constexpr 类型的变量必须由常量进行初始化
constexpr关键字只能用于修饰字面值类型
(such:int、char、int *,int & 都属于)
不能修饰自定义类
特别的 返回值为constexpr
关键字修饰时 函数将隐式声明为inline
类型
- constexpr 和 const 区别在于
- constexpr关键字只能用于修饰
字面值类型
- constexpr在编译时生成 使程序更快
- constexpr关键字只能用于修饰