在此功能中:
(Counter是声明函数operator ++的类)
const Counter& operator++ ();
我的功能是什么意思?我并不真正理解const关键字与指针或引用的结合!
答案 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正确性方面是可能的呢?