2012-12-23 3 views
11

가능한 중복 : C++ 클래스의
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; 
} 
+7

아닌 개체 별 하나. – chris

+1

주요 기능에서 p.age에 액세스 해보십시오. 즉, 클래스 밖에서 액세스하는 것이 방지됩니다. – PeterJ

+0

std :: string을 사용하여 문자열을 보관합니다. 현재 당신이 3 가지 규칙을 따르지 않고 있기 때문에 (이것은 문제입니다). –

답변

16

방법 :

여기 내 코드입니다.

+0

흠 .. +1이 답이 맞지만 누구나 그런 일을 자주합니까? 나는 그것을 할 필요가있을 때마다 생각하기 위해 고심하고있다. –

+0

주어진 예제와 거의 비슷하게 연산자를 오버로드 할 때 필요합니다. 그것 이외에는 드문 유스 케이스라고 생각합니다. –

4

변수가 private로 지정되면이 클래스의 메서드와 선택적으로 친구로 지정된 클래스 및 메서드 만 액세스 할 수 있음을 의미합니다. 클래스의 모든 인스턴스는 동일한 클래스의 다른 모든 인스턴스의 개인 변수에 액세스 할 수 있습니다.

5

즉, "속하는"코드의 조각 유형 Person 모든 Person 객체의 public, protectedprivate 변수에 액세스 할 수 있습니다.

유형이 여기에 중요합니다.

1

클래스 외부의 모든 액세스는 "금지"입니다. 예를 들어 친구 클래스를 사용하지 않는 한.

class MyClass { 
    friend class MyClassB; 
public: 
    MyClass(); 
    ~MyClass(); 
private: 
    int number; 
}; 

그런 다음 MyClassB는 "MyClass에"의 개인 변수에 액세스 할 수 있습니다 :

당신은이 같은 친구 - 클래스를 정의 할 수 있습니다 (하자 어떤 클래스의 private 멤버에 다른 클래스의 접근이다).

이 같은 것을 할 경우 : 당신이 클래스의 외부에서 A.number에 액세스하려고하고 있기 때문에

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

당신은 "오류"를 얻을 것입니다.

하지만 당신은 클래스 내부의 일부 기능에서 액세스 할 경우 :

class MyClass { 
public: 
    myClass() { 
     number = 10; 
     if(number > 10) { 
      qDebug() << "It's more than 10"; // Qt. well. 
     } 
    } 
    ~MyClass(); 
private: 
    int number; 
}; 
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; 
} 

희망이 도움 :) 그것은 당 수준으로의

관련 문제