读书人

形参加实参的传递

发布时间: 2013-09-06 10:17:17 作者: rapoo

形参与实参的传递
形参加实参的传递
这个程序里input()不是无返回的函数么,那形参应该不影响实参的,为什么结果是10,,10呢?
形参加实参的传递
为什么这样改的话就又变成5,5了呢?实在搞不明白,虚心求解!
[解决办法]
形参影不影响实参,不是根据函数有没有返回值来判断的。根据具体的变量作用域来判断。
首先x和y是类point的成员,在类中相当于是全局变量。第一段代码中
void input(int a,int b)
{
x = a;
y = b;
}
出了这个大括号范围,因为x和y是在这组大括号之外定义的,所以出了这组大括号依然存在,在类中可以使用,所以输出10和10。
第二段代码中
void input(int x,int y)
{
x = x;
y = y;
}
从输出结果来看,说明类的成员变量x和y并没有被赋上值,因为局部变量有最高的优先级,这个函数的=左边的x不是类的成员变量的x,而是void input(int x,int y)里面的x,出了大括号之后失去生命周期。相当于{int x;x=x;}

不知道你明白没有?
[解决办法]

引用:

我的意思是,input这么写的话,编译器就这么理解,没有用形参到x,而是直接把成员变量的x和y赋值给自身了,结果自然是5 和5 。不知理解否?

编译器是就近原则,如果在一个嵌套的作用域里变量和上层变量同名,就会用最里面那层的...
简单来说,你这个例子,除非你指明this->x,不然都是函数里的x,跟成员变量无关

就是x=x,两个都是形参而不是你说的this->x=this->x 不信你改成x=x+1试试,肯定没变化
[解决办法]
对于class作用域,成员变量都有this指针,前一种情况,this.x=a;this.y=y,改变了成员变量,当output的时候,cout<<this.x<<" "<<this.y,就是10,10,
后种情况是作用域的问题,局部变量会屏蔽类作用域内的成员变量,因此
void input(int x,int y)
{
x = x;
y = y;
}


只是改变局部变量,也就是函数参数的值,并未改变类成员变量的值,因此调用类成员函数,output时候还是5,5
[解决办法]
引用:
那是不是只要是形参和实参是同一名字,函数里的就都是形参之间的运算?

跟实参没有任何关系,变量生存有自己的作用域,只要在这个作用域里存在这个名字的变量,就是用这个变量,如果没有就到上一层(嵌套它的外层)去找相应的变量,一层层上去,直到找到对应变量为止,如果不存在编译器就报错

读书人网 >C++

热点推荐