13

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

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都可以访问任何对象的public,protectedprivate变量。Person

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

于 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 是私有的,可以这样访问,因为这一行在类的方法里面,所以可以访问所有的私有成员。

如果你把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 回答