2016-07-04 6 views
3

私は答えをたくさん探してきましたが、それは見つけることができませんでした。私が持っていると言う:Constメソッド - 実装を繰り返しますか?

class foobar{ 
    public: 
    char foo() const; 
}; 

、私foobar.hに

私はfoobar.cppで、このクラスを実装するとき、私はconstを繰り返す必要があります?

char foobar::foo() const{ 
//...my code 
} 

または私は(行うことができますconst

char foobar::foo() { 
//...my code 
} 

whitout

これは重複している場合は申し訳ありませんが、他の質問は本当にこれに答えていません。

答えて

3

はい、あなたは定義でconst修飾子を含める必要があります。 あなたが書く場合:

class Foo 
{ 
public: 
    int f() const; 
}; 

と実装ファイル内にあなたが書いた場合:

int Foo::f() { /*...*/ } 

コンパイラは、クラス内の署名int f()とそこに機能していないというエラーが出力されます。 constキーワードをインプリメンテーションファイルに入れても機能します。

オブジェクトに応じて機能をオーバーロードすることができます。const 例:

class Foo 
{ 
public: 
    int foo()  { std::cout << "non-const foo!" << std::endl; } 
    int foo() const { std::cout << "const foo!" << std::endl; } 
}; 

int main() 
{ 
    Foo f; 
    const Foo cf; 
    f.foo(); 
    cf.foo(); 
} 

出力は(予想通り)になります。

non-const foo!

const foo!

我々はconstで行ったように、あなたがオブジェクトvolatileネスに基づく関数をオーバーロードすることができますあまりにも。

+0

同じ操作で出力が異なるのはなぜですか? –

+0

申し訳ありませんが、コード内に 'const Foo cf'の代わりに 'Foo cf'を書いています。したがって、constオブジェクトでは、const関数が呼び出され、非constオブジェクトでは、非const関数が呼び出されます。 –

+0

ああ、ありがとう! –

2

変数がchar foo() const;の場合、実装する場合は、宣言した変数と同じ名前を付ける必要があります。

char foobar::foo() const{ 
//...my code 
} 

char foobar::foo();char foobar::foo() const;に異なっています。

class foobar{ 
    public: 
    char foo() const; 
    char foo(); 
}; 
5

あなたは絶対にが実装でconst修飾子を含める必要があります。それはあなたのようなあなたのクラス宣言でそれらの両方を持っていることを意味します。

関数のオーバーロードは、constのように可能です。実際、これは言語の非常に重要な部分です。

+0

私に参考リンクを教えてもらえますか? –

+0

それは確定していませんが、http://www.cs.unm.edu/~storm/C++/ProgrammingTerms/FunctionSignatures.htmlが役立つかもしれません。またはGoogleの「機能署名」。 – Bathsheba

2

はい、繰り返す必要があります。const、それは機能署名の一部です。 const修飾子なしで別の宣言と実装を行うことも可能です。

+0

私に参考リンクを教えてもらえますか? –

2

はい、const修飾子が​​ファイルに必要です。メソッドシグネチャでconstを使用すると、thisが指し示すメモリをこのメソッド(ここではfoobar)で変更できないことをコンパイラに伝えています。

2

はい、constは署名の一部です。 const -nessでのみ異なる2つのメンバー関数を定義できます。

ことが必要であることを確認する最も簡単な方法は、お好みのコンパイラでコードをテストすることです - 以下のコードはコンパイルされません。

struct foobar{ 
    char foo() const; 
}; 
char foobar::foo() { 
    return 'a'; 
} 
int main() { 
    foobar().foo(); 
    return 0; 
} 

あなたはこのようなエラーを取得する必要があります:

error: prototype for 'char foobar::foo()' does not match any in class 'foobar'

char foobar::foo() 

Demo.

関連する問題