注册 登录
编程论坛 C++教室

一个类成员访问问题

xzx1002002 发布于 2008-08-11 13:57, 1017 次点击
下面是在百度知道发掘的一个挺有意思的问题。虽然实际中几乎不会这样来用。但是有助于深刻理解类成员的访问。

#include <iostream>
using namespace std;
class myclass{
int i;
public:
myclass(int s){i=s;}
myclass(){i=0;}
void xput(int test){i=test;}
void xget(){cout<<"i is "<<i<<"\n";}
void super_put(myclass t){i=t.i;}//直接访问了私有成员,还是用点访问的-_-
};
int main(){
myclass a,b;
int choice;
cout<<"直接访问私有成员变量测试开始……\n";
cout<<"请输入一个整数:";
cin>>choice;
a.xput(choice);
cout<<"a.xget() is ";
a.xget();
cout<<"b.xget() is ";
b.xget();
b.super_put(a);
cout<<"AFTER b.super_put(a)……\n";
cout<<"b.xget() is ";
b.xget();
return 0;
}

注意红色的一行。类对象直接访问了类的私有函数。大家可以讨论一下,这里为什么可以这样来用。
9 回复
#2
xzx10020022008-08-11 15:30
我认为,
只要是在成员函数和友元中就可以直接访问该类的私有成员变量,无论类的对象是谁。
所以,访问类的私有成员变量的权限是相对于访问它的地方的,而不是类的对象。
#3
elegant872008-08-11 16:41
类的成员函数可以直接访问类的私有成员的。
#4
中学者2008-08-11 19:24
........两个i明显不一样-,-
#5
中学者2008-08-11 19:25
数据成员的地址是对象地址加上数据成员在类中的偏移量-1....所以两个i的地址是不一样的.
#6
xlh52252008-08-11 19:56
当然可以!有问题?
#7
xzx10020022008-08-12 09:15
问题是两个i明显不一样,但是为什么都可以直接访问。
#8
thames2008-08-12 13:04
我想用剥洋葱的方法把程序还原就比较直观了
#9
zerocn2008-08-12 18:13
是可以的,一个类的成员函数可以访问同类的不同对象的成员
类似的,
1.派生类的成员函数可以访问同一个派生类的不同对象的基类子对象的protected成员
2.派生类的成员函数可以访问同一个派生类的不同对象的protected 和private成员



#include <iostream>
#include <stdlib.h>
#include <string>


using namespace std;
class base
{public:
 base():base_value(0){}   
 protected:
 int base_value;
};


class dervied:public base
{
 public:
 dervied():dervied_value(0){}
 void show(const dervied &obj){cout<<"base::base_balue:"<<obj.base_value<<endl
                              <<"dervied::dervied_value:"<<obj.dervied_value;}
 private:
 int dervied_value;     
};


using namespace std;


int main()
{
    dervied A,B;
    A.show(B);
    system("pause");   
    return 0;
}
#10
jimn19822008-08-14 10:25
通俗理解
通俗理解是对象的数据和函数的代码是分开的.同类的对象公用函数的代码部分.所以只要传递进去的对象是同一个类实例化的.函数都可以访问.
1