C ++ const函数引用

时间:2014-01-11 13:09:08

标签: c++

在此功能中:

(Counter是声明函数operator ++的类)

const Counter& operator++ ();

我的功能是什么意思?我并不真正理解const关键字与指针或引用的结合!

3 个答案:

答案 0 :(得分:1)

这是一个运算符重载,但声明语法类似于一个函数。您的声明可分为3部分:

  • 返回类型:const Counter&
  • 功能名称:operator++
  • 和参数类型:()(无参数)

因此const Counter &告诉您该函数将返回对Counter对象的常量引用。常量引用使得无法修改对象。

例如:

Counter c1;
++(++c1); // invalid

此处(++c1)会将const reference返回给Counter个对象。此引用递增,但无效,因为无法修改此引用(它是常量)。

答案 1 :(得分:0)

这意味着您不能使用此引用来更改它引用的对象。例如,如果您有两个Counter

类型的对象
Counter obj1, obj2;

然后你可能不会写

++obj1 = obj2;

因为由于限定符const,operator ++返回的引用所引用的对象是不可变的。

如果要删除运算符声明中的const限定符,则使用此语句

++obj1 = obj2;

是有效的。

实际上,声明preincrement运算符返回const引用并不是一个好主意。通常它声明没有const限定符

Counter& opperator++ ();

在这种情况下,它的行为与算术tyoes的preincrement运算符++相同。例如,此代码有效

int x = 1;

++ x = 2;

,结果是x = 2;

答案 2 :(得分:0)

在此举例说明我的评论:

class xy
{
private:
    int i; // const int i when object of xy is const
    int *ptr; // int *const ptr when object of xy is const

public:
    xy() : i(0), ptr(&i) { } // const i initialized to 0, only possible in constructor
                             // ptr pointing to i

    void set (int s) { i=s; } // changes i, not possible to define this member function
                              // as const like read()

    int read () const { return i; } // reads i

    void ptr_set (int s) const { *ptr = s; }
};

int main ()
{
    const xy obj;
    int read = obj.read(); // read() is allowed for const objects

    obj.set(10); // not allowed! you could not define set() as const (like read()):
                 // there would be a compiler error, because this member function
                 // would try to change const i

    obj.ptr_set(10); // allowed, would change i through pointer

    return 0;
}
是的,有没有人可以解释为什么像obj.ptr_set(10)这样的东西在const正确性方面是可能的呢?