をインスタンス化する際++、私は通常、この道を行くC++は新しいキーワードでポインタと参照私はクラスをインスタンス化したい場合はCで
Book bk = new Book();
彼は唯一と言ってくれました矢印の代わりにドット(例:bk.getTitle();)演算子(例bk-> getTitle();)を使用できるようにリファレンスを使用します。コードのこの部分を理解していますが、*演算子を新しいものと組み合わせて使用するとどうなりますか?完全なサンプルコードは、それが主な機能
をインスタンス化する際++、私は通常、この道を行くC++は新しいキーワードでポインタと参照私はクラスをインスタンス化したい場合はCで
Book bk = new Book();
彼は唯一と言ってくれました矢印の代わりにドット(例:bk.getTitle();)演算子(例bk-> getTitle();)を使用できるようにリファレンスを使用します。コードのこの部分を理解していますが、*演算子を新しいものと組み合わせて使用するとどうなりますか?完全なサンプルコードは、それが主な機能
でarraystackあるhere見つけることができます
事前に
おかげでこの:
Book &bk = *new Book();
たが、これにはかなり同等です:
Book *p = new Book(); // Pointer to new book
Book &bk = *p; // Reference to that book
しかし、1つの重要な違いがあります。元のコードでは、あなたはそれを完了したときに動的に割り当てられたオブジェクトdelete
に使用できるポインタを持っていないので、効果的にメモリリークを作成しました。もちろん
、あなたがこれを行うことができます:
delete &bk;
をそれがだ極めて C++非慣用的な、そして後で問題を引き起こす可能性が非常に高いです。
要約すると、このようなコードを書く理由はまったくないので、はではありません。次のいずれかが問題ありません。
Book bk;
Book bk = Book();
この構文について考えてみましょう。 Base
クラスへのスマートポインタを考えて、それは派生クラスへのポインタを保持する必要があり、構築後に派生クラスのいくつかの非仮想オブジェクトにアクセスしたいとします。この場合、このようなものは合法で、そんなに悪くないかもしれません。
Derived & d = * new Derived();
d.d_method(..whatever..);
d.d_member = ..whatever..;
...
std::unique_ptr<Base> p(&d);
は最後に、私はまだ奇妙なアンパサンドに小さな矢印好適:
Derived d = new Derived();
d->d_method(..whatever..);
d->d_member = ..whatever..;
...
std::unique_ptr<Base> p(d);
をしかし、私はこのケースだと思います味の問題です。特に、一貫した数のメソッドにアクセスする場合は特にそうです。
リークやdelete &d;
のいずれかにつながる他のものは悪い、悪い、悪いです。
あなたの教授はあなたに記憶を漏らす方法を教えてくれました。 – ildjarn
あなたの教授があなたが本当に本当にすべきではないことの例以外のものにそのコードを使用している場合は、新しい教授を見つけるべきです。 –
おそらくあなたの教授は、「const Book&bk = Book();」と言っていました。そうでない場合、私は正直なところ、あなたの教授が何を意味するのか理解していません。 – Mahesh