0

私は構造化プログラミングの宿題に取り組んでおり、ユーザーが名前を何とか何とか入力できるようにするプログラムを作成する必要があります。文字列配列に名前を入れた後にやりたいことは、それらを画面に出力することです。配列とそこに含まれる名前の数を関数に渡して、それらを画面に出力することで、これを達成したいと考えていました。配列と名前の数を定数として渡し、それらを保護して、関数によって変更できず、読み取り専用になるようにしたかったのです。ただし、文字列配列または名前の数の前に const を配置できない理由がわかりません。

void writeNames (const string namelist[], const int number_of_names)

これは私が受け入れなければならないものですか、それとも両方を読み取り専用として関数に渡す方法はありますか? これがなくても宿題を終わらせることができるので、これは「宿題を手伝って」というよりも好奇心の問題です。

PS ベクトルは、文字列などを使ってさらに多くのことを行う方法のようですが、まだクラスで使用していないため、まだ使用できません。

ありがとう

4

1 に答える 1

0

関数内で何を行っているかを確認せずに質問に答えるのは難しいですが、水晶玉によると、メソッド内のパラメーターの 1 つを潜在的に変更する可能性のある何かを実行している可能性が高いため、宣言したためにコンパイラーが不平を言っています。パラメータ定数。

例として、次のようなものは問題なく動作します。

void writeNames(const std::string namelist[], const int number_of_names)
{
    for(int i = 0; i < number_of_names; i++) {
        std::cout << namelist[i] << std::endl;
    }
}

ただし、変数の1つを変更しているため、次のようなものはコンパイラエラーを引き起こします。

void writeNames(const std::string namelist[], const int number_of_names)
{
    while(number_of_names--) {   // <-- We're modifying a const value here
        std::cout << namelist[count] << std::endl;
    }
}

ちなみに、「number_of_names」パラメーターに const 修飾子を配置することは、パラメーターを値で渡すため、多少冗長です。そのため、関数内で値を変更しても、呼び出し関数の入力パラメーターの値には影響しません。ただし、配列内の文字列の変更は呼び出し元の関数に反映されるため、そこでの const 修飾子は理にかなっています。通常、 const は、ポインターであるか、参照によって渡されるパラメーターに対してのみ使用します。

于 2013-10-26T02:20:05.930 に答える