【c++ 】限定符const与指针,引用,constexpr等

常量表达式

值不会改变并且在编译过程就能得到计算结果的表达式。
一个对象(表达式)是否是常量表达式由它的数据类型和初始值共同决定。

限定符const

限制变量的值不被改变

//希望变量的值不被改变
const int consta = 0;
const double constc = 0.0;
const int &referencea_to_consta = consta;

声明符constexpr

/*
常量表达式(const expression)
1.值不会改变
2.编译过程中就能得到计算结果的表达式
*/
//只要认定变量是常量表达式,就可以把它声明为constexpr类型
int globalscalar = 0;
extern const int constb = 0;
int main(int argc, char **argv){
	int scalara = 0;
	constexpr int constd = 0;
	constexpr int *constexprpointera = &globalscalar; //constexprpointera 是一个指向整数的常量指针
	//非法:constexpr int *constexprpointerb = &scalara;//编译过程中无法得到scalara的地址
	return 0;
}

const与引用(reference)

//当一个常量引用(对const的引用)绑定到另一种类型时
	const double constc = 0.0;
    const int &referenceb_to_constc = constc;//实际上,const int temp = scalarb; const int &referenceb_to_scalarb = temp;
    //非法:int &referencec_to_constc = constc;

    //常量引用仅对引用可参与的操作作出限制,而对引用的对象本身是不是常量未作出限制
    int scalara = 0;
    const int &referenced_to_scalara = scalara;
    scalara = 1;
    //非法:referenced_to_scalara = 1;

const与指针(pointer)

	const int consta = 0;
	int scalara = 0, scalarb = 0;
	extern const int constb;
 //指向常量的指针:仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其他途径改变
    const int *pointerc_to_consta = &consta;
    const int *pointerd_to_scalara = &scalara;

    //常量指针(const pointer):指针是对象,允许把指针本身定为常量
    int *const constpointera_to_scalara = &scalara;
    //不允许改变的是指针本身的值,而不是指向的那个值
    // 非法:constpointera_to_scalara = &scalarb;
    *constpointera_to_scalara = 2;
    pointerc_to_consta = &constb;//对比指向常量的指针

拷贝const

//顶层const(top-level const):任意对象本身是常量
const int consta = 0;
int *const constpointera_to_scalara = &scalara;
//底层const(low-level const):指针(引用)所指对象是常量
const int *pointerc_to_consta = &consta;

//在拷贝时,要求两者具有相同的low-level const资格
//非法: pointa = &consta;
const int *pointerc_to_constb = &consta;//合法

关于c++不允许 ‘A**’ to ‘const A**’

class A{};
void f(const A** p){}
int main(int argc, char **argv){
    int scalara = 0, *pointa = 0;
    int *pointer_to_var = &scalara;
    int ** pointer_to_pointer_to_scalar = &pointa;
    const int ** pointera_to_pointer_to_const = pointer_to_pointer_to_scalar;
    int ** pointer_to_pointer_to_var = &pointer_to_var;
    const int ** pointerb_to_pointer_to_const = pointer_to_pointer_to_var;
     
    A *a = new A();
    A ** pointer_to_pointer_to_class = &a;
    const A** pointer_to_pointer_to_constclass = pointer_to_pointer_to_class;
    f(pointer_to_pointer_to_class);
    const A *b = new A();
    f(&b);
}

得到的编译结果是
在这里插入图片描述
有点疑惑,const限制的是A,个人理解是底层const,应该是允许的,期待大佬们的解疑。

常量成员函数(const member function)

构造函数不能声明为const

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值