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

在const class函数中更改类指针的值在某些编译器中会出现错误,但在其他编译器中不会出现错误

这个问题涉及到C++编程语言中的const成员函数和指针的相关知识。

在C++中,const成员函数是指在类中声明为const的成员函数,它们承诺不会修改类的成员变量。当我们在const成员函数中尝试修改类指针的值时,编译器会发出错误提示。

这是因为const成员函数默认情况下将类对象视为常量对象,而常量对象的成员变量是不可修改的。因此,如果我们在const成员函数中尝试修改类指针的值,就违反了const成员函数的约定,编译器会报错。

然而,不同的编译器对于这种情况的处理方式可能有所不同。有些编译器可能会在编译时发出错误,而另一些编译器可能会默默地忽略这个错误,导致程序在运行时出现未定义的行为。

为了避免这个问题,我们应该遵循const成员函数的约定,不在其中修改类指针的值。如果确实需要在const成员函数中修改指针的值,可以将指针声明为mutable,这样就可以在const成员函数中修改它的值了。

总结起来,const class函数中更改类指针的值在某些编译器中会出现错误,但在其他编译器中不会出现错误。为了避免这个问题,我们应该遵循const成员函数的约定,不在其中修改类指针的值,或者将指针声明为mutable。

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

相关·内容

如何设计一个C++

其实不标const不会有任何问题,但是如果我们期望某个函数不会修改任何成员变量时,应该把该成员函数标记为const,这样可以防止自己或者其它程序员误操作,当误更改某些成员变量时,编译器会报错。...如果你期望某个成员函数内不更改成员函数,而又没有标记为const,这时自己或者其他人在此函数内改动了某些成员变量,编译器对此没有任何提示,这就有可能产生潜在bug。...函数传参无非就是传还是传引用选择问题: 参数需要在函数内修改,并在函数外使用修改后时:传引用 参数需要在函数内修改,但在函数外使用修改前时:传 参数函数不会修改,参数类型如果为基础类型...(int等):传 参数函数不会更改,参数类型如果为class类型:传const引用 声明和实现要分开写到不同文件吗?...如果非内联函数头文件定义,多个源文件都引用此头文件时编译器就会报错。至于声明写到头文件还是源文件,视情况而定,看下面这段代码,某些声明写到了头文件,又有些声明写到了源文件

1.5K20

Visual C++ 重大更改

