2013-07-24 15 views
6

私はC/C++の標準関数宣言に非常に精通しています。私は最近このようなものを見た:C++関数の構文/プロトタイプ - 角括弧の後のデータ型

int myfunction(char parameter) const 

上記は単なる仮説的な例であり、意味があるかどうかわからない。私はパラメータの後の部分を参照しています。 const。これは何ですか?

よりリアル例:これは、だから、テキストconstは、行の末尾に正確に何をやっているhere

wxGridCellCoordsArray GetSelectedCells() const 

を見つけることができますか?

+0

HTTPはありません://stackoverflow.com/questions/15999123/const-before-parameter-vs-const-after-function-name-c – chris

+0

または[this](http://stackoverflow.com/questions/3141087/what-is-機能終了宣言を伴う意味) – aaronman

+0

@chrisいいですね。しかし、今私は混乱しています。 'GetSelectedCells'関数は変更するパラメータがありません。 – itsols

答えて

4

constキーワードは、関数の後に表示されるとき、メンバーデータ変数が変更されないことを関数呼び出し側に保証します。このクラス指定されたインスタンスの場合

// In header 
class Node { 

public: 

Node(); 

void changeValue() const; 

~Node(); 

private: 

int value; 

}; 

// .cppファイル

void Node::changeValue() const { 
    this->value = 3; // This will error out because it is modifying member variables 
} 

では、この規則の例外があります。メンバデータ変数が可変であると宣言すると、関数がconstであると宣言されているかどうかにかかわらず変更できます。 mutableの使用は、オブジェクトが定数宣言されている稀な状況ですが、実際には変更するオプションが必要なメンバデータ変数があります。その使用の潜在的な例の1つは、元の計算を繰り返したくない値をキャッシュすることです。これは一般的に珍しいです...しかし、それを知っていることは良いことです。このクラス指定されたインスタンスの場合

、.cppファイル

void Node::changeValue() const { 
    this->value = 3; // This will not error out because value is mutable 
} 
+0

副作用には出力が含まれているので、それは完全ではありません。 – chris

+0

@chris:そうです。元の投稿を変更しました –

+0

うわー!とった。ありがとう:) – itsols

7

constは、変更可能とマークされていない限り、thisというデータメンバを変更しないことを示します。
メンバ関数のみがconstとマークされるので、メンバ関数の中で変更されることはありません。

+0

?それは? – itsols

+0

常にconstとマークされたメンバ関数 – aaronman

4

// In header 
class Node { 

public: 

Node(); 

void changeValue() const; 

~Node(); 

private: 

mutable int value; 

}; 

//それはあなた自身のプログラミングエラーを防ぐのを助けるために、 "防御的プログラミング" 技術です。ファンクションパラメータに対してconstを指定すると、ファンクションでそのパラメータを変更しないでください。constを追加すると、誤ってコンパイラがそのようにすることを防ぐことができます。同様に、のメンバー変数をというクラス変数に変更しないと、関数constのように関数全体を宣言すると、そのようにすることができなくなります。

また、コードを自己文書化するのに役立ちます。 constをパラメータに追加すると、「この関数はこのパラメータを変更しません」ということがユーザに伝えられます。 constをメンバ関数に追加すると、「この関数はクラスのメンバを変更しません」(明示的に変更可能なものを除く)ということがユーザに伝えられます。

本当に必要な場合を除いて、何かへのアクセスを制限することは、一般的には良いことと考えられるべきです。可能であれば、rootとして自分のシステムに日常的にログオンしていないのとまったく同じ理由です。そうした場合、より多くの権限を持つことになります。

+0

私はそれが好きです - 防衛的なプログラミングと自己文書化。アドバイスのための+1 – itsols

+0

実際にconstが使われている理由 – aaronman

2

キーワードの後のconst暗黙的なthisパラメータ(メソッドを呼び出すために使用されたオブジェクトのアドレスに設定されている)が定数オブジェクトを指していることを意味します。

C++。 Cアナログがそれぞれstruct Foo *const struct Foo *に、アクセスするための関数だろう

class Foo { 
    int x; 
    mutable int y; 
public: 
    void bar()  { 
     Foo *me = this;   // * this is an implicit parameter 
           // that points to the instance used 
           // to call bar() 
     assert(&x == &this->x); // * accesses to class members are 
           // implicitly taken from this 
     x = 1;     // * can modify data members 
    } 
    void bar() const { 
     // Foo *me = this;  // * error, since "bar() const" means 
           // this is a "const Foo *" 
     const Foo *me = this; // * ok 
     // x = 1;    // * error, cannot modify non-mutable 
           // members of a "const Foo" 
     y = 0;     // * ok, since y is mutable 
    } 
}; 

:メンバ関数は次のようになり

struct Foo { 
    int x; 
    int y; 
}; 

void Foo_bar (Foo *this)  { /* ... */ } /* can modify this->x and this->y */ 
void cFoo_bar (const Foo *this) { /* ... */ } /* cannot modify this->x nor this->y */ 

C.

には mutableアナログ
関連する問題