2

する

const char * const getName () const
{ 
   return name ;
}

getName()定数文字への定数ポインタを返すことを意味しますか? 関数は定数であるため、その引数は変更されません。

4

2 に答える 2

4

これはgetName()、定数文字への定数ポインターを返し、関数本体内の可変でないクラス メンバーを変更しないことを意味します。ミュータブル
として宣言されたクラス メンバーは、この関数で引き続き変更できることに注意してください。

于 2012-11-24T04:29:58.680 に答える
3

あなたの例、

const char * const getName() const { return name; }

ほとんどの場合、定数nullで終了する文字列(つまり、そのような文字列の最初の文字)への定数ポインタを返します。技術的には、これは単なるポインタcharです。しかし、そのようなポインタは、例えばによってnullで終了する文字列へのポインタとして扱われますcout

メソッドは宣言されているため、通常の非メンバーをconst直接変更することはできませんが、ポインターであるメンバーが指すデータを変更することはできます。mutableこれは、技術的には、呼び出されたオブジェクトの一部と見なされるものが宣言されているか、ポインターによってポイントされている場合、それらを変更できることを意味します。mutableただし、メソッドの一般的な規則ではconst、キャッシュの更新などの内部変更を行っても、オブジェクトの外部から見える状態は変更されません。つまり、外部ビューからは、オブジェクトが変更されたようには見えません。

C ++の場合、

  • std::string特に動的に割り当てられたメモリのライフタイム管理の問題を回避するために、などの文字列クラスを優先的に使用します。

  • プレフィックスは使用しないgetでください。C++では、プレフィックスは読み取りに追加されるだけです(たとえば、書き込みgetSin(x)*getCos(x)ますか?)。より一般的には、呼び出しコードが英語の散文のようになるように名前を付けます。:-)あなたはそれを小さな言語をデザインしていると見るかもしれません。

  • 原則として、const戻り値の最上位に追加しないでください。これにより、移動の最適化が妨げられます。

また、従来は、( Cの命名規則との競合を避けるために、アンダースコアは先頭ではなく末尾name_にあることに注意してください)などのメンバーの命名規則を使用します。myName

したがって、C ++では通常、その関数は次のようにコード化されます。

string name() const { return name_; }

stringこの定義が存在する非グローバル名前空間で非修飾で利用可能であると仮定します(これは私の好みです)。

于 2012-11-24T04:55:50.383 に答える