变量作用域的问题??

时间:2022-12-01 06:07:47
#include<iostream.h>
class Point
{
private:
int x;
int y;
public:
Point()
{
x=0;
y=0;
}
Point(int a,int b)
{
x=a;
y=b;
}
~Point()
{
}
void print()
{
cout<<x<<endl<<y<<endl;
}
void print(int x,int y)
{
x=x;                           // 这里的x和y难道不是Point类中的x和y??           
y=y;                           //如果不是的话,那么printf()函数中的cout<<x<<endl<<y<<endl;中的x和y为什么会输出?
//cout<<x<<endl<<y<<endl;
}

};

void main()
{
Point a(3,3);
a.print(2,2);
a.print();                         //这里为什么没有输出2 2???
//cout<<a.x<<endl<<a.y<<endl;

}

12 个解决方案

#1


楼主用的VC6吗,这是VC6的一个小bug~~~


void print(int x,int y)
    {
        this->x=x;                           // 这里的x和y难道不是Point类中的x和y??           
        this->y=y;                           //如果不是的话,那么printf()函数中的cout<<x<<endl<<y<<endl;中的x和y为什么会输出?
        //cout<<x<<endl<<y<<endl;
    }

这样就好了。

珍惜生命,远离VC6

#2


很显然,
  void print(int x,int y)
    {
        x=x;           
        y=y;                           
        //cout<<x<<endl<<y<<endl;
    }
这里的x和y, 都是print的参数x和y。

#3


全局变量和局部变量,同名的时候,全局变量被隐藏。

这个也是一样。

#4


引用楼主 haolly 的回复:
void print(int x,int y)
    {
        x=x;                           // 这里的x和y难道不是Point类中的x和y??           
        y=y;                           //如果不是的话,那么printf()函数中的cout<<x<<endl<<y<<endl;中的x和y为什么会输出?
        //cout<<x<<endl<<y<<endl;
    }


成员函数中的名称解析顺序是如下这样的:先找局部域,然后找类域,最后外部域直到全局域。

print的局部域里面已经存在x和y的名称了,当然先解析为print的两个形参。

#5


2L正解 变量名重复时 需要加this指针 指明左值为成员变量。

#6


引用 1 楼 peige2008 的回复:
楼主用的VC6吗,这是VC6的一个小bug~~~


