C++静态函数可以访问非静态变量吗?
在函数体内不可以
class A
{
int x;
int static int funa();
int static int funb(A aa);
}
A::funa()
{
cout<<x<<endl; //error;
}
但是
A::funb(A aa)
{
cout<<aa.x<<endl; //ok?
}
是不是这样理解呢??
问题点数:50、回复次数:23Top
1 楼xiaocai0001(高楼目尽欲黄昏/梧桐叶上萧萧雨)回复于 2005-11-12 21:33:08 得分 0
类的静态成员本身没有this指针, 所以无法访问自己的非静态数据成员和成员函数, 需要对象形式来访问.如你所说Top
2 楼rigel2001(大宝)回复于 2005-11-12 21:33:11 得分 0
非静态成员变量通过实例访问,不指定实例默认用this,报错Top
3 楼pongba(刘未鹏|http://blog.csdn.net/pongba)回复于 2005-11-13 02:18:03 得分 0
不要什么问题都拿到坛子上问,随便找本c++入门教材好好看看也能找到答案啊,到论坛上永远学不到系统的知识;-)
Top
4 楼playar0709(ClassyK)回复于 2005-11-13 06:21:55 得分 30
你的A::funb如果改写成
A::funb( A* aa); // 即参数不使用对象,而使用指针
就差不多就是
A::funb(); //非static, 编译后,其实就是A::funb( A* aa=this); !
---
: Chance is a gift for those who tryTop
5 楼fiftymetre(50米深蓝)回复于 2005-11-14 11:04:00 得分 0
静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.
非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中..
Top
6 楼manboo(我从山中来)回复于 2005-11-14 11:22:11 得分 0
不可以啊!Top
7 楼yuanchuang(元创)回复于 2005-11-14 11:39:48 得分 0
不能Top
8 楼wangya110()回复于 2005-11-15 19:37:57 得分 0
静态成员函数可以直接引用静态数据成员,但不能直接引用非静态数据成员.如果想引用非静态成员时,则可以通过对象来引用.
<类名>::<静态成员函数名>(参数)
<对象名>.<静态成员函数名>(参数)
题中x是非静态成员,所以会出现错误!Top
9 楼yuanxiaojin(金子)回复于 2005-11-15 21:00:14 得分 0
static成员是放在静态存储区的,它并不受访问控制符的限制。
而其它的成员变量则是放在栈中的,你使用的静态存储区的内容是找不到究竟要去调用那个对象的,所以,错误。Top
10 楼tdrhsb(月亮上砍桂花树的男人)回复于 2005-11-15 22:32:27 得分 0
基础知识啊,唉,好好看书吧!
c++得书上都会提到得!!!Top
11 楼Mr_Yang(初级程序员)回复于 2005-11-15 23:13:45 得分 5
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。
在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员。如果静态成员函数中要引用非静态成员时,可通过对象来引用。Top
12 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-11-16 15:43:45 得分 5
一个是直接访问,一个是通过对象Top
13 楼Kid4you(Kid4you)回复于 2005-11-16 15:49:23 得分 0
呵呵,今天在Intel面试时候,做到这个题了. 显然不能啊,函数体静态函数怎么知道非静态变量所属的对象呢.Top
14 楼zh1369(口一华)回复于 2005-11-16 17:30:06 得分 0
来晚了 没分了
不能,不过可以创立对象,然后访问。Top
15 楼zhouhuahai(道号"虚无")回复于 2005-11-16 17:41:35 得分 0
偶发现一个规律:
凡是有五十分以上的题, 都可以看到50米的 ..... 佝偻的身影 ~_~Top
16 楼kobefly(科比--网络学习中)回复于 2005-11-16 17:43:52 得分 0
道长也来凑热闹,哈哈Top
17 楼liwf(一叶孤舟)回复于 2005-11-16 18:13:20 得分 10
不能直接访问非静态成员。
不过可以通过参数传递近来某个具体对象,然后通过该对象调用其非静态成员。
如下:
class A
{
int Fun1(void);
static int Fun2(const A& a);
};
static int A::Fun2(const A& a)
{
a.Fun1();
}Top
18 楼bm1408(向va_list学习~不用VC好多年~)回复于 2005-11-16 19:13:26 得分 0
静态对象属于类的,而并非属于类对象的
正如楼上兄台所说,是隐含的this 指针在做怪~~~Top
19 楼VcGreenhand(自由虫)回复于 2005-11-16 20:15:00 得分 0
不能Top
20 楼WuOu(天堂*蓝珀湖*仰音*诚彦)回复于 2005-11-16 20:31:00 得分 0
Mark.Top
21 楼ywchen2000(灌水大帝:努力奋斗)回复于 2005-11-17 00:38:33 得分 0
不能Top
22 楼xjp6688(大平/要做必须最好)回复于 2005-11-17 08:04:52 得分 0
没this指针Top
23 楼zsheep(剑胆琴心)回复于 2005-11-19 14:23:54 得分 0
感谢大家,是可以传指针对象引用非静态变量Top




