免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1897 | 回复: 1
打印 上一主题 下一主题

[C++] 类的static变量初始化表达式的作用域 [复制链接]

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-09 08:42 |只看该作者 |倒序浏览
昨天晚上看C++ primer,发现类的static变量初始化表达式的作用域有点奇怪,网上也有人做了这个实验。

http://webdn.trueself.cn/archives/215
C++中,一个类的static变量的初始化表达式一定要在类声明的外面,但初始化表达式在寻找变量时却总是首先在类的成员变量中寻找,要是没有找到,才在外围作用域中寻找。
比如这段代码:

  1.    1. #include <iostream>
  2.    2. using namespace std;
  3.    3. int x=100;
  4.    4. class X{
  5.    5.     static int x;
  6.    6.     static int y;
  7.    7. public:
  8.    8.     void print(){
  9.    9.         cout<<"x:"<<x<<endl<<"y:"<<y<<endl;
  10.   10.     }
  11.   11. };
  12.   12. int X::x=1; //class X中static变量x的初始化表达式
  13.   13. int X::y=x+10; //class X中static变量y的初始化表达式
  14.   14. int main(int argc, char* argv[])
  15.   15. {
  16.   16.     X x;
  17.   17.     x.print();
  18.   18.     return 0;
  19.   19. }
复制代码

这段代码最后的打印结果为
x:1
y:11

可见,在代码的第13行,等号右边的x是类X的成员变量,而不是定义在文件头部定义的全局int x=100。
即使把12、13两行代码的顺序交换,程序的执行结果也不会变化。所以,编译器是在对整个文件扫描完成之后才开始执行初始化代码,而不是遇到一句执行一句,数据的依赖关系被自动解决了。

[ 本帖最后由 yecheng_110 于 2008-4-9 08:44 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-04-09 10:14 |只看该作者
呵呵。对啊。
要用那个全局的x也可以 int X::y = ::x + 1 就行
不过总感觉非const的静态类成员不是很爽。

[ 本帖最后由 heyuan 于 2008-4-9 10:15 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP