Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回及;常量还是*常量?(c+;+;)_C++_Constants - Fatal编程技术网

C++ 返回及;常量还是*常量?(c+;+;)

C++ 返回及;常量还是*常量?(c+;+;),c++,constants,C++,Constants,我有自己的类“SomeObject”,有几个成员 现在,我有另一个类“WorkingClass”,它包含这个对象作为privat成员 我的问题是:我想为“SomeObject”创建一个Getter,但我不希望任何人修改它 哪种方式更好,1还是2 class WorkingClass { private: SomeObject sObj; public: //... 1) const SomeObject &const GetSomeObject() {

我有自己的类“SomeObject”,有几个成员

现在,我有另一个类“WorkingClass”,它包含这个对象作为privat成员

我的问题是:我想为“SomeObject”创建一个Getter,但我不希望任何人修改它

哪种方式更好,1还是2

class WorkingClass
{
private:
    SomeObject sObj;

public:
    //... 1)
    const SomeObject &const GetSomeObject()
    {
        return mousePosition;
    }

    //... 2)
    const SomeObject *const GetSomeObject()
    {
        return &mouseMovement;
    }
}
我知道你总是可以扔掉const,但我只是想让我的代码干净,并确保故障安全

编辑:


那么我还有一个问题。当我有一个智能指针成员,并在类中大量使用它,然后突然希望有人有权限读取一些值,但仅此而已,这是一个好的解决方案还是又是一个冗长的解决方案

class X
{
private:
    boost::shared_ptr<SomeObject> sob

public:
    const const & GetSomeObject()
    {
        return *sob.get();
    }
}
X类
{
私人:
boost::共享\u ptr sob
公众:
const&GetSomeObject()
{
return*sob.get();
}
}

返回一个“const boost::shared_ptr GetX()”怎么样?它可能不是真正必要的,但仍然不是无用的,因为在这种情况下,编译器将禁止GetX().reset(..),并且没有const boost:。。。声明将允许此无用操作。还是我错了?

&const
是错误的。引用总是恒定的。省略此处的const关键字

如果要返回一个常量非null对象,最好使用引用。如果要返回对象或空指针,请改用指针

另见

可以时使用引用,必要时使用指针

当您不需要“重置”时,引用通常优先于指针。这通常意味着引用在类的公共接口中最有用。引用通常出现在对象的外观上,指针出现在内部

上述情况的例外情况是,函数的参数或返回值需要一个“sentinel”引用—一个不引用对象的引用。这通常最好是通过返回/获取指针,并赋予空指针特殊意义(引用应始终别名对象,而不是取消引用的空指针)

两者都不好:

  • const SomeObject&const
    格式不正确。您不能限定引用。(当然,您可以限定引用类型。)

  • const SomeObject*const
    过于冗长。函数调用表达式
    o.GetSomeObject()
    是一个右值表达式,只有类类型右值可以是常量限定的。你不妨说
    const SomeObject*
    。(
    const SomeObject*const
    实际上会导致模板实例化出现问题,尽管这种问题很少见。)

至于选择通过指针还是通过引用返回,这取决于如何使用返回值。两者在不同的情况下都有意义。无论如何,您希望返回指向常量对象的引用或指针,而不是常量引用或常量指针:

const SomeObject& GetSomeObject() { ... }
const SomeObject* GetSomeObject() { ... }

通常,返回引用更可取。

因为someobject是一个相当大的类。我只是想把它传回去,让其他人可以访问一些值。按值返回对象通常是安全的,因为每个现代编译器都实现RVO和NRVO。担心这是过早的优化。:)@cppanda:如果您不需要指针,请使用引用。很少需要指针。每个引用都是常量引用。因此
constsomeobject&const
constsomeobject&
相同。在我看来,最好是通过引用的方式返回。然后我还有一个问题。当我有一个智能指针成员,并在类中大量使用它,然后突然希望有人有权限读取一些值,但仅此而已,这是一个好的解决方案还是又是一个冗长的解决方案?类X{private:boost::shared_ptr sob public:const const&GetSomeObject(){return*sob.get();}