Ответ 1
Методы класса могут обращаться к своим частным атрибутам во всех экземплярах класса, по крайней мере, на С++.
Возможный дубликат:
С помощью частного модификатора, к кому напрямую можно получить доступ к объекту в других объектах?
Частные члены класса С++ предназначены для невидимости для других экземпляров класса. Я смущен, так как доступ к частным пользователям возможен, как показано ниже! Может ли кто-нибудь объяснить это мне?
Здесь мой код:
#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;
}
Методы класса могут обращаться к своим частным атрибутам во всех экземплярах класса, по крайней мере, на С++.
Любой фрагмент кода, который "принадлежит" типу Person
, сможет получить доступ к переменным public
, protected
и private
любого объекта Person
.
Тип имеет значение здесь, а не экземпляр.
Когда переменная назначается частной, это означает, что к ней могут обращаться только методы этого класса и необязательные классы и методы, назначенные как друзья. Любой экземпляр класса может обращаться к приватным переменным всех других экземпляров одного и того же класса.
Любой доступ за пределами класса запрещен. Если вы, например, не используете класс друзей. (Что позволяет любому другому классу получить доступ к частным членам класса)
Вы можете определить класс 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;
};
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;
}
Надеюсь, что эта помощь:)