| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 516 人关注过本帖
标题:变量作用域的屏蔽效应
只看楼主 加入收藏
xinshou1991
Rank: 2
等 级:论坛游民
帖 子:35
专家分:45
注 册:2011-7-25
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:5 
变量作用域的屏蔽效应
#include <iostream>
using namespace std;
class A
{
public:
    static int a;
    void init(){a=1;}
    A(int a=2){init();a++;}
};
int A::a=0;
A obj;
int main()
{
    cout<<obj.a;
    return 0;
}
这个题目我是从书上看到的,书上给的分析我还是看不懂,希望高手指点一二!
搜索更多相关主题的帖子: include public 
2011-08-09 10:58
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:2 
就近原则,
变量会从当前作用于查找 变量的定义,找到则停止,
找不到则往上一级,继续上上一级,由里到外
2011-08-09 13:47
jcw08120110
Rank: 8Rank: 8
来 自:南京
等 级:蝙蝠侠
帖 子:272
专家分:742
注 册:2009-6-8
收藏
得分:2 
关键是这句  A(int a=2){init();a++;} 这里他又定义了一个int a=2;这是个构造函数,在这个函数里面 以后出现的a都是此函数自己定义的a,而不是类中的static int a; 而你的obj对象调用的a只可能是类中定义的a,A(int a=2){init();a++;}这一句中只有init()函数 修改了类中的a, 而a++被他自己定义的 int a=2;屏蔽掉了 所以结果是 a=3;obj.a =1;

本题的意义就是A函数中自己定义的变量屏蔽掉了公共的变量;

君生我未生 我生君以老
2011-08-09 14:28
xinshou1991
Rank: 2
等 级:论坛游民
帖 子:35
专家分:45
注 册:2011-7-25
收藏
得分:0 
呵呵...........有点明白了!多谢!
2011-08-10 11:45
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:6 
#include <iostream>
using namespace std;
class A
{
public:
    static int a;
    void init(){a=1;}
    A(int a=2){init();A::a++;}
};
int A::a=0;
A obj;

这样输出结果为2
静态是类的全局变量,不属于某个对象而属于某个类所拥有,不像普通的变量只属于一个对象拥有,这就是为什么在定义和调用
都要加类的名称A::了,没有加类的名称A::则不是调用你定义的static int a静态变量,我感觉这个例子不好,为什么要用静态呢?

#include <iostream>
using namespace std;
class A
{
private:
    int a;
public:
    int geta()const{return a;}  
    void init(){a=1;}
    A(int a=2){init();a++;cout<<a<<endl;}
};

A obj;
int main()
{
    cout<<obj.geta();
    return 0;
}
这样看上去更形象直观,这个例子很明确的告诉我们了,参数里面定义的变量a到了函数体中调用则会是参数中的变量a,
而不是对象中的变量(如果参数没有与对象中的变量重名的话那么就是调用对象中的变量).
如果要调用对象中的变量怎么办呢?那就通过对象里的公有函数调用geta(),比如
#include <iostream>
using namespace std;
class A
{
private:
    int a;
public:
    int geta()const{return a;}  
    void init(){a=1;}
    A(int a=2){init();a++;cout<<a<<endl;cout<<geta()<<endl;}
};

A obj;
int main()
{
    cout<<obj.geta();
    return 0;
}


都不结贴我郁闷那!
2011-08-10 14:28
xinshou1991
Rank: 2
等 级:论坛游民
帖 子:35
专家分:45
注 册:2011-7-25
收藏
得分:0 
嗯!xg5699功力深厚啊!
2011-08-11 11:07
快速回复:变量作用域的屏蔽效应
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018417 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved