首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

老梁聊C++,为什么不能修改set里?如果非要修改怎么办?

这里有必要说明一下,在C++当中const修饰符出现位置不同有不同含义。以指针举例,const T* p和T* const p两种完全不同指针,前者表示不能通过指针去修改指向对象内容。...如p->x = 100;这样操作都是非法。而后者表示指针只能在初始化时设置指向内容,之后不能修改指向,如p=&t;是非法。...有些同学可能会觉得疑惑,我们加上const目的不就是为了对变量做限制,从而可以在编译时候通过编译器来替我们检查一些非法操作吗?既然如此,又为什么需要去掉?...主要原因有时候我们手上变量const修饰,但是我们想要调用一个函数,而函数内部会对指针或引用指向进行修改。...原来编译器针对第一种情况做了优化,因为a初始化时给一个常量,所以当我们输出时候,编译器就直接取了3代替了它实际原本应该

96810

「我读」PL 观点 | 未定义行为有利一面

虽然编译器实现可能会针对未定义行为给出诊断信息,但保证编写代码中不引发未定义行为程序员自己责任。这种假设成立,通常可以让编译器对代码作出更多优化,同时也便于做更多编译期检查和静态程序分析。...解引用悬空指针或者未对齐指针 打破指针别名规则(引用生命周期不能长于其引用对象,可变引用不能被别名)。...使用错误 调用 ABI 执行使用当前执行线程不支持目标特性(target features)编译代码 产生无效 dyn Trait 如果元数据不是指向, Trait 与指针或引用指向实际动态...Ralf 认为, UB 编程语言设计者工具箱中一个有价值工具。因为 UB 可以看作程序员向编译器传达其自身对代码理解,以此可以帮助编译器实现更多优化。...所以,需要明白,编译器并不是真的知道这段代码是否有未定义行为,它只是在假设没有未定义行为情况下进行优化。 unreachable_unchecked 本身一种 UB 行为 ,不建议随便使用。

1.6K30
您找到你想要的搜索结果了吗?
是的
没有找到

const关键字到底该什么用

本文说明Cconst关键字,不包括C++。 基本介绍 constconstant简写,不变意思。但并不是说它修饰常量,而是说它限定一个变量为只读。...NUM再次赋值操作是非法编译器将会报错。...: 1.const 修饰 *p,指向对象只读,指针指向可变: int a = 9; int b = 10; const int *p = &a;//p一个指向int类型const,与int const...那么我们不禁要问,const到底做了什么?它修饰变量真正意义上只读吗?为什么它修饰变量仍然可以改变?...当然这一个例子并不能说明所有的问题。但是我们要知道const关键字告诉了编译器,它修饰变量不能被改变,如果代码中发现有类似改变该变量操作,那么编译器就会捕捉这个错误。

56720

volatile关键字

也可以修饰可能被未知因数更改变量 const volatile int i=0;const volatile int i=0;这是一个有趣语句:首先const修改i,其被定义为一个常量,不能更改,只能初始化...volatile也修饰了i,告诉编译器变量极有可能被未知因素更改,每次访问读都有去内存取值( “volatile”含义“请不要做没谱优化,这个可能变掉”,而并非“你可以修改这个”。)...这两个使用并不矛盾,所以这里i属性在本程序中,i应该是只读,不应该被修改,但是它也可能被外部例如中断,共享线程通过某种方式修改(如其他线程直接调用汇编去修改),所以这里也不该被编译器优化,...因此,const和volatile放在一起意义在于:(1)本程序段中不能对a作修改,任何修改都是非法,或者至少粗心,编译器应该报错,防止这种粗心;(2)另一个程序段则完全有可能修改,因此编译器最好不要做太激进优化...volatile 指针const 修饰词类似,const 有常量指针指针常量说法,volatile 也有相应概念:修饰由指针指向对象、数据 const 或 volatile const

13510

C++基础语法重点总结

const还能用来修饰局部变量,修饰常量字符串,修饰指针和修饰函数参数和返回。 说一说修饰指针情况 const修饰指针,分有常量指针指针常量。...常量指针指针指向一个常量,不可以通过指针去修改这个常量,但是指针可以改变指向指针常量说得它是一个常量,它不可以改变指向,但是可以通过指针修改指向内容。...使用场景一般在多线程共享变量上。 const和volatile结合使用,可以让该变量具有常量,且不会被编译器优化。...当其它一些线程对该变量进行修改时,可以告诉编译器,这个变量不要优化,可以去内存中读取最新。...指针被volatile修饰 告诉编译器指针指向对象可能会在不同时间被外部因素更改,并且在访问该指针时应该直接读取或写入内存,而不做任何优化

