const成员函数返回值的哪些属性是指针?

时间:2016-06-22 15:34:07

标签: c++ const unreal-engine4

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

... 

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

所以我的问题是:

  1. 如果函数不是const,会有什么不同?
  2. 对于通过GetA()获得的指针,我可以做什么限制?是const吗?它是否指向const A?
  3. 什么时候有用?
  4. 我在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 ++项目上测试它,它的工作原理。 screenshot proof

2 个答案:

答案 0 :(得分:2)

  
      
  1. 如果函数不是const,会有什么不同?
  2.   

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

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

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

  
      
  1. 什么时候有用?
  2.   

Const成员函数和非const成员函数可能会重载。您可以将它们用于不同目的。 e.g。

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*

答案 1 :(得分:1)

  

如果函数不是常量,会有什么不同?

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

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

无法编译。

  

对于通过GetA()获得的指针,我可以做什么限制?是const吗?它是否指向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.
  

什么时候有用?

您可以单独控制可以在方法内部更改的内容以及可以使用对象返回的内容,您返回的指针。你可以选择。