0

我是一些编译 OOP 语言的经验丰富的开发人员,尤其是 Object Pascal 和 C#。多年来一直“搞砸” C++,但最近开始更加认真地对待 C++ 开发。

根据我使用其他语言的经验,我很容易掌握 C++ 中的大多数概念。但是我发现相当困难的一件事是该const指令的使用方式以及它在 C++ 中的行为方式。

特别是,目前我遇到了这个问题,在 Ubuntu 12.04 机器和默认的 mingW/G++ 工具链上使用 Netbeans C++ IDE 中的TinyXML 库:

我正在调用这个函数:

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 的函数版本?我在这里想念什么?

更多 - 我在哪里可以找到constC++ 11 中指令用法的一个很好的总结。

4

1 回答 1

1

在这里,选择的重载取决于 的类型node,而不是 的类型aNode

const在成员函数声明的末尾表示该函数可以在对象的 const 实例上调用;缺少的成员函数const是不可能的。当同时存在const和非const重载时,重载决议const在适用时更喜欢版本。

显然,node是 type const TiXmlNode*,所以FirstChild() const选择了重载,返回值是 type 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不能修改,而非常量可以。

于 2013-10-24T01:43:00.700 回答