2012-06-03 11 views
8

Ich lerne grundlegende Konzepte von OOP in C++ und stieß auf ein logisches Problem.Objektorientierte Programmierlogik

#include <iostream> 
#include <conio.h> 

using namespace std; 

class A { 
    int i; 
public: 
    void set(int x) { 
     i=x; 
    } 
    int get() { 
     return i; 
    } 
    void cpy(A x) { 
     i=x.i; 
    } 
}; 

int main() 
{ 
    A x, y; 
    x.set(10); 
    y.set(20); 

    cout << x.get() << "\t" << y.get() << endl; 
    x.cpy(y); 
    cout << x.get() << "\t" << y.get() << endl; 
    getch(); 
} 

Ich wollte in dem obigen Code wissen, warum ich in der Lage sind x.i [Zeile 19], um es ein privates Mitglied in dem verschiedenen object.Isn't ist der private Umfang auch auf die gleiche Klasse beschränkt, wenn Das Objekt wird als Parameter übergeben?

+1

Denken Sie darüber nach, wie hässlich eine so häufige Aufgabe wie Ihr Beispiel wäre, wenn es nicht erlaubt wäre. Der Punkt von "privat" ist nicht den Zugriff von "fremden" Objekten zu beschränken, sondern _code_ einzukapseln. Und der Code in einer Klasse beschäftigt sich niemals wirklich mit irgendeinem bestimmten Objekt, außer mit dem "This" -Zeiger, der implizit an jede nichtstatische Elementfunktion übergeben wird. – leftaroundabout

Antwort

13

private in C++ bedeutet privat zu der Klasse, nicht privat zum Objekt. Beide Interpretationen sind möglich, tatsächlich haben einige Sprachen die andere gewählt. Aber die meisten Sprachen sind in diesem Fall wie C++ und erlauben Objekten derselben Klasse den Zugriff auf die privaten Mitglieder einer anderen Instanz.

0

cpy(A x) ist ein Mitglied der Klasse, es kann private Felder und Methoden zugreifen.

Das Schlüsselwort private begrenzt die Werte anderer Klassen (Objekte), um auf die Felder zuzugreifen. Jeder Code, der zu einer Klasse gehört, kann auf seine eigenen privaten Mitglieder (Felder oder Methoden) zugreifen.

+1

Die Frage ist, warum kann es auf das private Feld auf dem gelieferten x-Objekt zugreifen. Es ist nicht dasselbe Objekt, auch wenn es dieselbe Klasse ist. –

0

Eine Klasse kann auf ihre eigenen privaten Datenmitglieder zugreifen.

Dies bedeutet auch, wenn Sie irgendwelche Funktionen, die mit zwei oder mehr Instanzen beschäftigen (this und etwas als Parameter übergeben) Sie beide private Objekt (und öffentliche) zugreifen können Variablen/Methoden

+0

Die Frage ist, warum kann es auf das private Feld auf dem gelieferten x-Objekt zugreifen. Es ist nicht dasselbe Objekt, auch wenn es dieselbe Klasse ist. –

+0

@Truth meine Antwort sagt das bereits sehr klar ... Tatsächlich war es der erste, der das tat – Raekye

5

Variablen x und y sind zwei Instanzen derselben Klasse. Sie sind verschiedene Objekte aber sie gehören zu der gleichen Klasse. Deshalb ist es möglich, über die Memberfunktion auf das private Mitglied zuzugreifen.

0

Ist der private Bereich nicht auf die gleiche Klasse beschränkt, auch wenn das Objekt als Parameter übergeben wird?

Ja, das ist das, was x passiert ist, ist das private Mitglied i in der gleichen Klasse das heißt in der Klasse Zugriff auf A.

2

Eine private Eigenschaft oder Methode einer Klasse bedeutet, dass sie nicht direkt außerhalb des Klassenbereichs zugänglich ist. Dafür werden öffentliche Methoden innerhalb einer Klasse definiert, über die wir auf den Wert von privaten Mitgliedern zugreifen und sie manipulieren können.

Im obigen Beispiel greifen Sie nicht direkt auf das Objekt 'i' zu, sondern Sie manipulieren es mit einer öffentlichen Methode.

Denken Sie es so: Sie haben ein Bankkonto und Ihr Geld in der Bank ist privates Mitglied. Sie können nicht einfach direkt zur Bank gehen und Ihr Geld selbst übernehmen. Kassierer in der Bank ist wie eine öffentliche Methode, die auf das Privateigentum zugreifen kann, also Ihr Geld, und Sie können Ihr Geld durch Kassierer manipulieren.