2016-11-27 5 views
1

を作成されるオブジェクトずにクラスメソッドにアクセスすることができる機能私は最近、このコードに出くわしたC++ - それは静的である、または

#include<iostream> 
using namespace std; 
class A 
{ 
public: 
    void foo() const { cout << "A::foo() const\n"; } 
    void foo() { cout << "A::foo()\n"; } 
}; 

A bar() { return A(); } 
const A cbar() { return A(); } 
int main() 
{ 
    bar().foo(); 
    cbar().foo(); 
} 

私はhttp://en.cppreference.com/w/cpp/language/returnからreturnステートメントについては、この部分を読んで:
は、式を評価し、現在の関数を終了し、暗黙的に関数の戻り値の型に変換した後に、式の結果を呼び出し側に返します。
A()は式ですか?このコードを読む前に、私はそれが有効な構文であるとは考えていなかったでしょう。

バー()は、基本的にバーの戻り値の型は()であることを意味しますが、
は、私は2つの質問がある:
1)何()とリターン()関数バー内で行いますか()?
2)bar()はAクラスのfoo()に静的なことなくどのようにアクセスできますか? - クラスAのオブジェクトも定義していないということです。

私にいくつかのヒントを教えてください。

答えて

3

1)A()とA()は関数バー()内で何をしますか?

A bar() { return A(); }は値でオブジェクトを返します。ここではA()は返される新しいオブジェクトの構築です。

2)bar()はAクラスのfoo()を静的ではなくどのようにアクセスできますか? - 私は意味私たちも

bar()はあなたが上const関数を呼び出すことができ、一時的に作成したクラスAのオブジェクトを定義していません。

{ 
    A _tmp(bar()); 
    _tmp.foo(); 
} 

bar().foo()の間、一時的なスコープが発生します。 barの戻り値はそれを初期化し、そのインスタンスに対してメンバー関数を呼び出します。その後すぐに範囲外になります。

+0

bar()は一時的なA()オブジェクトを作成しますか?もう少し詳しいことを教えてください。 – novice

+0

@TheNoviceは、あなたがコメントしたときにそれを書いていました:) – StoryTeller

+0

ありがとう - これはたくさん説明します。 – novice

3
  1. Aはクラス名ですが、A()を呼び出すと、クラスAのコンストラクタ(a.k.a構築関数)を呼び出すことを意味します。コンストラクタが呼び出されると、そのクラスのインスタンスが1つ生成されます。この場合、カスタマイズされたコンストラクタは提供されていないため、パラメータを持たないデフォルトのコンストラクタはコンパイラによって提供されます。

return A();返されるものはA()です。はい、作成したばかりのインスタンスが返されます。

  1. キーは、「どのバーが呼び出されて実行されたのか」を知ることです。

    は私が意味する私たちも、クラスA.あなたが持っているもちろん

のためのオブジェクトを定義していません。 bar()を呼び出すと、これが正確に行われます。

+1

コンストラクタには実際に名前はありません。あなたはそれらを参照することはできません。 – StoryTeller

+0

@StoryTeller私の表現には不適切なことがあるかもしれません。今は良く見えますか? –

+0

それは良いです。しかし、私の答えは意図的に "コンストラクタを呼び出す"または "コンストラクタ関数"というフレーズを避けることに気づくでしょう。コンストラクターはC++のかなり珍しい獣です。それらを参照することはできず、コンパイラだけが「呼び出す」ことができます。だから、私は特に "オブジェクトの構築"と言っています。 – StoryTeller

関連する問題