问题是从. const
_ _test2.test()
const
test2
testing::test1
testing::test1
获取test2
作为参数const testing &test2
。所以在testing::test1
, test2const
. 然后在函数的第一行:
test2.test()
该testing::test
函数在 上调用test2
。该函数没有const
在签名结束时声明,因此它可能会修改调用它的对象(this
隐式传递给它的指针),即使它没有,编译器也会假设。通过让您在那里调用它,编译器将允许您在const
没有显式转换的情况下修改变量,这是 C++ 不应该允许的。 因此解释错误信息:
test.cpp:15: error: passing ‘const testing’ as ‘this’ argument of ‘int testing::test()’ discards qualifiers
this
引用成员函数 ( testing::test
) 操作的对象,在这种情况下它不是const
,因为testing::test
没有用 声明const
,因此在尝试使非const
指针 ( this
) 引用const
对象 ( testing
) 时检测到不匹配,忽略const
限定符。_
为了解决这个问题,决定testing::test
函数是否需要修改它被调用的对象(它现在的编写方式不需要,因为它所做的只是return 1
,但是可能会改变,所以你需要考虑它的意图功能是)。如果应该,那么显然在const
对象上调用它是不好的,尽管您可以使用const_cast
要求编译器覆盖它,但这很危险。如果不应该,则标记它const
,以便它也可以在const
对象上调用:
class testing{
int test1() const;
// ...
}
int testing::test() const {
// ...
}