18930

C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案

delete释放其实只是释放了申请这块内存空间,但是指针并没有没撤销,指针还是指向这块地址,但是不可用(靠人品吃饭有可能可以用),是非法。...按照题意,我理解为初始化一个存放指针数组,char *array[2]={“China”,”Beijing”};其含义初始化了一个有两个指向字符型数据指针数组,这两个指针分别指向字符串”China...顺带提一句,也许你可能会问,即使不用关键字 const,也还是能很容易写出功能正确程序,那么我为什么还要如此看重关键字const?我也如下几下理由: 1)....按照题意,我理解为初始化一个存放指针数组,char *array[2]={“China”,”Beijing”};其含义初始化了一个有两个指向字符型数据指针数组,这两个指针分别指向字符串”China...2)有些编译器可以对const常量进行调试, 不能对宏调试。 19、 C++函数中值传递方式有哪几种? 正确答案: C++函数三种传递方式为:传递、指针传递和引用传递。

1.8K20

嵌入式软件开发常用关键字和运算符

1、volatile关键字 volatile一个特征修饰符,提醒编译器它后面所定义变量随时都有可能改变,因此编译后程序每次需要存储或读取这个变量时候,告诉编译器对该变量不做优化,都会直接从变量内存地址中读取数据...3、修饰指针 C语言中const修饰指针要特别注意,共有两种形式,一种用来限定指向空间不能修改;另一种限定指针不可更改。...int i = 1; int j = 2; const int *p1 = &i; int* const p2 = &j; 上面定义了两个指针p1和p2,区别是const后面指针本身还是指向内容。...在定义1中const限定*p1,即其指向空间不可改变,若改变其指向空间如*p1=10,则程序会报错;但p1可以改变,对p1重新赋值如p1=&k没有任何问题。...在定义2中const限定指针p2,若改变p2如p2=&k,程序将会报错;但*p2,即其所指向空间可以改变,如*p2=20没有问题,程序正常执行。

16610

c++基础之变量和基本类型

对于这块内容,我觉得自己知识还是有欠缺了,因此我决定近期重新翻一翻很早以前买c++ primer》 学习一下,并整理学习笔记 背景介绍 为什么会想到再次重新学习c++基础内容?...,而且后续可以随意更改指向(当然必须指向同一数据类型) 可以多个指针指向同一个对象 指针只能指向对象,指针本身也是一个对象。...类型变量 const指针 指向const 类型变量指针一个指向常量指针,它本质还是一个普通指针,只是它不允许通过指针修改变量, 这种类型指针被称之为指针常量 指向const类型变量指针与...const pci = &i; 如何区分指针常量和常量指针,一般来说关注最后两个字,它表示const修饰具体内容,常量指针最后两个指针,也就是说const修饰指针指针本身一个不能修改...const;而指针常量,最后两个常量,也就说const修饰一个常量。

1.5K30

深入解析C语言数组和指针(0)

和类型 假设我们对上面的第三个位置声明如下: float c=3.14;   我们可以看到这和c中存储并不一样,我们声明一个浮点数,二内存中显示c一个整数。...对于一个NULL指针进行解引用是非法,因为它并未指向任何东西。如果你知道指针将被初始化为什么地址,就把它初始化为该地址,否则就把它初始化为NULL。...第二种形式条件式两个指针指向同一个数组,相减结果两个指针在内存中距离。加入一个float类型数组,每个类型占4个字节。...第二行由于下标运算符优先级高于*,所以f一个数组,它元素类型指向整型指针。   第三行f一个函数,它返回一个整型数组。但是这个声明是非法,因为函数只能返回标量,不能返回数组。   ...表达式&b[0]一个指向数组第一个元素指针,也是数组名本身,所以等价于: c=b;   但是以下表达式错误: a=c; a=b;   第一行,a为指针常量,而c指针变量不能把一个变量赋值给常量

1.3K30

1.CC++区别,以及const分析(底层const顶层const)

为什么输出结果会有两个不同?...) 1)底层const(位于*左侧) 常量指针,表示指向对象是个常量,不能修改其内容,只能更改指针指向地址....(位于*右侧) 指针常量,表示不能更改指针指向地址,只能修改其内容(定义时必须被初始化) 其实很好理解,比如 int * const p, 修饰 pconst常量.而 p指向对象地址.所以表示指向对象地址个常量...//错误,不能更改指针指向地址 *p=2; //正确,修改a等于2 3.4 顶层const变量可以替代mutable变量 1) mutable介绍...,因为编译器不能将该volatile类型变量优化为一个常量 实例: volatile int x=1; const int y=x; //y个volatile型 int

