【问题标题】:What are the properties of a const member function's return value, being a pointer?const 成员函数的返回值(作为指针)的属性是什么?
【发布时间】:2016-06-22 15:34:06
【问题描述】:
class B
{
    public:
        A* GetA() const { return obj; }
    private:
        A* obj;
}

... 

B b;
b.GetA()->AInterfaceMethod(params);

所以我的问题是:

  1. 如果函数不是 const 会有什么不同?
  2. 对通过 GetA() 获得的指针可以做什么有任何限制吗?是常量吗?它是否指向 const A?
  3. 什么时候有用?

我在 Unreal 教程中遇到过这个问题(A 在教程中被前向声明)。

编辑:我可能搞砸了,但调用 确实 工作。我在下面包含了实际的虚幻代码:

class ABatteryPickup : public APickup
{
    ABatteryPickup()
    {
        GetMesh()->SetSimulatePhysics(true);
    }
}

class Pickup
{
    public:
        class UStaticMeshComponent* GetMesh() const { return PickupMesh; }

    private:
        class UStaticMeshComponent* PickupMesh;
}

UStaticMeshComponent::SetSimulatePhysics() 不是const

另外,刚刚在一个新的、干净的 C++ 项目上对此进行了测试,它可以工作。

【问题讨论】:

  • const function pointers的可能重复
  • B 的构造函数将指针 Abc 绑定到一个临时对象。幸运的是 Print 没有访问任何数据成员,否则它将是无效读取。
  • @Ajay 好吧,这对我来说很有意义,但是 GetMesh()->SetSimulatePhysics(true) 在 Unreal 中是如何工作的?
  • 好吧,因为返回类型是非常量。返回的对象不是 const 对象。将其更改为const class UStaticMeshComponent* GetMesh() const
  • 嗯,我换个说法:上面GetMesh() const中的const有什么意义?

标签: c++ constants unreal-engine4


【解决方案1】:
  1. 如果函数不是 const 会有什么不同?

如果函数是非常量成员函数,则不能在 const 对象上调用它。

const B b;
b.GetA();  // Fail, can't call a non-const member function on a const object
  1. 对通过 GetA() 获得的指针可以做什么有任何限制吗?是常量吗?它是否指向 const A?

不,这里没有什么不同。返回的值不是 const 本身,也不是指向 const 的指针,它只是声明的 A*。如果对象是 const,则成员变量 obj 也将是 const,即 A* const,注意它仍然不是指向 const 的指针,即 const A*。无论如何,您都以A* 类型的值返回它,所以这里没有什么不同。

  1. 什么时候有用?

常量成员函数和非常量成员函数可以重载。您可以将它们用于不同的目的。例如

class B
{
    public:
        A* GetA() { return obj; }             // returns A*
        const A* GetA() const { return obj; } // returns const A*
    private:
        A* obj;
}

... 

B b;
b.GetA();  // get A*
const B cb;
cb.GetA(); // get const A*

【讨论】:

  • 感谢您的回复,但即使 GetA() 不是 const,b.GetA() 似乎也可以工作(我现在在 VS 2015 上对此进行了测试)。我在问题中添加了更多详细信息。
  • @sloth 如果您的意思是我对第一个问题的回答,我的意思是使b const 和GetA() 非常量。但根据你的截图,b 不是 const 而GetA() 是 const。
  • 那么如果GetA()是const,但是返回的指针和对象都不是const(也就是说调用者可以访问Print()),那么GetA() const有什么作用呢?
  • 我误解了你的第一个要点!我终于明白了。感谢那!但是我仍然对在A* GetA() const 中有const 的意义感到困惑?
  • @sloth 我尝试添加一些解释,请参阅我编辑的答案。
【解决方案2】:

如果函数不是 const 会有什么不同?

const 方法有一个契约——它不会直接或间接地改变对象B 的内部状态,例如它不会改变指针obj 指向其他地方。所以这段代码:

A* GetA() const { obj = new A; return obj; }

编译失败。

对通过 GetA() 获得的指针可以做什么有任何限制吗?是常量吗?它是否指向一个 const A?

不,A 类型的对象不相关,要使此方法返回 const A 的指针,您需要更改返回指针的类型:

const A *GetA() const { return obj; } // now you cannot change A through pointer you get, unless you const_cast it.

什么时候有用?

您可以分别控制您可以在方法内部更改的内容以及可以对对象执行的操作,以及您返回的指针。你只有选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2016-08-17
    • 2014-10-18
    相关资源
    最近更新 更多