可以从同一类型的另一个对象访问私有变量

A private variable can be accessed from another object of the same type?

本文关键字:访问 一个对象 变量 类型      更新时间:2023-10-16

可能重复:
使用私有修饰符,为什么可以直接访问其他对象中的成员?

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

类的方法可以在所有类实例中访问其私有属性,至少在C++中是这样。

任何"属于"类型Person的代码片段都可以访问任何Person对象的publicprotectedprivate变量。

类型在这里很重要,而不是实例。

当一个变量被指定为私有变量时,意味着只有该类的方法以及指定为友元的类和方法才能访问它。该类的任何实例都可以访问同一类的所有其他实例的私有变量。

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

p.age: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; 
} 

希望得到帮助:(

类外的任何访问都是"禁止的"。除非你使用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'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;
};