2013-04-01 31 views
2

我有這個類聲明。我觀察到在方法距離(點b)中,如何訪問Point-b.x和b.y的私有成員?如果我嘗試訪問main中的b.x和b.y,則不允許。爲什麼在這裏訪問私有變量?

#include <iostream> 
#include <cmath> 

using namespace std; 

class Point { 
private: 
    int x, y; 
public: 
    Point() { 
     cout << "Constructor called" << endl; 
     x = 0; y = 0; 
    } 

    ~Point() { 
    } 

    void set(int a, int b) { 
     x = a; 
     y = b; 
    } 

    void offset(int dx, int dy) { 
     x += dx; 
     y += dy; 
    } 

    void print() { 
     cout << "(" << x << "," << y << ")" << endl; 
    } 

    // HERE 
    double distance(Point b) { 
     return (sqrt(pow(x-b.x, 2)+pow(y-b.y, 2))); 
    } 
}; 

int main() { 
Point p, q; 

p.print(); 
p.offset(4, 3); 
p.print(); 

q.set(10, 2); 

cout << "Distance: " << p.distance(q) << endl; 

return 0; 
} 

注:我已經編譯和運行在ideone.com

+1

因爲距離'是'Point'的成員。 – chris

+0

如果類成員函數無法訪問私有變量,可能會發生什麼? –

+0

[什麼是訪問說明符?我應該繼承與私人,保護或公共?](http://stackoverflow.com/questions/5447498/what-are-access-specifiers-should-i-inherit-with-private-protected-or-public) –

回答

4

訪問說明,如privatepublic等適用於classes,不只是類對象的概念方案。如果一個變量是private,並且該類的對象A具有一個接受同一類的另一個對象B的函數,則A可以訪問B的私有成員,因爲A和B屬於同一個類。

拷貝構造函數依賴這個:

#include <iostream>                 

using namespace std;                


class A {                  
    public:                  

    A(){val = 1.0;}                

    //copy constructor         
    A(const A& _other) {              
     val = _other.val; //accessing private member of _other     
    }                   

    double dist(A _a) {return val - _a.val;} //accessing private member of _other 

    private:                  
    double val;                 
};                    


int main() {                  

A a;                    
A b;                    

cout << a.dist(b) << endl;              

} 
+1

第一個真正的答案,+1。 – SomeWittyUsername

+0

這是有道理的。可能我認爲訪問說明符是針對對象的。 – aakash

+1

「this」和例如方法參數(和其他對象)與訪問檢查有關。在'this'對象上,您可以自由訪問基類的受保護成員。對於其他對象來說並非如此,所以是的,這與其他對象有所不同。到哪個對象。 –

0

int x, y;類的私有點。這意味着Class Point的所有成員都可以訪問,修改它。

Class Point的函數和構造函數是公開的即其他函數(來自其他類等)[像main]可以訪問它們。 OOPS的想法是保證您的數據安全,任何想修改值的人都可以通過該類的公共方法來完成。他們無法直接訪問它們。這可以讓你保持無效修改數據的任何檢查

如果妳保持int x,ypublic [這是不正確OOPS]任何功能(主等)等設置像height = -4;無效值]可以訪問和修改值不希望的東西。

Point p;

p.x = -5(假設你只想+已經值X,你不能檢查功能訪問是設置一些不良值)`

不是一個相關的比喻,但仍..在房子裏只有家庭成員可以進入的房間。任何想要保留,刪除或對房屋內的東西做任何事的外人都必須要求你的家人這樣做。如果你假設即使家人不允許進入房間[假設即使成員功能不能訪問變量],那麼沒有任何東西在房間裏使用[數據不能被任何人使用]