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

变量作用域的屏蔽效应

xinshou1991 发布于 2011-08-09 10:58, 516 次点击
#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;
}
这个题目我是从书上看到的,书上给的分析我还是看不懂,希望高手指点一二!
5 回复
#2
hahayezhe2011-08-09 13:47
就近原则,
变量会从当前作用于查找 变量的定义,找到则停止,
找不到则往上一级,继续上上一级,由里到外
#3
jcw081201102011-08-09 14:28
关键是这句  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函数中自己定义的变量屏蔽掉了公共的变量;
#4
xinshou19912011-08-10 11:45
呵呵...........有点明白了!多谢!
#5
xg56992011-08-10 14:28
#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;
}

#6
xinshou19912011-08-11 11:07
嗯!xg5699功力深厚啊!
1