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

时间:2012-12-23 02:37:47

标签: c++ visual-c++ c++11

  

可能重复:
  With a private modifier, why can the member in other objects be accessed directly?

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

5 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:5)

任何“属于”Person类型的代码片段都可以访问任何public个对象的protectedprivatePerson个变量

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

答案 2 :(得分:4)

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

答案 3 :(得分: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;
};

答案 4 :(得分:1)

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

希望这有帮助:)

相关问题