首页 > 编程语言 >const限定符_c++Primer

const限定符_c++Primer

时间:2022-08-23 19:46:39浏览次数:50  
标签:p2 限定符 const 常量 int constexpr Primer 指针

const对象必须初始化,因为const对象一旦创建后其值就不能改变。

默认情况下,const对象仅在文件内有效

在一个文件中定义const,在多个文件中声明并使用,解决办法:对于const变量不管是声明还是定义都添加extern关键字

把引用绑定到const对象上称为对常量的引用(reference to const),与普通引用不同的是,对常量的引用不能被用作修改他绑定的对象。

const int ci = 1024;
const int &r1 = c1;

r1 = 42;         // error
int &r2 = ci;    // error 不可以将将非常量引用指向一个常量对象

允许将const int &绑定到一个普通int对象上,即

int i = 1024;

int &r1 = i;
const int &r2 = i;

r1、r2同时绑定到普通int对象i上,可以通过i直接修改对象的值,也可以通过普通引用r1间接修改对象的值,但是不允许通过const引用r2修改i的值。

指向常量的指针也不能用于改变其所指对象的值。

const指针必须初始化,而且一旦初始化,它的值(也就是存储在指针中的那个地址)就不会改变了,也就是将一直指向此对象(即不变的是指针本身的值而不是指向的值)。

int errNumb = 0;
int *const curErr = &errNumb;

顶层const表示指针本身是一个常量,底层const表示指针所指对象是一个常量;靠右的const是顶层const,靠左的是底层const。

指针类型可以是顶层const也可以是底层const,所有引用都是底层const

int i = 0;
int *const p1 = &i;          // 不允许修改p1的值,即p1的指向,是顶层const
const int ci = 42;           // 不允许改变ci的值,是顶层const
const int *p2 = &ci;         // 允许改变p2的值,即p2的指向,不允许通过p2修改ci的值。是底层const
const int *const p3 = p2;    // 靠右的是顶层const,靠左的是底层const
const int &r = ci;           // 用于声明引用的const都是底层const

当执行对象拷贝操作时,常量是顶层const还是底层const有很大区别,顶层const没有什么影响,拷贝操作不会改变被拷贝对象的值,拷入和拷出的对象是否是常量都没有什么影响。

i = ci;
p2 = p3;

底层const在执行拷入拷出时必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换。一般来说非常量可以转换成常量,反之不可以。

int *p = p3;          // error, p3具有底层const,即p3指向的值不可以修改,而p没有
p2 = p3;              // 正确,p2和p3都是底层const
p2 = &i;              // 正确,int*可以转成const int *
int &r = ci;          // error, 普通的int &不能绑定到int常量上。
const int &r2 = i;    // 正确,const int &可以绑定到普通int上。

**int const 和 const int 的区别

int a = 20;

int * const p1 = &a;

const int *p2 = &a;

p1表示一个指向int对象a的常量指针(类型为int *),p1的值不可以改变即无法指向其他的存储空间,但是其指向的存储空间的值可以通过*p1 = newvalue \ a = newvalue改变。

p2表示一个指向const int对象a的指针,p2所指向存储空间的数值不可以通过*p2 = newvalue*改变,但是可以通过a = newvalue改变,并且p2也可以指向其他的存储空间。

常量表达式:值不会改变并且在编译过程就能得到计算结果的表达式。

C++11新标准,允许将变量声明为constexpr类型以便编译器来验证变量值是否是常量表达式。声明为constexpr的变量一定是一个常量,并且必须用常量表达式初始化。

constexpr int mf = 20;
constexpr int limit = mf + 1;
constexpr int sz = size();		// 只有当size是一个constexpr函数时才是一个正确的语句

算术类型、引用和指针都属于字面类型。自定义类、IO库、string类则不属于字面值类型,也不能被定义为constexpr。尽管指针和引用可以定义为constexpr,但是初始值却收到严格限制。一个constexpr指针的初始值必须为nullptr或0,或者是存储于某个固定位置中的对象。定义于所有函数体之外的全局对象其地址固定不变,能用来初始化constexpr指针。

在constexpr声明中若定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。

标签:p2,限定符,const,常量,int,constexpr,Primer,指针
From: https://www.cnblogs.com/happinesspills/p/16617519.html

相关文章

  • Impossible WHERE noticed after reading const tables
    一背景今天某个用户报名活动被拒绝了,然后我这边需要分析下原因,sql查询的时候给了个这个提示explainselect*fromtest_user_mobilewhereuid=1401912121  'Ex......
  • 动态尺寸模型优化实践之Shape Constraint IR Part I
    简介: 在本系列分享中我们将介绍BladeDISC在动态shape语义下做性能优化的一些实践和思考。本次分享的是我们最近开展的有关shapeconstraintIR的工作,PartI中我们将介绍......
  • 【图文解释】const的值什么时候可以修改
    当const定义的常量是基本数据类型的时候不可以被更改当const定义的常量是引用数据类型的时候,其值可以被更改。文字有点描述不清楚,或者说用什么存在内存什么的解释也有点......
  • 软约束 soft constraint
    首先使用关键字soft声明软约束。硬约束之间如果存在矛盾,那么求解器将失败,仿真也会失败。当没有同时满足所有有效硬约束和定义为软约束的解决方案时,求解器将放弃软约束并......
  • cf1003 E. Tree Constructing
    题意:构造一棵树,要求节点数为\(n\),直径为\(d\),每个点的度不超过\(k\)思路:先构造一条\(d+1\)个节点、\(d\)条边的链。然后在链上加分支。记链上节点的编号为\(1,2......
  • Implication(->) and If-Else constraint
    可以使用蕴含运算符(->)和if-else构造进一步限制随机化。它们都表示两个变量之间的条件关系。隐含运算符用于声明隐含约束的表达式。例如:constraintdataC{(data==......
  • Unique Constraint
    如果不希望组中的任何两个成员在随机化后具有相同的值,需要使用“unique”constraint。“unique”是一个关键词,使用“unique”将生成受约束的rand变量的唯一值。它不仅适......
  • @RequiredArgsConstructor用法
    在我们写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@Autowired注解,代码看起来很乱.lombok提供了一个注解:@Required......
  • Effective C++ - 条款3 - 关于const的一切
    const与*符号左侧为所指对象的语义,符号右侧为指针自身语义const与iteratorconstiterator(是T*const)!=const_iterator详细原因应参考c++编译和c++设计与演化const......
  • C++primer练习16.1-14
    练习16.1::实例化就是模板通过实际调用而确定类型及其运算,抽象到具体练习16.2template<typenameT>intcompare(constT&v1,constT&v2){if(v1<v2)return-1;......