コピーまたは移動コンストラクターを定義すると、別のクラスのプライベート変数にアクセスできます。 C++はそれらを自動的に相互にfriend
しますか?
例えば:
my_str::my_str(my_str&& m)
{
size_ = m.size_; //accessing private variable another my_str class
buff_ = m.buff_; //accessing private variable another my_str class
m.buff_ = nullptr;
m.size_ = 0;
}
フレンドとは見なされませんが、はい、クラスmy_str
のメンバー関数は、this
インスタンスだけでなく、タイプmy_str
のすべてのインスタンスのプライベートメンバーにアクセスできます。
class my_str {
void foo(my_str& other) {
// can access private members of both this-> and other.
}
static void bar(my_str& other) {
// can access private members of other.
}
};
その背後にある一般的な考え方は、同じタイプの2つ以上のオブジェクトがプライベートメンバーを公開する必要なく相互作用できるようにすることです。
クラス自体のメンバー関数は、メンバー関数がクラス内で定義されているかクラス外で定義されているか、コピーなどの特別なメンバー関数であるかどうかに関係なく、常にprivate
メンバーにアクセスできます。/moveコンストラクタ。
したがって、これらはクラスのfriend
ではありません。それは意味がないからです。彼らはすでにクラスの一部です。ただし、private
sであるためではなく、クラスの一部であるため、すべてのfriend
メンバーにアクセスできます。
コンストラクターでメンバーを初期化できない場合(メンバーにアクセスできないため)、メンバーのアクセス可能性の概念全体は無意味です。 (メンバーをどのように初期化しますか?)
また、アクセシビリティは、メンバーがアクセスされるオブジェクトの問題ではありません。アクセシビリティは、コードのどこで名前(メンバーの名前)が使用されているかだけの問題です。関数がクラスの1つのインスタンスのメンバーにアクセスできる場合は、同じクラスの別のインスタンスのメンバーにもアクセスできます。