函数通过值传递和变量参传递的有关问题

函数通过值传递和变量参传递的问题

#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;
}




------解决思路----------------------
这里需要分清编译跟运行,首先编译只是检查你程序中显式的错误,对于一些隐式的错误很明显是检查不出来的,毕竟编译器不是万能的;运行期,比如某些类或结构体的对象是在程序运行的时候才会被实例化,所以编译的时候是不会报错的