函数通过值传递和变量参传递的有关问题
函数通过值传递和变量参传递的问题
------解决思路----------------------
这里需要分清编译跟运行,首先编译只是检查你程序中显式的错误,对于一些隐式的错误很明显是检查不出来的,毕竟编译器不是万能的;运行期,比如某些类或结构体的对象是在程序运行的时候才会被实例化,所以编译的时候是不会报错的
#include <iostream>
#include <string>
using namespace std;
struct free_throws
{
string name;
int made;
int attemp;
float percent;
};
free_throws & set_0(free_throws &);
free_throws set_1(free_throws);
double set_2(double);
int main()
{
free_throws one={"abc",13,14};
free_throws two={"def",32,12,23.4};
set_0(one)=two;//通过。这里我可以理解,set_0返回变量参,所以其实是 one=two
set_1(one)=two;//通过。这里无法理解了,set_1参数通过值传递返回的也是free_throws值而不是变量参,也就是set_1是对于one的一个copy在操作。那它返回的到底是那个 free_throws型的copy变量,还是仅仅是一个free_throws型的值。如果是个值,对这个值赋值怎么会通过。如果是那个set_1函数中的copy变量,那么有什么方法调用那个copy变量?
return 0;
}
free_throws & set_0(free_throws& a)
{
if (a.attemp!=0) {
a.percent=100.0f*float(a.made)/float(a.attemp);
}else
a.percent=0;
return a;
}
free_throws set_1(free_throws a)
{
if (a.attemp!=0) {
a.percent=100.0f*float(a.made)/float(a.attemp);
}else
a.percent=0;
return a;
}
------解决思路----------------------
这里需要分清编译跟运行,首先编译只是检查你程序中显式的错误,对于一些隐式的错误很明显是检查不出来的,毕竟编译器不是万能的;运行期,比如某些类或结构体的对象是在程序运行的时候才会被实例化,所以编译的时候是不会报错的