82820

C语言关键字详解(四)带你全面了解 const 关键字

很不幸,正是因为这一点,很多人都认为被 const 修饰常量。这是不精确,精确说应该是只读变量,其在编译时不能被使用,因为编译器在编译时不知道其存储内容。...从上面我们可以观察到,被 const 修饰变量直接被修改时编译器会报错,但是我们仍然可以通过指针方式来间接修改变量,也就是说,const 修饰变量使变量不能被修改这一属性并不是绝对,它只是编译器层次上保证...第三个问题:既然 const不能真正意义上保证变量不被修改,那为什么还要用它?...有两个方面的原因: 1、它可以让编译器在编译代码时对于用 const 修饰变量直接进行语法检查,使我们提前发现对一些不应该被直接修改变量被直接修改而引起错误(最大作用)。...如何理解“直接”:const 修饰变量使变量不能被修改这一属性并不是绝对,它只是编译器层次上保证,我们可以仍然通过间接,比如指针方式对其进行修改。

55200

C++|智能指针模板类

两个指针将同时指向同一个string对象,这显然不能被接受,因为程序试图删除同一个对象两次,分别发生在ps和vication过期时,要解决这个问题,可以考虑下面几种方案: 定义赋值运算符,使之指向深复制...,这样两个指针指向不同对象,其中一个对象是另外一个副本。...很多STL容器中算法都支持复制和赋值操作,这些操作可以用于shared_ptr,但不能用其他两个。 如果程序不需要使用多个指向同一个对象指针,则可以使用unique_ptr。...总结一下就是: 如果程序试图将一个unique_ptr赋给另外一个时,如果源unique_ptr一个临时右编译器允许这样操作,相反,如果这个unique_ptr会存在一定时间,那么这将会被编译器禁止...; // #2 语句#1操作不被允许,而#2却屁事没有。 因为#1赋值操作将会留下一个悬挂指针unique_ptr即(pu1)。那为什么#2不会?它不也进行了赋值操作吗?

61010

c++中基本类型详细解释外加基本运算规则

引用一旦初始化后,就不可以再发生改变(不能再引用其他变量) int a=10; int c=12; //编译器自动转化为:int* const b=&b; //指针常量指针指向不可以改变,同理证明为什么引用不可以更改...int &b=a; //int &b=c;(错误写法) 引用需要一个合法内存空间 // int &ref=10; 错误写法 //更改方法 const int &ref =10; //编译器可以优化代码即等价于...: int temp=10; const int &ref =temp; //加const以后就不能更改变量值了 #引用传递 #include using namespace std...int * const p= &a; 指针常量特点: 指针指向不可以改,指针指向可以改变。...const int * p =&a; 常量指针特点: 指针指向可以修改,但是指针指向不可以改变。 #指针 指针实现了对其他对象间接访问。

16530

来看看这些嵌入式工程师常见面试题你会不会

顺带提一句,也许你可能会问,即使不用关键字 const,也还是能很容易写出功能正确程序,那么我为什么还要如此看重关键字const?...并给出三个不同例子。 一个定义为volatile变量说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量值了。...精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量,而不是使用保存在寄存器里备份。...这段代码目的用来返指针*ptr指向平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码: int square(volatile int *ptr) {...在某工程中,要求设置一绝对地址为0x67a9整型变量为0xaa66。编译器一个纯粹ANSI编译器。写代码去完成这一任务。

63520

C++_引用

x); //报错 const int &a = A(x); //不报错 }说明A返回一个具有常性 在引用时候权限不能放大,只能缩小或者不变,所以必须声明被a引用时对象是个常量才可以 为什么使用引用来接收...引用只是取别名,a就是A返回n本身 如果使用来接收,int a = A(b),将A返回拷贝赋值给a,不是同一个变量了 传引用返回 int &A (int b) { int n;...temn引用,则通过返回访问n时候就是非法访问 所以C++规定是: 离开函数作用域之后,如果返回内存还没有被释放(比如返回类型静态变量全局变量之类),则可以使用引用返回,否则必须使用传返回...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型 实体 没有NULL引用,但有NULL指针 在sizeof中含义不同:引用结果为引用类型大小...,但指针始终是地址空间所占字节个数(32位平台下占 4个字节) 引用自加即引用实体增加1,指针自加即指针向后偏移一个类型大小 有多级指针,但是没有多级引用 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

