13

重複
の可能性: プライベート修飾子を使用すると、他のオブジェクトのメンバーに直接アクセスできるのはなぜですか?

C++ クラスのプライベート メンバーは、他のクラス インスタンスから見えないように設計されています。以下のようにプライベートメンバーにアクセスできるので、私は混乱しています!誰かが私にそれを説明できますか?

これが私のコードです:

#include <iostream> 
using namespace std; 
class Person
{
private:
    char* name;
    int age;
public:
    Person(char* nameTemp, int ageTemp)
    {
      name = new char[strlen(nameTemp) + 1];
      strcpy(name, nameTemp);
      age = ageTemp;
    }
    ~Person()
    {
      if(name != NULL)
        delete[] name;
      name = NULL;
    }
    bool Compare(Person& p)
    {
      //p can access the private param: p
      //this is where confused me
      if(this->age < p.age) return false;
        return true;
    }
};
int main() 
{ 
  Person p("Hello, world!", 23);
  return 0; 
}
4

5 に答える 5

19

クラスのメソッドは、少なくとも C++ では、すべてのクラス インスタンスでプライベート属性にアクセスできます。

于 2012-12-23T02:40:12.280 に答える
6

型に「属する」コードのスニペットは、任意のオブジェクトの、および変数Personにアクセスできます。publicprotectedprivatePerson

ここでは、インスタンスではなく型が重要です。

于 2012-12-23T02:43:19.607 に答える
4

変数がプライベートに指定されている場合、このクラスのメソッドと、オプションでフレンドとして指定されているクラスおよびメソッドのみが変数にアクセスできることを意味します。クラスのどのインスタンスも、同じクラスの他のすべてのインスタンスのプライベート変数にアクセスできます。

于 2012-12-23T02:42:58.337 に答える
1

クラス外へのアクセスは「禁止」です。たとえば、フレンドクラスを使用しない限り。(クラスのプライベートメンバーへの他のクラスのアクセスをしましょう)

次のようにフレンドクラスを定義できます。

class MyClass {
    friend class MyClassB;
public:
    MyClass();
    ~MyClass();
private:
    int number;
};

次に、MyClassB は「MyClass」のプライベート変数にアクセスできます。

次のようなことをすると:

class MyClass {
public:
    MyClass();
    ~MyClass();
private:
    int number;
};


int main(int argc, char *argv[])
{
    MyClass A;
    A.number = 11; // You can't do this
    if(A.number > 10) { // Either you can't do this.
        qDebug() << "It's more than 10"; // Qt. well.
    }


    return 0;
}

クラスの外から A.number にアクセスしようとしているため、「エラー」が発生します。

しかし、クラス内の関数からアクセスしたい場合:

class MyClass {
public:
    myClass() {
       number = 10;
       if(number > 10) {
           qDebug() << "It's more than 10"; // Qt. well.
       }
   }
    ~MyClass();
private:
    int number;
};
于 2012-12-23T02:51:11.263 に答える
1
if(this->age < p.age) return false;

p.age: age は private で、この行は class のメソッド内にあるため、このようにアクセスでき、すべての private メンバーにアクセスできます。

クラスのメソッドの外に置くp.ageとエラーになります。例えば:

int main() 
{ 
    Person p("Hello, world!", 23);
    // will be error, because main is not inside class People
    if (p.age < 18) {   
       cout << "You are not adult" << endl;
    }
    return 0; 
} 

この助けを願っています:)

于 2012-12-23T02:51:34.947 に答える