#include "stdafx.h"
#include
using namespace std;
class FooOwner;
class Foo {
FooOwner& owner;
int data;
public:
Foo(FooOwner& owner_, int data_)
: owner(owner_),
data(data_)
{
}
void SetData(int data_)
{
data = data_;
}
int Questionable() const; // defined after FooOwner
};
class FooOwner {
Foo* pFoo;
public:
FooOwner()
: pFoo(NULL)
{}
void own(Foo& foo)
{
pFoo = &foo;
}
void mutate_foo()
{
if (pFoo != NULL)
pFoo->SetData(0);
}
};
int Foo::Questionable() const
{
owner.mutate_foo(); // point of interest
return data;
}
int main()
{
FooOwner foo_owner;
Foo foo(foo_owner, 0); // foo keeps reference to foo_owner
foo_owner.own(foo); // foo_owner keeps pointer to foo
cout << foo.Questionable() << endl; // correct?
return 0;
}
这是定义的行为吗? Foo :: data应该被声明为可变吗?或者这是一个标志我做的事情是致命的错误?我正在尝试实现一种只在请求时设置的延迟初始化’数据’,并且下面的代码编译得很好而没有警告,所以我有点紧张我在UB土地.
编辑:Questionable()上的const只使直接成员为const,而不是对象指向或引用的对象.这会使代码合法吗?令我感到困惑的是,在Questionable()中,它具有类型const Foo *,并且在调用堆栈的下方,FooOwner合法地具有用于修改Foo的非const指针.这是否意味着可以修改Foo对象?
编辑2:也许是一个更简单的例子:
class X {
X* nonconst_this; // Only turns in to X* const in a const method!
int data;
public:
X()
: nonconst_this(this),
data(0)
{
}
int GetData() const
{
nonconst_this->data = 5; // legal??
return data;
}
};
本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/c-xiugai-thiserbushiyongconst_castdeconstfangfa.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:9月 27, 2019 at 12:18 上午