2012-12-23 13 views
11

Powiel możliwe:
With a private modifier, why can the member in other objects be accessed directly?Do zmiennej prywatnej można uzyskać dostęp z innego obiektu tego samego typu?

prywatnych członkowie klasy C++ mają być niewidoczne dla innych instancji klasy. Jestem zdezorientowany, ponieważ prywatni członkowie mogą uzyskać dostęp do , jak pokazano poniżej! Czy ktoś może mi to wyjaśnić?

Oto mój kod:

#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

To jest na zasadzie per-klasy, a nie na obiekt jednym. – chris

+1

Spróbuj uzyskać dostęp do strony p .age z głównej funkcji - to właśnie to zapobiega, dostęp poza klasę. – PeterJ

+0

Użyj std :: string do przechowywania ciągów. Obecnie, ponieważ nie robisz tego, nie przestrzegasz zasady trzech (co jest problemem). –

Odpowiedz

16

Metody klasy mogą uzyskać dostęp do jego prywatnych atrybutów we wszystkich przypadkach klasowych, przynajmniej w C++.

+0

Hmm .. +1 "bo ta odpowiedź jest prawidłowa, ale czy ktoś robi takie rzeczy często? Staram się myśleć o każdej porze, kiedy muszę to zrobić. –

+0

Najprawdopodobniej potrzebujesz go podczas przeciążania operatora, prawie tak, jak w podanym przykładzie. Poza tym, przypuszczam, że jest to rzadki przypadek użycia. –

4

Gdy zmienna jest określona jako prywatna, oznacza to, że tylko metody tej klasy i ewentualnie klasy i metody oznaczone jako znajomi mogą uzyskać do niej dostęp. Każda instancja klasy może uzyskać dostęp do zmiennych prywatnych wszystkich innych instancji tej samej klasy.

5

Każdy fragment kodu, który „należy” do rodzaju Person będą mogli uzyskać dostęp do public, protected i private zmienne dowolnego Person obiektu.

Ten typ ma znaczenie, a nie instancja.

1

Każdy dostęp poza zajęciami jest "zabroniony". Chyba, że ​​na przykład korzystasz z klasy przyjaciół. (Który niech jakaś inna klasa dostęp do prywatnego członków klasy)

Można zdefiniować przyjaciela klasy tak:

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

Następnie MyClassB będą mieli dostęp do zmiennych prywatnych „MojaKlasa”.

Jeśli zrobisz coś takiego:

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

dostaniesz „błąd”, ponieważ próbujesz uzyskać dostęp A.number spoza klasy.

Ale jeśli chcesz uzyskać dostęp z niektórych funkcji wewnątrz klasy:

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: wiek jest prywatna i może uzyskać dostęp do tak ponieważ linia ta znajduje się wewnątrz metody klasa, dzięki czemu może uzyskać dostęp do wszystkich członków prywatnych. Jeśli podasz p.age poza metodą klasy, zauważysz błąd. Na przykład:

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

nadzieję, że to pomaga :)

Powiązane problemy