代码之家  ›  专栏  ›  技术社区  ›  Yongwei Xing

常量成员函数和非常量成员函数有什么区别?

c++
  •  14
  • Yongwei Xing  · 技术社区  · 14 年前

    value_type& top() { return this.item }
    const value_type& top() const { return this.item }
    

    这两种功能有什么区别?在什么情况下使用它们?

    5 回复  |  直到 14 年前
        1
  •  17
  •   Stephen    14 年前

    简而言之,它们用于向程序中添加“const correction”。

    value_type& top() { return this.item }
    

    它用于提供对 item

    例如:

    c.top().set_property(5);  // OK - sets a property of 'item'
    cout << c.top().get_property();  // OK - gets a property of 'item'
    

    vector::operator[int index] .

    std::vector<int> v(5);
    v[0] = 1;  // Returns operator[] returns int&.
    

    const value_type& top() const { return this.item }
    

    const 访问 项目 . 它比以前的版本限制性更强—但它有一个优点—可以在const对象上调用它。

    void Foo(const Container &c) {
       c.top();  // Since 'c' is const, you cannot modify it... so the const top is called.
       c.top().set_property(5);  // compile error can't modify const 'item'.
       c.top().get_property();   // OK, const access on 'item'. 
    }
    

    要遵循向量示例:

    const std::vector<int> v(5, 2);
    v[0] = 5;  // compile error, can't mutate a const vector.
    std::cout << v[1];  // OK, const access to the vector.
    
        2
  •  6
  •   James McNellis    14 年前

    如果对const限定的对象调用成员函数,则将调用const限定的成员函数。

    例如:

    MyStack s;
    s.top(); // calls non-const member function
    
    const MyStack t;
    t.top(); // calls const member function
    

        3
  •  4
  •   Andrew Russell    14 年前

    如果你有

    class Foo
    {
        value_type& top() { return this.item }
        const value_type& top() const { return this.item }
    }
    

    如果你有

    Foo foo;
    const Foo cfoo;
    

    当您调用时返回类型 top() 具体如下:

    value_type& bar = foo.top();
    const value_type& cbar = cfoo.top();
    

    换句话说,如果你有一个类的常量实例,那么函数的const版本被选为要调用的重载。

    这样做的原因(在这个特殊的情况下)是为了您可以提供对成员的引用(比如 item 在这种情况下)从一个类的const实例,并确保它们也是const-因此不可修改,因此保留了它们来自的实例的const性。

        4
  •  0
  •   Michael Burr    14 年前

    当成员函数声明为 const 现在的情况是 this

    value_type& top();    // this function cannot be called using a `const` object
    const value_type& top() const; // this function can be called on a `const` object
    
        5
  •  0
  •   Don Larynx    9 年前

    value_type& top() { return this.item; } 确保可以修改调用对象的数据成员,也可以修改返回值。

    value_type& top() const { return this.item; } 确保不能修改调用对象的数据成员,但可以修改返回值。举个例子,如果我 value_type item_of_x = x.top(); , item_of_x x 不能。否则,会发生编译器错误(例如 this.item = someValue; 函数体内部)。

    const value_type& top() { return this.item; } 确保允许修改调用对象的数据成员,但不能修改返回值。这与上面讨论的相反:如果我执行 const value_type item_of_x = x.top(); , 不能修改,但是 可以。 value_type item_of_x=x.top(); 仍然允许修改 第\项,共\项

    const value_type& top() const { return this.item; } 确保既不能修改调用对象的数据成员,也不能修改返回值。