void print(int x,int y)
    {
        this->x=x;                           // 这里的x和y难道不是Point类中的x和y??           
        this->y=y;                           //如果不是的话……


感觉这个不算BUG吧,楼主那个写法本来就是操作的函数局部变量中的X,Y???

#7


引用 3 楼 jixingzhong 的回复:
全局变量和局部变量,同名的时候,全局变量被隐藏。

这个也是一样。



不是说单目作用域运算符::可以访问外层程序块中的全局变量嘛
我用改为:
::x=x;
::y=y;
之后为什么还不行?

#8


学习了·····

#9


引用 7 楼 haolly 的回复:
引用 3 楼 jixingzhong 的回复:

全局变量和局部变量,同名的时候,全局变量被隐藏。

这个也是一样。



不是说单目作用域运算符::可以访问外层程序块中的全局变量嘛
我用改为:
::x=x;
::y=y;
之后为什么还不行?

::前面加个point看下

#10


    
void print(int x,int y)
    {
        x=x;                           // 这里的x和y难道不是Point类中的x和y??           
        y=y;                           //如果不是的话,那么printf()函数中的cout<<x<<endl<<y<<endl;中的x和y为什么会输出?
        //cout<<x<<endl<<y<<endl;
    }

是这样的 你这个方法的形参是x,y但是你里面保存的变量也是x,y 这样相当于重复声明了变量
这是时候编译器自动认为 这个{}里面的x,y 但是指形参的x,y 
这个x = x这个意思就是形参的x = 形参的x 但是我们想要的是外面的x
这个时候就前面加上个this. 意思是这个类的
this.x就是这个类的x 就可以完成楼主的要求了

#11


[Quote=引用 3 楼 jixingzhong 的回复:]

全局变量和局部变量,同名的时候,全局变量被隐藏。

这个也是一样。
Quote]当有局部变量的时候,在此代码作用域内,把全局变量覆盖。。。[/

#12


引用 9 楼 dreamwdy 的回复:
引用 7 楼 haolly 的回复:
引用 3 楼 jixingzhong 的回复:

全局变量和局部变量,同名的时候,全局变量被隐藏。

这个也是一样。



不是说单目作用域运算符::可以访问外层程序块中的全局变量嘛
我用改为:
::x=x;
::y=y;
之后为什么还不行?

::前面加个point看下

也不行

#1


楼主用的VC6吗,这是VC6的一个小bug~~~


void print(int x,int y)
    {
        this->x=x;                           // 这里的x和y难道不是Point类中的x和y??           
        this->y=y;                           //如果不是的话,那么printf()函数中的cout<<x<<endl<<y<<endl;中的x和y为什么会输出?
        //cout<<x<<endl<<y<<endl;
    }

这样就好了。

珍惜生命,远离VC6

#2


很显然,
  void print(int x,int y)
    {
        x=x;           
        y=y;                           
        //cout<<x<<endl<<y<<endl;
    }
这里的x和y, 都是print的参数x和y。

#3


全局变量和局部变量,同名的时候,全局变量被隐藏。

这个也是一样。

#4


引用楼主 haolly 的回复:
void print(int x,int y)
    {
        x=x;                           // 这里的x和y难道不是Point类中的x和y??           
        y=y;                           //如果不是的话,那么printf()函数中的cout<<x<<endl<<y<<endl;中的x和y为什么会输出?
        //cout<<x<<endl<<y<<endl;
    }


成员函数中的名称解析顺序是如下这样的:先找局部域,然后找类域,最后外部域直到全局域。

print的局部域里面已经存在x和y的名称了,当然先解析为print的两个形参。

#5


2L正解 变量名重复时 需要加this指针 指明左值为成员变量。

#6


引用 1 楼 peige2008 的回复:
楼主用的VC6吗,这是VC6的一个小bug~~~


void print(int x,int y)
    {
        this->x=x;                           // 这里的x和y难道不是Point类中的x和y??           
        this->y=y;                           //如果不是的话……


感觉这个不算BUG吧,楼主那个写法本来就是操作的函数局部变量中的X,Y???

#7


引用 3 楼 jixingzhong 的回复:
全局变量和局部变量,同名的时候,全局变量被隐藏。

这个也是一样。



不是说单目作用域运算符::可以访问外层程序块中的全局变量嘛
我用改为:
::x=x;
::y=y;
之后为什么还不行?

#8


学习了·····

#9


引用 7 楼 haolly 的回复:
引用 3 楼 jixingzhong 的回复:

全局变量和局部变量,同名的时候,全局变量被隐藏。

这个也是一样。



不是说单目作用域运算符::可以访问外层程序块中的全局变量嘛
我用改为:
::x=x;
::y=y;
之后为什么还不行?

::前面加个point看下

#10


    
void print(int x,int y)
    {
        x=x;                           // 这里的x和y难道不是Point类中的x和y??           
        y=y;                           //如果不是的话,那么printf()函数中的cout<<x<<endl<<y<<endl;中的x和y为什么会输出?
        //cout<<x<<endl<<y<<endl;
    }

是这样的 你这个方法的形参是x,y但是你里面保存的变量也是x,y 这样相当于重复声明了变量
这是时候编译器自动认为 这个{}里面的x,y 但是指形参的x,y 
这个x = x这个意思就是形参的x = 形参的x 但是我们想要的是外面的x
这个时候就前面加上个this. 意思是这个类的
this.x就是这个类的x 就可以完成楼主的要求了

#11


[Quote=引用 3 楼 jixingzhong 的回复:]

全局变量和局部变量,同名的时候,全局变量被隐藏。

这个也是一样。
Quote]当有局部变量的时候,在此代码作用域内,把全局变量覆盖。。。[/

#12


引用 9 楼 dreamwdy 的回复:
引用 7 楼 haolly 的回复:
引用 3 楼 jixingzhong 的回复:

全局变量和局部变量,同名的时候,全局变量被隐藏。

这个也是一样。



不是说单目作用域运算符::可以访问外层程序块中的全局变量嘛
我用改为:
::x=x;
::y=y;
之后为什么还不行?

::前面加个point看下

也不行