新版本中会引起这类问题更改称为重大更改,通常,修改 C++ 语言标准、函数签名或内存对象布局时需要进行这种更改。     ...重大更改为,如果你之前使用是具有相同签名运算符 delete(以与 placement new 运算符对应),你将收到编译器错误(C2956,使用 placement new 点位置出现,因为代码该位置...更改指针类型需要对使用联合字段代码进行更改。 将代码更改更改存储联合数据,这会影响其他字段,因为联合类型字段共享相同内存。 根据大小,它还可能更改联合大小。 ...但在 Visual Studio 2015 Visual C++ 不会调用构造函数和析构函数编译器会对关于此行为更改发出警告。           ...这些无效实例化通常不会导致编译器错误,这被称为 SFINAE(替换失败不是错误)原则。 现在,如果 SFINAE 要求编译器模板专用化进行实例化,则在此过程中发生任何错误都是编译器错误

5.1K10

Visual C++ 重大更改

新版本中会引起这类问题更改称为重大更改,通常,修改 C++ 语言标准、函数签名或内存对象布局时需要进行这种更改。     ...重大更改为,如果你之前使用是具有相同签名运算符 delete(以与 placement new 运算符对应),你将收到编译器错误(C2956,使用 placement new 点位置出现,因为代码该位置...更改指针类型需要对使用联合字段代码进行更改。 将代码更改更改存储联合数据,这会影响其他字段,因为联合类型字段共享相同内存。 根据大小,它还可能更改联合大小。 ...但在 Visual Studio 2015 Visual C++ 不会调用构造函数和析构函数编译器会对关于此行为更改发出警告。           ...这些无效实例化通常不会导致编译器错误,这被称为 SFINAE(替换失败不是错误)原则。 现在,如果 SFINAE 要求编译器模板专用化进行实例化,则在此过程中发生任何错误都是编译器错误

4.6K00

学过 C++ 你,不得不知这 10 条细节!

---- 细节 02:尽可能使用 const const 一件奇妙事情是:它允许你告诉编译器其他程序员某应该保持不变。 1....data 如果关键词const出现在星号(*)左边,表示指针所指物是常量(不能改变 *p ); 如果关键词const出现在星号(*)右边,表示指针自身是常量(不能改变 p ); 如果关键词const...---- 细节 02 小结 - 请记住 将某些东西声明为 const 可帮助编译器探测出错误用法。const 可以被施加于任何作用域内对象、函数参数、函数返回类型、成员函数本体。...---- 细节 03:确定对象被使用前先被初始化 内置类型初始化 如果你这么写: int x; 某些语境下 x 保证被初始化为 0,但在其他语境却不保证。...多态性质基需声明 virtual 析构函数 如果在多态性质,没有声明一个 virtual 析构函数,那么 delete 基指针对象时候,只会调用基析构函数,而不会调用派生析构函数

68320

C++11新关键字

auto不能用来声明函数返回。但如果函数有一个尾随返回类型时,auto是可以出现函数声明返回位置。...5.constexpr 5.1简介 constexprC++11用于申明常量表达式(const expression),可作用于函数返回函数参数、数据申明以及构造函数等。...(args)<<endl; //函数参数数目 } 9.default和delete[8]^{[8]}[8] 9.1default 我们知道,C++98和C++03编译器中会隐式地产生四个函数:默认构造函数...9.2delete delete关键C++11之前是对象释放运算符,但在C++11,被赋予了新功能,主要有如下几种作用。 (1)禁止编译器生成上面六种函数默认版本。...如果断言表达式为 false ,那么编译器出现一个包含指定字符串错误,同时编译失败。如果为 true 那么没有任何影响。

3K10

C++11——引入新关键字

auto不能用来声明函数返回。但如果函数有一个尾随返回类型时,auto是可以出现函数声明返回位置。...(args)<<endl; //函数参数数目 } 8.default和delete[8]^{[8]} 8.1default 我们知道,C++98和C++03编译器中会隐式地产生四个函数:默认构造函数... C++11 ,被称为 “特殊成员函数还有两个:移动构造函数和移动赋值运算符函数。如果用户申明了上面六种函数编译器不会隐式产生。...8.2delete delete关键C++11之前是对象释放运算符,但在C++11,被赋予了新功能,主要有如下几种作用: (1)禁止编译器生成上面六种函数默认版本。...一个表达式可以被计算为 bool 或 string (字符串),如果这个表达式为 false ,那么编译器出现一个包含特定字符串错误,同时编译失败。如果为 true 那么没有任何影响。

1.4K50

CC++ const

下面将从七个方面总结const用法。 1.const位置 const位置较为灵活,一般来说,除了修饰一个成员函数外,const不会出现在一条语句最后。...后者表示指针p本身不可修改,一旦p指向某个整型变量之后就不能指向其他变量,即p是个指针常量。 (5)引用本身可以理解为指针常量,引用前使用const没有意义。...但在某些情况下,const只能放在特定位置,考查const配合二重指针例子,代码如下: int main(int argc,char* argv[]) { //const配合二重指针...(4)非只读对象(如a1)调用某个函数时,先寻找它const函数版本,如果没有找到,再调用它const函数版本。而常对象(a2),只能调用定义函数,否则出现编译错误。...3.const修饰函数参数和函数返回 定义函数时常用到const,主要用来修饰参数和返回。其目的是让编译器为程序员做变量只读性检查,以使程序更加健壮。

83410

《Effective Modren C++》 进阶学习(上)

两者未明确被指名是指针类型,使用时可能会带来类型转换等问题。而nullptr为明确指针类型。 避免重载解析歧义。传统 0 和 NULL 函数重载中会引起歧义。...使用override声明重写函数 C++中子类可以重写基函数,但两者必须完全相同,才会被编译器认定为是重写函数; 否则会被认定为子类自身函数成员,且编译器不会提醒。...a在编译时不会提示错误,b加上override后,明确声明此为重写接口,编译器查询基,编译报错无此接口。...因此,使用noexcept修饰函数时,需要仔细考虑函数实现,确保不会出现意外异常抛出。 15. 尽可能使用constexpr constexpr是用于声明常量表达式关键字。...让const成员函数线程安全 const成员函数意味着只读,因此这种函数使用时会被默认为线程安全。但在实际编码,实现const成员函数可能存在线程不安全情况。

15720

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

C++:18篇里说过const用法,这里我有必要再提升进阶下const理解。 因为你可能只知道他是怎么用,但是他为什么这样用,其他用法呢? 首先回顾下const有什么主要作用?...然而,其在编译时不能被使用,因为编译器在编译时不需要知道存储内容。自然,作为数组大小就不行了。 函数声明形参,函数被调用时会得到实参。但是如果在呢?...“=”左边,但在仍可以用一个指针来修改其。)...这要看具体情况:如果在非const成员函数,this指针只是一个类型;如果在const成员函数,this指针是一个const类型;如果在volatile成员函数,this指针就是一个volatile...A、作为非静态成员时; B、用于集合时; C、被取地址时; D、main函数体内部通过函数来获得时; E、const class或struct有用户定义构造函数、析构函数或基时;。

82720

TypeScript: 请停止使用 any

我们看到大多数用法都表明我们正在处理 TypeScript 基本类型。文档我们可能会找到: (…)来不使用 TypeScript 或第3方库编写代码。...有些参数很难正确输入,但是 any 更容易 如果我们没有正确地输入,我们将会编写错误,比我们动态语言中会编写更多错误,因为我们强制 TypeScript ,一种静态类型语言,去检查不正确类型。...但在确定特定类型之前,我们将不允许使用这些。...我已经通过必要运行时检查以防御性方式编写了代码,以确保没有错误 现在可能没有错误,但是除非你有很好测试覆盖率,否则以后来修改代码的人不会相信他们不是错误重构;就好像编译器不会帮你,因为我们说过它不会帮你...但是只有尝试其他所有方法之后才推荐使用。如果使用它,我们应该将其重新转换为可预测类型。 如果我们函数可以真正处理任何类型,那么这种情况很少见,并且是偶然(例如调试或日志记录函数)。

1.1K21

C++:10---再议拷贝构造函数

一、概念 使用一个已经存在对象,去构造(初始化)另一个对象 二、格式 参数加上const&,因为拷贝构造函数几种情况下都会被隐式地使用,因此拷贝构造函数不应该是explict const:防止函数内部修改...&:防止无限循环拷贝 名(const& 参数名) { 函数体 } 三、拷贝构造函数分类 浅拷贝:成员变量无动态内存(指针等)变量时,拷贝构造函数内对成员变量只做简单赋值,不做内存申请 深拷贝...九、绕过拷贝构造函数 拷贝初始化过程编译器可以(但不是必须)跳过拷贝/移动构造函数,直接创建对象 但是,即使编译器库绕过了拷贝/移动构造函数但在这个程序点上,拷贝/移动构造函数必须是存在且可访问...此析构函数会delete ret和hp指针成员。但这两个对象包含相同指针。此代码会导致此指针被delete两次,这显然是一一个错误(参见12.1.2 节,第411页)。...十三、浅拷贝错误演示 原因:下列代码,other->name指向一块内存,直接把other->name赋值给this->name,则两个变量都指向同一块内存,虽然不会出错,但是对不同指针操作,会改变另一个指针内容

67720

第 13 章 拷贝控制

编译器略过了拷贝构造函数 一个构造函数,成员初始化是函数体执行之前完成,且按照它们出现顺序进行初始化。...// 错误,析构函数是删除 NoDtor *p = new NoDtor(); // 正确,但是不能 delete p delete p; // 错误 某些情况下,编译器会将合成拷贝控制成员定义为删除...---- 13.2 拷贝控制和资源管理 定义拷贝操作时,可以使行为看起来像一个或者一个指针。...与拷贝操作不同,移动操作永远不会隐式地定义为删除函数。如果既没有显式地要求生成=default移动操作,又不满足编译器合成移动操作条件,编译器根本就不会合成它们。...引用限定符必须同时出现函数声明和定义

95450

【C++】和对象核心总结

C++为了更好封装,以及更好将现实生活抽象化为计算机世界,采用面向对象思想帮助程序猿能够对用户需求进行抽象思维化,不得不需要class出现。...,空指针马,那就是什么都没有,它里面是空,所以无论你是对空指针进行成员访问或是解引用,其实都会报运行错误,注意是运行错误,而不是编译错误,只有程序跑起来时,编译器才会报运行错误,语法检查上面,编译器认为你这两个行为是合理...编译阶段,语法检查不会报错 运行起来会发生错误。 五、六个默认成员函数 我们上面提到过类型占一个字节,空什么都没有吗?还是他有但是我们看不到?...所以,只要你不作,你就不用写这两个重载,编译器默认生成就够用 六、const修饰成员函数const修饰是成员函数隐含this指针所指向内容,const T* const this) 1....将const修饰“成员函数”称之为const成员函数const修饰成员函数,实际修饰该成员函数 隐含this指针,表明该成员函数不能对任何成员进行修改。

66730

第7章

所以函数可以随意使用出现其他成员而不用在乎出现先后次序。 一些函数概念上属于但是不定义,则该函数声明应与同一个头文件内。...如果一个没有声明任何构造函数时,编译器会自动生成默认构造函数。然而某些不能依赖于合成默认构造函数。 一旦定义了其他构造函数,除非自己定义一个默认函数,否则此类将没有构造函数。...class A{ int i; // 错误,默认初始化时 i是未定义 }; class B{ int i = 0; // 正确 }; 编译器不能为某些合成默认构造函数...例如,如果类包含一个其他类型成员且这个成员类型没有默认构造函数,那么编译器将无法初始化该成员。...因此,最好令构造函数初始顺序与成员函数声明顺序一致,且避免用某些成员初始化其他成员。

81540

总结c++ primernotes

unsigned 类型对象可能永远不会保存负数。有些语言中将负数赋给 unsigned 类型是非法但在 C++ 这是合法。...不幸是,含有未定义行为程序在有些环境或编译器可以正确执行,但并不能保证同一程序不同编译器甚至在当前编译器后继版本中会继续正确运行,也不能保证程序一组输入上可以正确运行且另一组输入上也能够正确运行...函数体外定义变量都初始化成 0(全局变量和static变量都会被自动初始化为0),函数体里定义内置类型变量不进行自动初始化(编译器一般会分配给它一个随机)。...引用 引用就是对象别名。实际程序,引用主要用作函数形式参数。 引用是一种复合类型(另外两种复合类型:指针和数组),通过变量名前添加“&”符号来定义。复合类型是指用其他类型定义类型。...(因为程序定义只能出现一次,如果含有定义头文件包含在多个源文件之中,就会出现重复定义) 一些 const 对象定义头文件 如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件定义

1.6K90

Effective_Cpp55个建议

不同次语言之间切换时,某些高效编程策略会改变。...特性地方加上const,比如局部变量、全局变量、函数参数、函数返回类型,成员函数本体,这样可以让编译器帮你找出程序错误。...Empty& operator=(const Empty& rhs){...} }; 6:若不想使用编译器自动生成函数,就该明确拒绝。 如果你自己写出那个函数编译器不会再自动生成了。...3.还有如果一个子类继承了你这个,那么这个子类调用拷贝函数时,就不会自动调用父你写拷贝函数了,需要你手动调用。...考虑写出一个不抛异常swap函数 1.特化std::swap是什么意思? 2.不要尝试std内加入某些对std而言全新东西。 实现 26:尽可能延后变量定义式出现时间。

52730

第 16 章 模板与泛型编程

一个模板每个实例都形成一个独立,类型 Blob与任何其他 Blob类型都没有关联,也不会对任何其他 Blob类型成员有特殊访问权限。...sa2; // 实例化会出现其他位置 // Blob及其接受 initializer_list构造函数本文件实例化 Blob a1 = {0, 1, 2, 3, 4}; Blob... a2(a1); // 拷贝构造函数本文件实例化 int i = compare(a1[0], a2[0]); // 实例化出现其他位置 // templateBuild.cc /...顶层 const,无论是形参还是实参,都会被忽略。 const转换,可以将一个非 const对象引用(或指针)传递给一个 const引用(或指针)形参。...const 某些函数需要将其一个或多个实参连同类型不变地转发给其它参数,需要保持转发实参所有性质,包括实参类型是否是 const以及实参是左还是右

1.4K20

【C++】模板进阶

模板参数分为类型模板参数和非类型模板参数,类型模板参数一般是class或typename定义出来泛型,而非类型模板参数一般是整型定义出来常量,这个常量作为模板或函数模板一个参数,模板或函数模板可将该参数当成常量来使用...,这个常量可以任意使用。...既然是针对日期指针类型出现问题,那就可以通过函数模板特化来解决,我们将Date*这样类型单独拿出来实例化出一个现成函数来,这样方式就被称作函数模板特化。 4....模板全特化就是将模板参数列表中所有的参数都确定化,显示实例化函数模板时,若显示所传参数均为double,则不会走推演实例化步骤,而是直接走实例化好,所以模板全特化实际就是参数确定之后,...使用模板显示实例化地方,只有.h文件展开,而没有.cpp文件,因为链接之前,各源文件之间是互不联系,所以即使你显示实例化了模板,但在模板真正定义地方却没有实例化,所以链接时候.cpp

92720

面向对象之this指针枚举类型

(2)this作用域是内部,当在非静态成员函数访问非静态成员时候,编译器会自动将对象本身地址作为一个隐含参数传递给函数。...会发现编译器把上述this,变为const A* const,这个大家也能想到,因为这个函数const函数,那么针对const函数,它只能访问const变量与const函数,不能修改其他变量,所以需要一个...2.枚举类型 有时我们希望某些常量只中有效。由于#define 定义宏常量是全局,不能达到目的,于是想到实用const 修饰数据成员来实现。...以下用法是错误,因为对象未被创建时,编译器不知道 SIZE 是什么。...(c++11标准前) class A { const int SIZE = 100; // 错误,企图声明初始化 const 数据成员 int array[SIZE]; // 错误

1.1K10

第 16 章 模板与泛型编程

一个模板每个实例都形成一个独立,类型 Blob与任何其他 Blob类型都没有关联,也不会对任何其他 Blob类型成员有特殊访问权限。...sa2; // 实例化会出现其他位置 // Blob及其接受 initializer_list构造函数本文件实例化 Blob a1 = {0, 1, 2, 3, 4}; Blob... a2(a1); // 拷贝构造函数本文件实例化 int i = compare(a1[0], a2[0]); // 实例化出现其他位置 // templateBuild.cc /...顶层 const,无论是形参还是实参,都会被忽略。 const转换,可以将一个非 const对象引用(或指针)传递给一个 const引用(或指针)形参。...const 某些函数需要将其一个或多个实参连同类型不变地转发给其它参数,需要保持转发实参所有性质,包括实参类型是否是 const以及实参是左还是右

1.3K60
领券