8

2 つのインライン関数を持つクラスがあるとします。

class Class {
public:
   void numberFunc();
   int getNumber() { return number; }
private:
   int number;
};

inline void Class::numberFunc()
{
   number = 1937;
}

そのクラスをインスタンス化し、クラス内の両方の関数を呼び出します。

int main() {
   Class cls;
   cls.numberFunc();
   cout << cls.getNumber() << endl;
   return 0;
}

両方のインライン関数がまだクラスのメンバーであることは理解していますが、インライン関数の本体内のコードが呼び出された場所に挿入されていることも理解しています。その挿入の結果として、number私が知る限りmain()、コンパイラへのコードは次のようになるため、メンバー変数に直接アクセスできないようです。

main() {
   Class cls;
   cls.number = 1937;
   cout << cls.number << endl;
   return 0;
}

なぜ私がまだそれらのプライベートメンバーにアクセスできるのか、またはインライン関数の理解について私を修正できるのか、誰かが私に説明できますか? inlineコンパイラには、一部の関数を無視するオプションがあることを知っています。それがここで起こっていることですか?

出力:

1937年

4

3 に答える 3

11

クラスのプライベート メンバーにアクセスするための規則は、コンパイラによって C++ コードに適用されます。これらの規則は、コンピューターが実行するコードであるコンパイラーの出力には直接適用されません。

于 2012-09-24T01:22:01.677 に答える
6

この inlineキーワードは、プログラマーが呼び出しの場所にコードを挿入したい場合、コンパイラーがそうする可能性があると考えていることを意味します。コンパイラは、キーワードなしで他の関数もインライン化する場合があります。コンパイラは、プログラマがばかだと思い、キーワードを無視してインライン化しないことがあります。それはすべて C++ 標準によるものです。

それ以外の点では、インライン メンバー関数はごく普通のメンバー関数です。その他の特権や制限はありません。

インラインでは、関数が複数のコンパイル ユニット (インライン関数が定義されているヘッダー ファイルを含む) によって定義されているというエラーは発生しません。これが、人々がインライン関数を書く理由の 1 つかもしれません。

于 2012-09-24T01:20:06.647 に答える
5

privateアクセス指定子は、コンパイラーではなく、クラスのユーザー (プログラマー) に対する制限です。コンパイラは、プログラムの観察可能な動作が同じである限り、何でも実行できます。

于 2012-09-24T01:10:20.610 に答える