26330

C++变量存储说明符和cv-限定符

register修饰变量将创建一个寄存器变量,理念在于CPU访问寄存器中比访问普通存储在堆栈中速度要快,声明方法: register int count_fast; 需要注意编译器并不一定会满足将变量放在寄存器中要求...,假设文件1声明了一个外部变量,文件2要使用它,必须使用extern来修饰,因为不能创建两个同名外部变量,如上文所述。...为什么会发生变化?因为假设指针指向某个硬件位置,其中包含来自串行端口时间或信息,这就有可能硬件本身改变它,而不是你程序去改变它。 那为什么要告诉程序它可能变化?...因为假设编译器发现程序在几条语句中都使用了某个变量,那么为了优化,它不会让程序去查多次,而是缓存到寄存器中。...这种优化变量本身不会被程序改变前提下,但是如果硬件改变了变量值,那就不能用这种优化了。因此volatile关键字实际上也就是告诉编译器,不要对这个变量做这种优化

59110

C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

指针一个变量,存储一个地址,引用跟原来变量实质上同一个东西,变量别名 指针可以有多级,引用只有一级 指针可以为空,引用不能为NULL且在定义时必须初始化 指针在初始化后可以改变指向...如int const *p或const int *p。 指针常量一个不能给改变指向指针指针个常亮,不能中途改变指向,如int *const p。 22、a和&a有什么区别?...,这样在使用时编译器就会直接报错,产生非法内存访问。...浅拷贝: 在拥有指针成员类中,一个对象利用拷贝构造函数或者赋值函数拷贝或者赋值给另一个对象时候,直接将这个对象指针成员赋值给另一个对象指针成员,将一个指针赋值给另一个指针,就会使两个指针指向同一个空间...和重载区别在于两个函数不在同一个类中。

1.9K20

ios 笔试题3

; (3)在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其; (4)对于类成员函数,若指定其为 const 类型,则表明其一个常函数,不能修改类成员变量...并给出三个不同例子。 一个定义为 volatile变量说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量值了。...精确地说就是,优化器在用到这个变量时必须 每次都小心地重新读取这个变量,而不是使用保存在寄存器里备份。下面volatile变量几个例子:   ?...; 一个参数既可以是const还可以是volatile吗?解释为什么。  ?; 一个指针可以是volatile 吗?解释为什么。  下 面答案:  ?; 是的。一个例子只读状态寄存器。...用变量a给出下面的定义 a) 一个整型数(An integer) b)一 个指向整型数指针( A pointer to an integer) c)一个指向指针指针,它指向指针指向一个整型数

69910

C++从入门到精通——引用(&)

C++引用 前言 C++引用是别名,它为已存在对象提供了另一个名称。一旦引用被初始化指向一个对象,它就不能指向其他对象。引用必须在声明时初始化,并且必须初始化为有效对象或字面量。...一个变量可以有多个引用 引用与指针不同,指针一个对象,可以指向任何其他对象,而引用始终指向同一个对象。另外,引用在使用时不需要解引用操作符(*),因为它本身就是对象别名。...C++中常引用是指使用const关键字修饰引用,即被引用对象不能被修改。...,类型不同 const int& rd = d; 如上为什么int& rd = d;不行,而 const int& rd = d;确可以,是因为类型转换会生成临时变量,类型转换将一个数据类型转换为另一个数据类型...运算符重载:当重载一个运算符时,可能会生成临时变量来进行操作。 需要注意编译器为了优化性能可能会对临时变量进行优化,比如使用编译器自动生成构造函数、析构函数等。

8310

令人疑惑引用和指针

前言 在C++ 11中,新增了一种引用(本文都指左引用)。从作用上来讲,它和指针类似,都可以用来间接引用对象,他们之间到底有什么异同? 引用 在分析之前我们先介绍一下引用。...b; //非法,b在此之前已经引用,不能定义引用引用 int &d = 1024; //非法,引用类型初始必须对象,而不能字面值 const int &e = 1024 //合法...引用和指针比较 引用不可为空,而指针可以 例如: int &a; //非法,必须被初始化 int *p;//合法,但如果是非静态指针变量,将拥有一个不确定 声明一个指针变量而不初始化合法,但是不建议这么做...引用不是对象,而指针本身对象 引用不是对象,它不能被再次赋值,而指针可以。...int a = 1024; int &b = a; int &&c = b;//非法 int *d = &a; int **e = &d;//合法 引用指向对象本身,而指针指向对象地址 定义一个指针时候

58220
领券