我是一些经验丰富的开发人员,使用一些编译的OOP语言,特别是Object Pascal和C#。多年来一直在使用C ++“乱搞”,但最近开始对C ++开发越来越认真。
根据我对其他语言的经验,我很容易掌握C ++中的大多数概念。但是我发现一件很困难的事情是使用const
指令的方式以及它在C ++中的行为方式。
特别是,目前我遇到了这个问题,使用Netbeans C ++ IDE中的TinyXML Library,在Ubuntu 12.04机器和默认的mingW / G ++工具链上:
我正在调用此函数:
TiXmlNode::TiXmlNode* FirstChild()
在TinyXML源代码中,类TiXmlNode
中有两个重载的此函数的公共版本:
const TiXmlNode* FirstChild() const { return firstChild; }
TiXmlNode* FirstChild() { return firstChild; }
除const指令外,它们是相同的。我假设调用的版本将取决于我如何声明我从函数加载的变量,例如:
const TiXmlNode* aNode = node->FirstChild();
将调用函数的const版本
TiXmlNode* aNode = node->FirstChild();
将调用第二个版本,不带const。
但是当我尝试在代码中使用第二种形式时,我收到编译错误:
错误:从'const TiXmlNode *'无效转换为'TiXmlNode *' [-fpermissive]
为什么会这样?如何在没有const的情况下使用该函数的版本?我在这里错过了什么?
更多 - 我在哪里可以找到C ++ 11中const
指令用法的一个很好的总结。
答案 0 :(得分:1)
此处,所选择的重载取决于node
的类型,而不是aNode
的类型。
const
表示可以在对象的const实例上调用该函数;缺少const
的成员函数不可能。如果同时存在const
和非const
重载,则重载解析会在适用时优先使用const
版本。
显然,node
的类型为const TiXmlNode*
,因此选择了FirstChild() const
重载,返回值的类型为const TiXmlNode*
。这不能转换为TiXmlNode*
。
这是一本教科书示例。 std::vector<T>
提供了operator[]
的两个重载,看起来像这样(大大简化了):
template <typename T>
class vector {
T* storage_;
public:
T& operator[](size_t index) { return storage_[index]; }
const T& operator[](size_t index) const { return storage_[index]; }
};
有了这个,你可以写:
vector<int> v;
v[0] = 42; // OK: calls int& operator[](size_t)
const vector<int> cv;
cv[0] = 42; // Error: calls const int& operator[](size_t) const
正如预期的那样,const vector
不能修改,而非常数修改可以。{/ p>