2012-12-23 8 views
11

可能性の重複:C++クラスの
With a private modifier, why can the member in other objects be accessed directly?プライベート変数は、同じタイプの別のオブジェクトからアクセスできますか?

プライベートメンバは、他のクラスのインスタンスに見えないように設計されています。プライベートメンバーのようにアクセスできますので、私は混乱しています!誰も私にそれを説明することはできますか?ここで

は私のコードです:クラスの

#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

それは、クラスごとではなく、オブジェクトごとの1にあります。 – chris

+1

あなたのメイン関数からp.ageにアクセスしてみてください。それはクラスの外部にアクセスすることを防ぎます。 – PeterJ

+0

std :: stringを使用して文字列を保持します。現在、あなたは3つのルールに従わないので(これは問題です)。 –

答えて

16

方法は、少なくともC++で、すべてのクラスインスタンス全体でそのプライベート属性にアクセスすることができます。

+0

えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええと>私はそれをする必要があるときはいつでも考えるのに苦労しています。 –

+0

ほとんどの場合、与えられた例のように、演算子のオーバーロード時に必要となるでしょう。それ以外はまれなユースケースだと思います。 –

4

変数がprivateに指定されている場合、このクラスのメソッドだけでなく、オプションで、フレンドとして指定されたクラスとメソッドがアクセスできることを意味します。クラスのインスタンスは、同じクラスの他のすべてのインスタンスのプライベート変数にアクセスできます。

5

タイプにPerson任意Personオブジェクトのpublicprotectedprivate変数にアクセスできるようになり、「所属」というコードの任意の断片。

ここではタイプが重要ですが、インスタンスではありません。

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

・ホープ、この助け:)

関連する問題