我有两个类TestClass
和另类
,其中TestClass
有一个名为m_otherClass
的另类
类型的成员变量。请注意,这没有声明为const。
在下面提供的最小示例中;当m_otherClass
是指针时,那么一切都会编译并运行良好。如果我将其更改为非指针,那么我会得到编译器错误(这些更改在最小示例中被注释掉):
“对常量对象调用了非常量函数“setOtherMember”
错误:通过'const其他类'作为'this'参数丢弃限定符[-fpermissive]m_otherClass.set其他成员();
#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()
是const(然后promise不更改任何成员变量),而set的成员()
是非const和正在更改其他类
的成员变量,然后间接地也是m_otherClass
对象?
但是,当m\u otherClass是指针时,为什么这不会失败呢?当m\u OtherClass未声明为const时,为什么编译器错误会说将“const OtherClass”作为“this”参数传递失败?
在方法上设置常量时,所有数据成员都被视为常量。这就是为什么当使用OtherClass作为值时会出现错误,因为它变成了const OtherClass的值。
现在,当您使用另一类指针时,您会得到const std::unique\u ptr
一个更简单的示例来演示这种差异。
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限定成员函数不允许更改对象的成员状态。这意味着,每个不可变的成员都不能在该函数体中修改。在处理指针时,您只是说,您不会修改指针值,而不是指针本身。这是因为指针的恒定性不会在其指针上传播。
在即将到来的标准中,可以通过使用propagate_const来改变这种行为。
假设有一个结构 我得到一个指向该结构的成员的指针,比如作为某个函数的参数: 如何获取指向包含对象的指针?最重要的是:在不违反标准中的某些规则的情况下,也就是说,我想要标准定义的行为,而不是未定义或实现定义的行为。 附带说明:我知道这规避了类型安全。
指针不是存放首地址吗,怎么不一样呢
学习 C++ 的指针既简单又有趣。通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:#include <iostr
FAQs in section [33]: [33.1] “成员函数指针”类型不同于“函数指针”吗? [33.2] 如何将一个成员函数指针传递到信号处理函数,X事件回调函数,系统调用来启动一个线程/任务等? [33.3] 为什么我总是收到编译错误(类型不匹配)当我尝试用一个成员函数作为中断服务例程? when I try to use a member function as an interru
问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p
概念 在我们了解了指针的基本概念之后,接下来我们来看一下指针和C中给我们提供的关键字中的类型修饰符它们之间的关系。指针就是存储地址的一种特殊变量。那这个变量跟我们的修饰符之间还有哪些更深层次的符号限制呐?我们在实际开发过程中,经常会运用修饰符,把指针的这种限制范围更明确的告诉给用户,通过不同修饰符告诉给用户指针的具体属性。 指针变量也是一个变量,它可以改变存储的地址,指向一个地方再指向另外一个地方