代码之家  ›  专栏  ›  技术社区  ›  user32434999

同名常量和非常量getter

c++
  •  2
  • user32434999  · 技术社区  · 6 年前

    考虑以下类别:

    class ConstTest
    {
    public:
        ConstTest() : myPrivateData(42) {}
    
        const int* getMyPrivateData() const {std::cout << "const" << std::endl; return &myPrivateData;}
        int* getMyPrivateData() {std::cout << "non-const" << std::endl; return &myPrivateData;}
    
    private:
        int myPrivateData;
    };
    

    在哪个上下文中使用getter有什么规则吗。我的印象是,只有在常量环境中,才会调用常量getter。有人能证实吗?我将非常感谢一个官方来源,因为我想依靠这个功能。

    编辑:

    我知道我可以试试。但就标准而言,我能依靠它吗?

    4 回复  |  直到 6 年前
        1
  •  3
  •   Swordfish    6 年前

    我知道我可以试试。但就标准而言,我能依靠它吗?

    over.match.funcs/4+5 :

      • 对于未使用ref限定符或使用ref限定符声明的函数,对cv X的左值引用

      • 其中X是函数所属的类,cv是成员函数声明上的cv限定。[示例:对于类X的const成员函数,假设额外参数具有对const X的类型引用。结束示例]对于转换函数,为了定义隐式对象参数的类型,该函数被视为隐式对象参数类的成员。对于由using声明引入派生类的非转换函数,为了定义隐式对象参数的类型,该函数被视为派生类的成员。对于静态成员函数,隐式对象参数被视为匹配任何对象(因为如果选择了函数,则会丢弃该对象)。[注意:没有为静态成员函数的隐式对象参数建立实际类型,也不会尝试确定该参数的转换顺序([超过。匹配。最佳]). [尾注]

    1. 在重载解析期间,隐含对象参数与其他参数无法区分。但是,隐式对象参数保留其标识,因为不能应用任何用户定义的转换来实现与它的类型匹配。

        2
  •  1
  •   HugoTeixeira    6 年前

    没错。如果你有这样的代码:

    ConstTest a;
    a.getMyPrivateData();
    
    const ConstTest b;
    b.getMyPrivateData();
    

    non-const
    const
    

    这同样适用于其他修饰符,例如 volatile . 因此您的类还可以有另一个方法来处理 不稳定的

    class ConstTest
    {
    public:
        ConstTest() : myPrivateData(42) {}
    
        const int* getMyPrivateData() const {std::cout << "const" << std::endl; return &myPrivateData;}
        int getMyPrivateData() volatile {std::cout << "volatile" << std::endl; return volatilePrivateData;}
        int* getMyPrivateData() {std::cout << "non-const" << std::endl; return &myPrivateData;}
    
    private:
        int myPrivateData;
        volatile int volatilePrivateData;
    };
    

    ConstTest a;
    a.getMyPrivateData();
    
    const ConstTest b;
    b.getMyPrivateData();
    
    volatile ConstTest c;
    c.getMyPrivateData();
    

    印刷品:

    non-const
    const
    volatile
    
        3
  •  1
  •   Caleth    6 年前

    这是一个很好的迹象 是标准图书馆用的。

    参见示例 std::vector::data

    T* data() noexcept;
    const T* data() const noexcept;
    
        4
  •  0
  •   Richard Hodges    6 年前

    #include <iostream>
    
    class ConstTest
    {
    public:
        ConstTest() : myPrivateData(42) {}
    
        const int* getMyPrivateData() const {std::cout << "const" << std::endl; return &myPrivateData;}
        int* getMyPrivateData() {std::cout << "non-const" << std::endl; return &myPrivateData;}
    
    private:
        int myPrivateData;
    };
    
    int main()
    {
        auto a = ConstTest();
        const auto b = ConstTest();
    
        a.getMyPrivateData();
        b.getMyPrivateData();
    }