2015-12-31 16 views
8

私は学校のプロジェクトのために書いたコードを閲覧していました。オブジェクトのベクトルに文字列を戻す

class Foo { 
public: 
    Foo(std::string s) : _s(s) {} 
private: 
    std::string _s; 
}; 

int main() { 
    std::string str = "Hiyo"; 

    std::vector<Foo> f; 
    f.push_back(str); // Compiles. Weird to me though. 
    f.push_back(Foo(str)); // Predictably, this compiles as well. 

    return 0; 
} 

なぜpush_backへの最初の呼び出しがstrFooでなくても、有効な文です:私は、次のようなクラスを持っていましたか?

答えて

16

クラスFooは、それが暗黙std::stringから鋳造することができた意味タイプstd::string(すなわちConverting constructor)、のいずれかの引数を取る非明示CTORを有しています。

f.push_back(str);  // implicit casting from std::string to Foo 
f.push_back(Foo(str)); // explicit casting from std::string to Foo 

(注)CTORのexplicitを作る場合は、暗黙的キャストが禁止されます。

class Foo { 
public: 
    explicit Foo(std::string s) : _s(s) {} 
// ~~~~~~~~ 
private: 
    std::string _s; 
}; 

、その後

f.push_back(str);  // invalid now 
f.push_back(Foo(str)); // still valid 
+1

これは '明示的な' – CinCout

7

オブジェクトの最初のプッシュバックは、Fooオブジェクトを自動的に初期化します。あなたのイニシャライザーリストを介して。

は、(文字列を取得し、Fooオブジェクトを想定しています?Fooオブジェクトは、単一の文字列で初期化することができますはい、その初期化子リストは、単一の要素を持っており、オブジェクトがその要素から初期化されます)。

詳細について

、例えば参照:

+2

初期化子リストは重要ではありません。まだそれなしでコンパイルされます。 – ChrisD

+1

'Foo(std :: string s)'が 'explicit'の場合はどうなりますか? – CinCout

2

私が最初にプッシュバックでそれがautomaticalyだから、そのbasicaly股関節同じFoo(str) を初期化していると思います!

関連する問題