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

学習する必要のある参照のもう1つのルールは、一時(右辺値)は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

You can't initialize a non-const reference with anything but an existing object of the same type, which the reference will then alias. But your class biNode contains a reference member, too, and so you must only initialize a biNode instance with an object that exists for as least as long as the node instance itself!

Here's an example that demonstrates how you might use the biNode in a sane way:

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

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

A sensible version of your test function might look like this:

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++ では、参照は既存のオブジェクトへのエイリアスです。参照は常にオブジェクトを参照する必要があり、エイリアスするオブジェクトは常に同じです (リセットできません)。オブジェクトへの参照をバインドすることは、そのオブジェクトへのエイリアスを作成することです。そのためには、最初に適切なタイプのオブジェクトが必要ですが、標準には明示的な例外が 1 つあります。const参照を一時オブジェクト (つまり、オブジェクトを作成する式) にバインドできます。

于 2012-10-19T03:34:21.567 に答える