通常在C ++中使用const指令,特别是在Tiny XML Library中:

时间:2013-10-24 01:17:34

标签: c++ const tinyxml

我是一些经验丰富的开发人员,使用一些编译的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指令用法的一个很好的总结。

1 个答案:

答案 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>