Доступ к частной переменной можно получить из другого объекта того же типа?

Возможный дубликат:
С помощью частного модификатора, к кому напрямую можно получить доступ к объекту в других объектах?

Частные члены класса С++ предназначены для невидимости для других экземпляров класса. Я смущен, так как доступ к частным пользователям возможен, как показано ниже! Может ли кто-нибудь объяснить это мне?

Здесь мой код:

#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; 
}

Ответ 1

Методы класса могут обращаться к своим частным атрибутам во всех экземплярах класса, по крайней мере, на С++.

Ответ 2

Любой фрагмент кода, который "принадлежит" типу Person, сможет получить доступ к переменным public, protected и private любого объекта Person.

Тип имеет значение здесь, а не экземпляр.

Ответ 3

Когда переменная назначается частной, это означает, что к ней могут обращаться только методы этого класса и необязательные классы и методы, назначенные как друзья. Любой экземпляр класса может обращаться к приватным переменным всех других экземпляров одного и того же класса.

Ответ 4

Любой доступ за пределами класса запрещен. Если вы, например, не используете класс друзей. (Что позволяет любому другому классу получить доступ к частным членам класса)

Вы можете определить класс friend следующим образом:

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 more than 10"; // Qt. well.
    }


    return 0;
}

Вы получите "ошибку", потому что пытаетесь получить доступ к A.number вне класса.

Но если вы хотите получить доступ к некоторой функции внутри класса:

class MyClass {
public:
    myClass() {
       number = 10;
       if(number > 10) {
           qDebug() << "It more than 10"; // Qt. well.
       }
   }
    ~MyClass();
private:
    int number;
};

Ответ 5

if(this->age < p.age) return false;

p.age: возраст является закрытым и доступен для доступа, так как эта строка находится внутри метода класса, поэтому он может обращаться ко всем частным членам.

если вы поместите 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; 
} 

Надеюсь, что эта помощь:)