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

c++当我从常量方法内部的引用成员调用非常量方法时,为什么我没有得到编译错误

在C++中,当你从常量方法内部的引用成员调用非常量方法时,你没有得到编译错误的原因是因为引用成员本身是常量引用。常量引用是指在声明引用时使用const关键字修饰,表示引用的值不能被修改。

当你调用非常量方法时,编译器会尝试将常量引用转换为非常量引用,以便能够调用非常量方法。这是因为非常量方法可能会修改引用的值,而常量引用是不允许被修改的。

然而,如果你尝试从常量方法内部修改引用的值,编译器会报错。因为常量引用的值是不可修改的,所以你不能在常量方法内部调用非常量方法来修改引用的值。

总结起来,当你从常量方法内部的引用成员调用非常量方法时,你没有得到编译错误是因为引用成员本身是常量引用,编译器会尝试将常量引用转换为非常量引用以调用非常量方法。但是你不能在常量方法内部修改引用的值,否则会导致编译错误。

关于C++的更多信息和相关概念,你可以参考腾讯云的C++产品介绍页面:C++产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CC++常见面试知识点总结附面试真题—-20220326更新

c中const仅仅是编译层来限定,不允许对const 变量进行赋值操作,在运行期是无效,所以并非是真正常量(比如通过指针对const变量是可以修改值),但是c++中是有区别的,c++编译时会把...const常量加入符号表,以后(仍然在编译期)遇到这个变量会符号表中查找,所以在C++中是不可能修改到const变量。...由于内联是一种优化方式,在某些情况下,即使没有显示声明内联,比如定义在class内部方法编译器也可能将其作为内联函数。 7)....在C++程序中调用被C编译编译函数,为什么要加extern“C”?...&&c = var // 错误,var 为左值 int &&d = move(a) // ok, 通过move得到左值右值引用 在汇编层面右值引用事情和常引用是相同,即产生临时量来存储常量

1.4K10

CC++关键字详解-----`const`使用

=12; // 常量指针,指针本身是常量,即const指针,const数据 const int& ref = some_value; // 常量引用引用值不能被修改 其中 当为常量指针,不可以通过修改所指向变量值...const,无法使this指针中成员变量进行修改。...常量表达式和引用 const 还可以用于创建常量表达式,这些表达式在编译就可以求值,并且被视为常量。...在 C++ 中,const 引用通常用于以下情况: 避免数据修改:将参数声明为 const 引用可以确保在函数内部不会修改参数值。这样做既可以提高代码安全性,也可以避免不必要拷贝操作。...在 C++ 中,const 关键字用于声明函数参数,表示参数是只读,即函数内部不会修改该参数值。这种用法有助于提高代码可靠性和安全性。

14210

硬核 | C++ 基础大全

