2012-06-03 96 views
8

我正在学习C++的OOP的基本概念,并且遇到了一个合理的问题。面向对象的编程逻辑

#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(); 
} 

我想在上面的代码为什么我能够访问x.i [线路19],它是在不同object.Isn't一个私有成员的私人范围限定在同一个类即使知道该对象作为参数传递?

+1

想一想,如果不允许的话,你的例子会是多么丑陋的一个常见任务。 'private'的意义不在于限制来自“foreign”_objects_的访问,而是要封装_code_。而且类中的代码根本不关心任何一个特定对象,除了隐式传递给每个非静态成员函数的'this'指针。 – leftaroundabout

回答

13

private在C++指私人到类,不私人到对象。两种解释都是可能的,确实有些语言选择了另一种语言。但是大多数语言都像C++一样,并允许同一类的对象访问另一个实例的私有成员。

0

cpy(A x)是该类的成员,它可以访问private字段和方法。

private关键字限制来自其他类(对象)的参数来访问这些字段。任何属于某个类的代码都可以访问它自己的私有成员(字段或方法)。

+1

问题是为什么它可以访问提供的x对象上的私有字段。这不是同一个对象,即使它是同一个班级。 –

0

一个类可以访问它自己的私有数据成员。

这也意味着,如果你有两个或多个实例(this和东西作为参数传递),您可以访问对象的私有(公共)变量/方法

+0

问题是为什么它可以访问提供的x对象上的私有字段。这不是同一个对象,即使它是同一个班级。 –

+0

@真理我的回答已经非常清楚地表明......实际上这是第一个这样做的人 – Raekye

5

变量x和处理的任何功能y是同一类的两个实例。他们是不同的对象但他们属于同一类。这就是为什么有可能从成员函数访问私有成员。

0

即使将对象作为参数传递,是否将私有作用域限制为同一类?

是的,这是发生了什么事x正在访问私有成员i在同一个班即在类一个

2

私有财产或类的方法意味着它不能从类作用域之外直接访问。因为公共方法是在一个类中定义的,我们可以通过它来访问和操纵私有成员的价值。

在上例中,您不是直接从对象中访问'i',而是通过公共方法来操作它。

想这样:你有一个银行账户,你在银行的钱是私人会员。你不能直接去银行自己拿钱。银行出纳员就像一种公共的方式,可以访问私人财产,即你的钱,你可以通过出纳操纵你的钱。