C++ 类中的static函数,访问私有变量。

ufooler 2008-11-19 01:19:42
class test
{
public:
test();
~test();

static int data (test *_this);

private:

int __m_h_data;

};

int test::data(test *_this)
{
return _this->__m_h_data;
}


在class中的static的函数中为什么能够访问一个对象的私有变量(函数也可以)。


各位大侠帮忙。。。说道说道。
...全文
961 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
冻结 2008-11-21
  • 打赏
  • 举报
回复
给分很诡异。
ningweidong 2008-11-21
  • 打赏
  • 举报
回复
静态成员函数理论上来说只能访问静态成员变量。但是你这个程序中的静态成员函数有一个参数可以区分不同的对象,所以调用起来也没有问题。
iceman19860106 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 ViCross 的回复:]
引用 12 楼 cyclone_feng 的回复:
类、函数、字段都是有生命周期的,只有在生命周期内才可以被访问
类中的static 的函数是不能访问它自己的数据成员,大家都知道static的方法
是不需要实例化就可以调用的,而类中的数据成员必项实例化,这就是生命周期的开始,
也就是说当你的static方法在执行时,类中的数据成员还没实例化,所以不能访问
可以调用别的类的数据成员,是因为通过参数或在static方法内实例化了该类。

[/Quote]

确实是!访问权限是编译期间的事情,是面向对象编程封装性的一个体现!
gulangduxing 2008-11-20
  • 打赏
  • 举报
回复
该例子中静态函数能访问私有变量,完全是因为将它定义为成员函数。成员函数访问自己的私有变量,当然可以啦。
ViCross 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cyclone_feng 的回复:]
类、函数、字段都是有生命周期的,只有在生命周期内才可以被访问
类中的static 的函数是不能访问它自己的数据成员,大家都知道static的方法
是不需要实例化就可以调用的,而类中的数据成员必项实例化,这就是生命周期的开始,
也就是说当你的static方法在执行时,类中的数据成员还没实例化,所以不能访问
可以调用别的类的数据成员,是因为通过参数或在static方法内实例化了该类。
[/Quote]
道理差不多, 但是还是有些词用的不妥或者含糊:
1. 类的生命周期;
2. 类中的数据成员;
3. 别的类的数据成员;

请LZ记住, 访问权限是编译期间的事情.
deyangcai 2008-11-19
  • 打赏
  • 举报
回复
类中的static 的函数是不能访问它自己的数据成员,当你的static方法在执行时,类中的数据成员还没实例化,所以不能访问
zxianrong 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jiww03 的回复:]
引用 12 楼 cyclone_feng 的回复:
类、函数、字段都是有生命周期的,只有在生命周期内才可以被访问
类中的static 的函数是不能访问它自己的数据成员,大家都知道static的方法
是不需要实例化就可以调用的,而类中的数据成员必项实例化,这就是生命周期的开始,
也就是说当你的static方法在执行时,类中的数据成员还没实例化,所以不能访问
可以调用别的类的数据成员,是因为通过参数或在static方法内实例化了该类。

[/Quote]

LZ肯定会想,嗨丫,怎么这个都没注意到,我经常这样
sbtree 2008-11-19
  • 打赏
  • 举报
回复
看了一下,回答者鱼龙兼有啊
冻结 2008-11-19
  • 打赏
  • 举报
回复
看了一下,这个答案正确!

[Quote=引用 5 楼 ztz0223 的回复:]
此_this非彼this
static是不可以访问自身非static成员的!
你这里可以访问是因为,data是一个成员函数,可以访问别的同类对象的的变量
但是不可以访问自身的:

C/C++ codeint test::data(test *_this)
{
//__m_h_data = 10;就不对了
return _this->__m_h_data;
}
[/Quote]
jiww03 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cyclone_feng 的回复:]
类、函数、字段都是有生命周期的,只有在生命周期内才可以被访问
类中的static 的函数是不能访问它自己的数据成员,大家都知道static的方法
是不需要实例化就可以调用的,而类中的数据成员必项实例化,这就是生命周期的开始,
也就是说当你的static方法在执行时,类中的数据成员还没实例化,所以不能访问
可以调用别的类的数据成员,是因为通过参数或在static方法内实例化了该类。
[/Quote]

很对,你这样写就不对了:
int test::data(test *_this)
{ return __m_h_data; }

cyclone_feng 2008-11-19
  • 打赏
  • 举报
回复
static成员除外
cyclone_feng 2008-11-19
  • 打赏
  • 举报
回复
类、函数、字段都是有生命周期的,只有在生命周期内才可以被访问
类中的static 的函数是不能访问它自己的数据成员,大家都知道static的方法
是不需要实例化就可以调用的,而类中的数据成员必项实例化,这就是生命周期的开始,
也就是说当你的static方法在执行时,类中的数据成员还没实例化,所以不能访问
可以调用别的类的数据成员,是因为通过参数或在static方法内实例化了该类。
tnfyj 2008-11-19
  • 打赏
  • 举报
回复
楼主散分?
Longinc 2008-11-19
  • 打赏
  • 举报
回复
UP
星羽 2008-11-19
  • 打赏
  • 举报
回复
iso c++ 标准里 11 Member access control

1 A member of a class can be
— private; that is, its name can be used only by members and friends of the class in which it is
declared.
— protected; that is, its name can be used only by members and friends of the class in which it is
declared, and by members and friends of classes derived from this class (see 11.5).
— public; that is, its name can be used anywhere without access restriction.


这里是标准对Member functions的定义

Member functions [class.mfct]
1 Functions declared in the definition of a class, excluding those declared with a friend specifier (11.4),
are called member functions of that class. A member function may be declared static in which case it is
a static member function of its class (9.4); otherwise it is a nonstatic member function of its class (9.3.1,
9.3.2).

所以 Member functions 包括static Member functions 和nostatic Member functions





Non_Recursive 2008-11-19
  • 打赏
  • 举报
回复
static成员函数也是可以访问自己的数据的..
星羽 2008-11-19
  • 打赏
  • 举报
回复
static 成员也是成员,成员函数当然可以访问自己的数据,不管公的私的
就呆在云上 2008-11-19
  • 打赏
  • 举报
回复
此_this非彼this
static是不可以访问自身非static成员的!
你这里可以访问是因为,data是一个成员函数,可以访问别的同类对象的的变量
但是不可以访问自身的:
int test::data(test *_this)
{
//__m_h_data = 10;就不对了
return _this->__m_h_data;
}
cyj626 2008-11-19
  • 打赏
  • 举报
回复
up
加载更多回复(3)

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