2016-02-20 47 views
2

我正在用C++学习OOP,并且我非常了解它的大部分基础知识。但这是我的问题。我了解到,我们无法从其他对象访问私人数据成员。但我有一个代码片段,似乎是这样做的。它的工作完美,但我想知道,为什么以及这个代码是如何工作的?这不是违反OOP规则吗?我如何能够访问某个班级的私人数据成员?

下面是代码:

#include "iostream" 

using namespace std; 

class Dist { 
int feet;   //private by default 
float inches;  //private by default 
public: 
void getdata() 
{ 
    cout<<"Enter the feets: "; 
    cin>>feet; 
    cout<<"Enter the inches: "; 
    cin>>inches; 
} 
void putdata() 
{ 
    cout<<"Data is "<<feet<<"\' "<<inches<<"\" "<<endl; 
} 
void add(Dist d) 
{ 
    this->feet = this->feet + d.feet;// accessing private data members! 
    this->inches = this->inches + d.inches; 
    if (this->inches >= 12) { 
     this->feet++; 
     this->inches = this->inches - 12; 
    } 
} 
}; 

int main() 
{ 
Dist d1,d2; 
d1.getdata(); 
d2.getdata(); 
d1.add(d2); 
d1.putdata(); 
return 0; 
} 

这怎么可能?

回答

1

不,这很好。访问私人成员仅限于课堂中的功能;无论该功能本身是否是私人的,受保护的或公共的。

因为你的功能是公开的,所以他们可以通过你的班级实例进行访问。

请注意,具有类实例作为参数的函数也可以访问这些类的私有成员 - 如果不是这种情况,那么编写像复制构造函数和赋值运算符这样的代码将会很困难。

+1

但是,d是一个不同的对象。 –

+0

这是一个很好的观点,但没关系。如果不允许写复制构造函数,那将很难! – Bathsheba

+0

理论上,语言可能需要一个类来“朋友”本身,以允许访问其他对象的“私人”成员。我从来没有想过认真对待这个问题,这个想法只是在我脑海中... –

1

私密表示您无法访问课堂以外的数据。

即使他们自己公开,类的其他成员仍然可以访问它们。

喜欢的东西

d1.feet; 

将是无效的,但。

3

如果你指的是这部分代码:

void add(Dist d){ 
    this->feet = this->feet + d.feet;// accessing private data members! 
    this->inches = this->inches + d.inches; 
    /* ... */ 
} 

那么这对双方thisdDist类对象的原因完全正常。重要的是,他们是相同的,不一样对象

查看Why do objects of the same class have access to each other's private data?的详细解释。

+0

所以,这意味着,如果他们是同一班,那么我就能够访问他们!而不是如果他们是另一个阶级的对象? –

+1

“那么我能够访问它们”从哪里访问?在你的代码中,你从'void Dist :: add(Dist)'中访问'Dist :: feet',它属于同一个类。如果您尝试从另一个类访问'Dist :: feet',那么这将是一个错误,因为私有数据成员不能被其他非派生类和派生类“Dist”访问。唯一的例外是将另一个类声明为Dist类的“朋友”类。 – iksemyonov