0

我试图更好地理解 C++ 中指针和引用之间的区别。来自 Java 背景,我期待 C++ 中的引用是相似的;我期望一个指针减去指针算术。然而,我感到非常失望,有时甚至感到困惑。经过一番阅读,我认为我理解引用是没有指针运算的指针,并且永远不能设置为 NULL。为了测试我学到的东西,我决定开始编码。但是,我遇到了这个问题,我不明白为什么我的代码无法编译。

这是我正在尝试的:

  3 void test(biNode*& bn)
  4 {
  5    string& s("another test");
  6    bn = new biNode(s);
  7    printf("Just Checking: %s\n", bn->getObject().c_str());
  8 }
  9
 10 int main()
 11 {
 12    biNode* bn;
 13    test(bn);
 14    printf("Just Checking: %s\n", bn->getObject().c_str());
 15 }

这是我的“biNode”标头:

  1 #include <string>
  2 #include <iostream>
  3
  4 using namespace std;
  5
  6 class biNode
  7 {
  8    public:
  9       biNode(string& s);
 10       string& getObject();
 11    private:
 12       string& obj;
 13 };

有相应的定义:

  1 biNode::biNode(string& s) : obj(s)
  2 {}
  3 string& biNode::getObject()
  4 {
  5    return this->obj;
  6 }

尝试编译它会产生以下错误:

./test.cpp: In function `void test(biNode*&)':
./test.cpp:5: error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'const char*'

我不明白'string& s("another test");' 无效。任何人都可以解释一下吗?

提前致谢!

4

3 回答 3

2

您需要了解的另一个引用规则是临时变量(右值)只能绑定到const引用。一旦绑定,临时对象的生命周期就会延长,以匹配它所绑定的引用的生命周期。

string& s("another test");

在这里,您尝试绑定一个非引用的右值(字符串文字"another test") 。sconst

将行更改为

string const& s("another test");

它会编译。

s此外,在您的示例中,创建引用类型没有任何好处。所以你也可以把这条线改成

string s("another test");

并且代码将按预期编译和工作。

于 2012-10-19T03:17:08.323 回答
1

除了同类型的现有对象之外,您不能使用任何东西来初始化非常量引用,然后该引用将为其别名。但是您的类biNode也包含一个引用成员,因此您必须只使用一个对象初始化一个biNode实例,该对象的存在时间至少与节点实例本身一样长!

这是一个示例,演示了如何biNode以理智的方式使用它:

int main()
{
    std::string s("Hello");

    for (int i = 0; i != 10; ++i)
    {
        biNode bn(s);
        // more stuff
    }
}

您的函数的合理版本test可能如下所示:

biNode test(std::string & s)
{
    return biNode(s);
}

int main()
{
    std::string s("World");
    auto bn = test(s);
}
于 2012-10-19T03:25:06.367 回答
0

您似乎感到困惑的主要来源是参考是什么。在 C++ 中,引用是现有对象的别名。引用必须始终引用一个对象,并且它别名的对象始终相同(无法重置)。将引用绑定到对象就是为该对象创建别名。为此,您首先需要一个适当类型的对象,标准中存在一个明确的例外:您可以将const引用绑定到临时对象(即创建对象的表达式)。

于 2012-10-19T03:34:21.567 回答