'private'または'public'キーワードはANSIC(またはその他のC)にありますか、それともC ++(およびJava、C#など)でのみ追加されましたか?
3 に答える
private
C89またはC99キーワードではありません。ウィキブックスのCプログラミング/参照表*を参照してください。
また、CはJavaやC#とは何の関係もありません**(実際には、C ++とも関係ありません)。ただし、その逆は当てはまりません。たとえば、C++はCから成長しました。
*より良い参照が必要です!
**実際、 C89はC++からandキーワードを「借用」しましたconst
volatile
。同様に、C99はinline
キーワードを「借用」し、 (それぞれC ++とのように)[citation-needed]_Bool
を追加しました。_Complex
bool
complex
どちらも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
クラスのコンストラクター( C 言語で構造体のメンバーを初期化する関数)でも static 変数を読み取ることができないため、 staticはprivateとは異なります。
静的変数は、それらが定義されたコードの部分 (関数、構造体など) でのみ使用できます。