当我调用 release() ,当前指针会释放资源所有权,计数减一。当计数等于 0 ,资源会被释放。...C ++ 中 const类成员函数(用法和意义) 常量对象可以调用类中 const 成员函数,但不能调用 const 成员函数;(原因:对象调用成员函数,在形参列表最前面加一个形参 this,...非常量对象可以调用类中 const 成员函数,也可以调用 const 成员函数。...一个对象以值传递方式函数返回,需要执行拷贝构造函数创建一个临时对象作为返回值。 一个对象需要通过另外一个对象进行初始化。 为什么拷贝构造函数必需引用传递,不能是值传递? 为了防止递归调用。...当初始化一个引用成员变量; 初始化一个 const 成员变量; 当调用一个基类构造函数,而构造函数拥有一组参数; 当调用一个成员构造函数,而他拥有一组参数; 编译器会一一操作初始化列表,以适当顺序在构造函数之内安插初始化操作

1.2K10

初级程序员面试不靠谱指南(二)

既然是重载,那么就应该在调用中体现出来,C++中是采用如下方法调用这两个函数,对于const对象调用const函数,而对于const对象,调用普通函数,可以通过以下测试代码证明: Mobile...,可以按照这个思路编译角度理解一下为什么m1调用Set会产生错误,其产生错误原因绝对不是“逻辑上一个const值不能被修改”,编译器完全不知道什么叫做逻辑,其判断方式是在class里面根本找不到...const标示重载函数,所以其判断为错误觉得写程序要时刻铭记编译思考方式和人思考方式是不同。...还有一种方法就比较严格,你要求类内部要严格自律,不是只是让外部看起来是不能被修改,同时内部也是一丝一毫不能被修改。这两种都可以说通,但是编译器采取是哪种呢?...下一个曾经遇到问题是,为什么一般要用const修饰operator*(或者在重载操作符其余操作符定义中)?

66470

关于C++ const 全面总结

大家好,又见面了,是全栈君 C++const关键字使用方法很灵活,而使用const将大大改善程序健壮性,本人依据各方面查到资料进行总结例如以下,期望对朋友们有所帮助。...编译器能够对前者进行类型安全检查,而对后者仅仅进行字符替换,没有类型安全检查,而且在字符替换可能会产生意料不到错误 void f(const int i) { ………} //对传入參数进行类型检查...7 提高了效率 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间常量没有了存储与读内存操作,使得它效率也非常高 二、Const使用 1、定义常量...//也不能调用类中不论什么const成员函数。 } 对于const类对象/指针/引用,仅仅能调用const成员函数,因此,const修饰成员函数最重要作用就是限制对于const对象使用。...· const修饰对象,该对象不论什么const成员函数都不能被调用,由于不论什么const成员函数会有改动成员变量企图。

55530

最最最常见Java面试题总结——第二周

StringBuffer对方法加了同步锁或者对调用方法加了同步锁,所以是线程安全。StringBuilder并没有方法进行加同步锁,所以是非线程安全。...三者之间联系与区别 这几个是Java中很基本很基本东西,但是相信一定还有很多人搞不清楚!为什么呢?因为我们大多数时候在使用现成编译工具以及环境时候,并没有去考虑这些东西。...Java和C++区别 知道很多人没学过C++,但是面试官就是没事喜欢拿咱们Java和C++比呀!没办法!!!就算没学过C++,也要记下来!...语法形式上,看成员变量是属于类,而局部变量是在方法中定义变量或是方法参数;成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制修饰符及static所修饰...;但是,成员变量和局部变量都能被final所修饰; 变量在内存中存储方式来看,成员变量是对象一部分,而对象存在于堆内存,局部变量存在于栈内存 变量在内存中生存时间上看,成员变量是对象一部分,

53820

CC++ const

后者表示指针p本身值不可修改,一旦p指向某个整型变量之后就不能指向其他变量,即p是个指针常量。 (5)引用本身可以理解为指针常量,在引用前使用const没有意义。...上例中int & const r4=I;中const是多余。即没有引用常量说法,只有常引用。常引用指被引用对象是一个常量,不允许通过引用和修改被引用对象值。...(4)只读对象(如a1)调用某个函数,先寻找它const函数版本,如果没有找到,再调用const函数版本。而常对象(a2),只能调用类中定义常函数,否则出现编译错误。...(5)存在const和const版本成员函数,普通对象若想调用const函数,应该通过建立该对象引用或指向该对象常指针。...此外,还需要注意为什么使用const定义变量C++编译器并不为const变量创建存储空间,相反把这个定义保存在符号表里。那是因为编译时会进行常量折叠。

84410

Java基础知识面试题(2020最新版)

对象实例与对象引用有何不同? 变量与方法 成员变量与局部变量区别有哪些 在Java中定义一个不做事且没有参数构造方法作用 在调用子类构造方法之前会先调用父类没有参数构造方法,其目的是?...在一个静态方法调用一个静态成员为什么是非法? 什么是方法返回值?返回值作用是什么? 内部类 什么是内部类?...因此,如果父类中只定义了有参数构造方法,而在子类构造方法中又没有用super()来调用父类中特定构造方法,则编译将发生错误,因为Java程序在父类中找不到没有参数构造方法可供执行。...静态方法在访问本类成员,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制 在一个静态方法调用一个静态成员为什么是非法?...是因为生命周期不一致, 局部变量直接存储在栈中,当方法执行结束后,final局部变量就被销毁。而局部内部类对局部变量引用依然存在,如果局部内部类要调用局部变量,就会出错。

91430

Java基础知识面试题(2020最新版)

在一个静态方法调用一个静态成员为什么是非法?什么是方法返回值?返回值作用是什么?     内部类什么是内部类?...因此,如果父类中只定义了有参数构造方法,而在子类构造方法中又没有用super()来调用父类中特定构造方法,则编译将发生错误,因为Java程序在父类中找不到没有参数构造方法可供执行。...静态方法在访问本类成员,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制  在一个静态方法调用一个静态成员为什么是非法? ...是因为生命周期不一致, 局部变量直接存储在栈中,当方法执行结束后,final局部变量就被销毁。而局部内部类对局部变量引用依然存在,如果局部内部类要调用局部变量,就会出错。...理由很简单,方法得到是对象引用拷贝,对象引用及其他拷贝同时引用同一个对象。  很多程序设计语言(特别是,C++和Pascal)提供了两种参数传递方式:值调用引用调用

32810

Java基础知识面试题(2020最新版)

在一个静态方法调用一个静态成员为什么是非法?什么是方法返回值?返回值作用是什么?     内部类什么是内部类?...因此,如果父类中只定义了有参数构造方法,而在子类构造方法中又没有用super()来调用父类中特定构造方法,则编译将发生错误,因为Java程序在父类中找不到没有参数构造方法可供执行。...静态方法在访问本类成员,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制  在一个静态方法调用一个静态成员为什么是非法? ...是因为生命周期不一致, 局部变量直接存储在栈中,当方法执行结束后,final局部变量就被销毁。而局部内部类对局部变量引用依然存在,如果局部内部类要调用局部变量,就会出错。...理由很简单,方法得到是对象引用拷贝,对象引用及其他拷贝同时引用同一个对象。  很多程序设计语言(特别是,C++和Pascal)提供了两种参数传递方式:值调用引用调用

44831

【2022最新Java面试宝典】—— Java基础知识面试题(91道含答案)

静态方法和实例方法有何不同? 50. 在一个静态方法调用一个静态成员为什么是非法? 51. 什么是方法返回值?返回值作用是什么? 内部类 52. 什么是内部类? 53....因此,如果父类中只定义了有参数构造方法,而在子类构造方 法中又没有用super()来调用父类中特定构造方法,则编译将发生错误,因为Java程序在父类 中找不到没有参数构造方法可供执行。...在一个静态方法调用一个静态成员为什么是非法? 由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他静态变量,也不可以 访问静态变量成员。 51. 什么是方法返回值?...是因为生命周期不一致, 局部变量直接存储在栈中,当方法执行 结束后,final局部变量就被销毁。而局部内部类对局部变量引用依然存在,如果局部内部 类要调用局部变量,就会出错。...理由很简单,方法得到是对象引用拷贝,对象引用及其他拷贝同时引用同一个对象。 很多程序设计语言(特别是,C++和Pascal)提供了两种参数传递方式:值调用引用调用

56130

30道最常问Java基础面试题

三者之间联系与区别**这几个是Java中很基本很基本东西,但是相信一定还有很多人搞不清楚!为什么呢?因为我们大多数时候在使用现成编译工具以及环境时候,并没有去考虑这些东西。...自动装箱与拆箱****装箱**:将基本类型用它们对应引用类型包装起来;**拆箱**:将包装类型转换为基本数据类型;**14. 在一个静态方法调用一个静态成员为什么是非法?...**由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他静态变量,也不可以访问静态变量成员。**15....因此,如果父类中只定义了有参数构造方法,而在子类构造方法中又没有用super()来调用父类中特定构造方法,则编译将发生错误,因为Java程序在父类中找不到没有参数构造方法可供执行。...当创建String类型对象,虚拟机会在常量池中查找有没有已经存在值和要创建值相同对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。

27810

C++必知必会之基础知识-常用关键字(1)

是木荣。温故而知新,可以为师矣。作为一名攻城狮,扎实基本功是解决问题及完成工作中任务重要前提。没有良好基本功作为铺垫,一味追求知识宽度是毫无意义,知其然更要知其所以然。...修饰变量说明该变量不可以被改变 修饰指针分为指向常量指针和指针常量 修饰引用常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值修改 修饰成员函数说明该成员函数内不能修改成员变量 //类 class...this指针在成员函数内部自动创建,可以在成员函数中使用,用于访问当前对象成员变量和成员函数。 this指针是一个隐式参数,它并不需要显式地传递,编译器会在调用成员函数自动传递它。...x,并在方法链式调用中返回了当前对象引用。...总之,this指针在C++中是一个非常有用特性,它使得在成员函数中能够轻松访问当前对象成员,并提供了便捷方式来实现方法链式调用

17340

【笔记】《C++Primer》—— 第7章:类

这个写法一个用处在于我们无法在常量对象上调用普通成员函数,所以要用常量成员函数代替 编译编译器先编译成员声明,然后再回来编译成员函数体,因此成员函数可以无视顺序使用成员 当要返回当前对象...在构造函数和函数体间用冒号连接一段以逗号分隔调用串,调用名为函数成员,即为构造函数初始值列表,可以很方便地在函数体是空完成构造函数中对值赋值且如随后将要提到,此方法有时必不可少 ?...成员函数若以引用形式返回*this,则此时返回常量引用 尽量避免在多处使用相同代码,所以尽量把类似的功能写为函数并迭代组合使用 类可以声明而暂时不定义,此时成为前向声明,得到类是不完全类型,可以作为参数...,返回类型,指针等 注意友元函数没有传递性,即类似自己有自己友元并不代表自己友元可以得到其他友元权限 声明某个类成员函数为友元,需要指定出这个函数是属于哪个类 对于重载函数声明友元,每一种重载都要分别声明一次...(string a)当我们输入a是string类来调用Test(a),则编译器会隐式将string转为OurString再调用Test,但当我们输入a是char*“abcde”,由于编译器需要先把

59220

C++:22 再议const作用(上)

C++:18篇里说过const用法,这里有必要再提升进阶下const理解。 因为你可能只知道他是怎么用,但是他为什么这样用,其他用法呢? 首先回顾下const有什么主要作用?...编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间常量没有了存储与读内存操作,使得它效率也很高。 常量与数组组合有什么特殊吗?...然而,其值在编译不能被使用,因为编译器在编译不需要知道存储内容。自然,作为数组大小就不行了。 在函数中声明形参,在函数被调用时会得到实参值。但是如果在类中呢?......... }; 这个是错误编译通不过。那么是不是说明内部参数const不予重载呢?再看下面的例子: class A { ...... void f(int& ) {......}...A、作为静态成员; B、用于集合时; C、被取地址; D、在main函数体内部通过函数来获得值; E、const class或struct有用户定义构造函数、析构函数或基类;。

83520

const那些事

给src加上const修饰后,如果函数体内语句试图改动src内容,编译器将指出错误。这就是加了const作用之一。 (3)参数为引用,为了增加效率同时防止修改。...完全没有必要,因为内部数 据类型参数不存在构造、析构过程,而复制也非常快,“值传递”和“引用传递”效率几乎相当。...如果在编写const成员函数,不慎修改 数据成员,或者调用了其它const成员函数,编译器将指出错误,这无疑会提高程序健壮性。使用const关 字进行说明成员函数,称为常成员函数。...也就是说const对象只能访问const成员函数。 而add方法调用了const修饰take方法,证明了const对象可以访问任意成员函数,包括const成员函数。...编译时候加上-std=c++11即可! 这里提到了static,下面简单说一下: 在C++中,static静态成员变量不能在类内部初始化。

60430

嵌入式软件工程师笔试面试指南-CC++

对于内部数据对象来说,只使用malloc是无法完成动态对象要求,一般在创建对象需要调用构造函数,对象消亡,自动调用析构函数。...,当数组下标为负数编译可以通过,而且也可以得到正确结果,只是它表示意思却是当前地址向前寻址....那么当一个类试图它那继承时候,必然会由于试图调用构造函数、析构函数而导致编译错误。 可是这个类构造函数和析构函数都是私有函数了,我们怎样才能得到该类实例呢?...但当我们试图 FinalClass2 继承一个类并创建它实例,却不同通过编译。...普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译邦定函数。 2.为什么C++不支持构造函数为虚函数?

1.5K11

const 使用总结

const引用因为C++不允许引用随意改变所绑定对象,所以某种程度上来讲,引用也可以算是一种常量,那么在定义一个引用时必须绑定到一个对象上。...对象,指向对象也是const对象记忆方法右向左阅读,向右结合,const修饰离它右边最近类型,如上面的例子,const cpc结合,表示指针本身是const。...另外对于const版本引用参数,意味着在函数内部可以也可能会修改调用实参,这有时候不是你想要。...这就使得我们无法调用常量成员函数,为了解决这个问题,需要将this声明为指向常量指针,即:const A* const this;但this指针是隐式,我们无法直接声明它,解决方法就是将成员函数声明为...常量对象只能调用常量成员函数,也就是说不允许通过常量成员函数修改对象内部数据或者状态,但有可能出现这种情况,常量成员函数虽然符合要求,因此欺骗过编译器而通过编译

8010

Java面试题及答案2019版(上)

(z)也必须返回true)和一致性(当x和y引用对象信息没有被修改时,多次调用x.equals(y)应该得到同样返回值),而且对于任何null值引用x,x.equals(null)必须返回false...然而其中pop方法却存在内存泄露问题,当我们用pop方法弹出栈中对象,该对象不会被当作垃圾回收,即使使用栈程序不再引用这些对象,因为栈内部维护着对这些对象过期引用(obsolete reference...补充:在Java开发中,上下文类和工具类中通常会有大量静态成员。  28、是否可以从一个静态(static)方法内部发出对静态(non-static)方法调用? ...答:不可以,静态方法只能访问静态成员,因为静态方法调用要先创建对象,在调用静态方法可能对象并没有被初始化。  29、如何实现对象克隆? ...创建对象构造器调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化静态成员,最后调用自身构造器。

46330

c++面试选择题_C语言经典笔试题

C++多态性具体体现在运行和编译两个方面: 在程序运行时多态性通过继承和虚函数来体现; 在程序编译多态性体现在函数和运算符重载上; 虚函数:在基类中冠以关键字 virtual 成员函数。...编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到错误。...sizeof(p),p为指针得到是一个指针变量字节数,而不是p 所指内存容量。C++/C 语言没有办法知道指针所指内存容量,除非在申请内存记住它。...为什么? 答案:正确 这个 sizeof是编译时运算符,编译就确定了 ,可以看成和机器有关常量。 第25题:引用与指针有什么区别?...而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到错误(边际效应) 。 (2) 有些集成化调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。

1.1K10
领券