C++关于变量作用域的问题
一个程序classA{public:staticinta;voidinit(){a=1;}A(inta=2){init();a++;}};intA::a=0;Aobj;i...
一个程序
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;
}
为什么输出的a是1 怎么样确定作用域,就是什么时候是作用于静态的a 什么时候作用于构造函数里面定义的参数a....头都晕了 求高人。。。
} 展开
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;
}
为什么输出的a是1 怎么样确定作用域,就是什么时候是作用于静态的a 什么时候作用于构造函数里面定义的参数a....头都晕了 求高人。。。
} 展开
展开全部
在声明对象obj时,系统调用构造函数
A(int a=2){init();a++;}
该构造函数的传入参数是int a =2
在函数内部先调用init()
该函数是将类的静态变量a赋值为1
而之后的a++则是对传入的参数a=2进行加1操作
为什么init没有对传入的参数a=2重新赋值呢?因为init不接受传入参数,对于init而言唯一可见的变量a只可能是A的静态成员变量
所以最终的结果是obj.a =1
这种东西只有在考试的时候才会出现,工作中写这样的代码一定给会被人骂的
我一直坚持机器读的懂的代码不一定是好代码,只有人能轻松读懂的代码才是优秀的代码
A(int a=2){init();a++;}
该构造函数的传入参数是int a =2
在函数内部先调用init()
该函数是将类的静态变量a赋值为1
而之后的a++则是对传入的参数a=2进行加1操作
为什么init没有对传入的参数a=2重新赋值呢?因为init不接受传入参数,对于init而言唯一可见的变量a只可能是A的静态成员变量
所以最终的结果是obj.a =1
这种东西只有在考试的时候才会出现,工作中写这样的代码一定给会被人骂的
我一直坚持机器读的懂的代码不一定是好代码,只有人能轻松读懂的代码才是优秀的代码
展开全部
首先我们从int A::a=0;看起,这儿你把静态成员变量赋值为1,我们记:A::a=1;
接着你定义了一个对象A obj;自然调用了A的构造函数:
A(int a=2)/*a是默认为2的参数整个构造函数中形参a屏蔽了静态变量static int A::a(除init()函数),所以里面的a是形参*/
{
init();
a++;
}
构造函数中调用了函数init();而init中的a是static int A::a,所以是1.
以上是本人猜想。
接着你定义了一个对象A obj;自然调用了A的构造函数:
A(int a=2)/*a是默认为2的参数整个构造函数中形参a屏蔽了静态变量static int A::a(除init()函数),所以里面的a是形参*/
{
init();
a++;
}
构造函数中调用了函数init();而init中的a是static int A::a,所以是1.
以上是本人猜想。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果两个变量 同名 其中一个(1号)的作用域A在另一个(2号)的作用域B当中,那么在A用到的变量肯定都 是1号 优先使用自己作用域中的,不知道说的能不能理解,希望能帮助你
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询