質問
ANSI C(またはその他のC)の「プライベート」または「パブリック」キーワードですか、またはC ++(およびJava、C#、...)でのみ追加されましたか?
解決
private
はC89またはC99のキーワードではありません。 WikibookのCプログラミング/参照テーブル *を参照してください。
また、CはJavaやC#とは関係ありません(実際、C ++とも関係ありません)。ただし、逆は当てはまりません。たとえば、C ++はCから発展しました。
*より良い参照が必要です!
**実際、 C89" borrowed" C ++の const
および volatile
キーワード。同様に、C99は「借用」しました。 inline
キーワード、および _Bool
および _Complex
(C ++の bool
および complex
、それぞれ) [citation-needed] 。
他のヒント
どちらもCのキーワードではありませんが、一部の人々は次のことをしています:
#define public
#define private static
更新:
上記を行うのは悪い考えだと思う人のために、私は同意します。しかし、誰かが public
または private
をCのキーワードと考える理由を説明しています。
Cでコンパイルできないと思う人は、これを試してください:
#include <stdio.h>
#include <stdlib.h>
#define public
#define private static
private void sayHello(void);
public int main(void) {
sayHello();
return (EXIT_SUCCESS);
}
private void sayHello(void) {
printf("Hello, world\n");
}
C ++でコンパイルしないと思う人のために、はい、上記のプログラムはそうします。
更新:
まあ実際には、C ++標準のこの部分のために未定義の動作です:
を含む翻訳単位 ヘッダーにはマクロを含めないでください 宣言または定義された名前を定義する そのヘッダーに。また、そのような 翻訳単位はマクロを定義します キーワードと字句的に同一の名前。
したがって、上記の例と以下の例は、C ++で正気なことをする必要はありません。私の答えはまだCに対して完全に有効です(間違っていることが証明されるまで!:-))。
プライベートメンバーを持つC ++クラスの場合、次のような類似した(悪用と見なされる)ことができます。
main.c :
#include <cstdlib>
#define private public
#include "message.hpp"
int main() {
Message msg;
msg.available_method();
msg.hidden_method();
return (EXIT_SUCCESS);
}
message.hpp :
#ifndef MESSAGE_H
#define MESSAGE_H
#include <iostream>
class Message {
private:
void hidden_method();
public:
void available_method();
};
inline void Message::hidden_method() {
std::cout << "this is a private method" << std::endl;
}
inline void Message::available_method() {
std::cout << "this is a public method" << std::endl;
}
#endif
static は private とは異なります。これは、の constructor クラス(C言語の構造体のメンバーを初期化する関数)。
静的変数は、定義されたコードの部分(関数、構造体など)でのみ使用できます。