当成员值从指针更改为非指针时,C++常量问题
C++ const problems when member value is changed from pointer to non-pointer
我有两个类TestClass
和OtherClass
,其中TestClass
有一个名为m_otherClass
的OtherClass
类型的成员变量。请注意,这未声明为常量。
在下面提供的最小示例中;当m_otherClass
是一个指针时,则一切编译并运行良好。如果我将其更改为非指针,则会出现编译器错误(更改在最小示例中被注释掉(:
"在常量对象上调用非常量函数'setOtherMember' ">
错误:将"const OtherClass"作为"this"参数传递会丢弃限定符[-fpermissive] m_otherClass.setOtherMember((;
#include <iostream>
#include <memory>
class OtherClass {
public:
void setOtherMember() {
m_otherMember = 2;
std::cout << "Other member is now 2" << std::endl;
}
private:
int m_otherMember = 0;
};
class TestClass {
public:
TestClass(): m_otherClass(std::make_unique<OtherClass>())
// TestClass()
{}
void myMethod() const {
m_otherClass->setOtherMember();
// m_otherClass.setOtherMember();
}
private:
std::unique_ptr<OtherClass> m_otherClass;
// OtherClass m_otherClass; // If changing to this I get the error!!
};
int main() {
TestClass testClass;
testClass.myMethod();
return 0;
}
这是因为myMethod()
是常量(然后承诺不更改任何成员变量(,而setOtherMember()
是非常量并且正在更改OtherClass
的成员变量,然后间接更改m_otherClass
对象?
但是,当m_otherClass
是一个指针时,为什么这不会失败呢? 为什么编译器错误说将"const OtherClass"作为"this"参数传递失败,而m_otherClass
尚未声明为const?
在大多数情况下,不允许 Const 限定的成员函数更改对象的成员状态。这意味着,每个不可变的成员都不能在此函数体中修改。在处理指针时,你只是说,你不会修改指针值,而不是点对本身。这是因为指针的恒定性不会在其点上传播。
在即将出台的标准中,可以使用propagate_const来改变这种行为。
一个更简单的例子来演示差异。
struct Foo { int m; };
const Foo f = {10};
f.m = 20; // Not allowed since modifying f.m modifies f.
struct Bar { int* p; };
int i = 10;
int j = 20;
const Bar b = {&i};
b.p = &j; // Not allowed since modifying b.p modifies b.
*(b.p) = j; // Allowed since it does not change b or b.p. It changes the value
// of what b.p points to.
当你把 const 放在一个方法上时,你的所有数据成员都被视为 const。这就是为什么当您将 OtherClass 作为值时会出现错误,因为它变成了const OtherClass
.
现在,当您使用OtherClass
指针时,您会得到const std::unique_ptr<OtherClass>
并且 const 仅适用于指针,而不适用于它指向的值。
为什么当
m_otherClass
是一个指针时,这不会失败呢?
因为修改由常量指针指向的对象是常量正确的,只要它是指向非常量(如您的情况(的指针。
为什么编译器错误说将"const OtherClass"作为"this"参数传递失败,而m_otherClass尚未声明为const?
myMethod
被宣布为常量。因此,this
是指向 const 的指针。因此,无论由左值命名的对象是否为常量,左值this->m_otherClass
也是常量。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错