将结构传递给函数

Tas*_*man 9 c++ structure function

我正在练习不同的方法来为结构变量赋值.但是,当我尝试这个时,我得到了一些垃圾价值.这是代码.

#include<iostream>
using namespace std ;

struct Distance{
    int feet ;
    int inches;
};

void get_val(Distance );               
void disp(Distance);

int main(){

    Distance l, m ;                   //Objects 
    get_val(l);
    get_val(m);
    disp(l);
    disp(m);
    return 0  ;
}

void get_val(Distance length){
    cout<<"\nEnter Length "
        <<"\nFeet  : ";
    cin>>length.feet;
    cout<<"\nInches : ";
    cin>>length.inches;
}
void disp(Distance length){
    cout<<"\nLength : \n"
        <<"Feet : "<<length.feet
        <<"\nInches : "<<length.inches ;
}
Run Code Online (Sandbox Code Playgroud)

为什么我将垃圾值作为输出?

小智 9

通过引用传递它们.

void get_val(Distance&);


void get_val(Distance &length){}
Run Code Online (Sandbox Code Playgroud)

您在另一个函数中更改main函数中创建的结构的值,因此您必须通过引用或使用指针传递它们.

编辑:

感谢Benjamin Lindley.

  • `get_val`函数应该通过引用来获取它们.`disp`函数应该通过值或const引用来获取它们. (3认同)

Cav*_*ler 8

到目前为止的评论告诉你该怎么做,但似乎没有找到你需要这样做的原因.

在C++(以及C)中,当您将数据传递给函数时,它会复制该函数的本地数据 - 它不是原始数据!更不用说它占用了内存并为执行时间增加了一点时间(尽管在你进入更大的结构之前无关紧要).

因此,解决方案是传递数据的内存位置 - 对它的引用.引用被"复制",因为它只占用位置(可能是一个size_t或某个可能代表内存中位置的东西)并复制它,但使用该位置来"引用"实际数据.它消除了复制过程中的一些开销,允许您修改原始数据.

在C中,您将使用指针而不是引用,在C++中,使用引用通常是有利的(因为它意味着您传递的内容已经初始化而不会进行段错误).您可能已经看过语法并且已经使用过它,但我在这里复制它是为了冗余:

void get_val(Distance&);
void disp(const Distance&);
//...


void get_val(Distance& length){
    cout<<"\nEnter Length "
        <<"\nFeet  : ";
    cin>>length.feet;
    cout<<"\nInches : ";
    cin>>length.inches;
}

void disp(const Distance& length){
    cout<<"\nLength : \n"
        <<"Feet : "<<length.feet
        <<"\nInches : "<<length.inches ;
}
Run Code Online (Sandbox Code Playgroud)

您可以像常规变量一样使用引用(作为提示,变量本身就是一种引用!您以相同的方式调用函数 - get_val(l);disp(l);.)const引用只是一个您无法更改的引用.通常,您将它们用于只读取值而不执行任何其他操作的函数.

  • 您描述引用的方式听起来就像它们的实现方式.但请注意,正式地,引用是对象的别名.这个对象甚至可能是一个右值,所以"地址"类比就会崩溃.编译器可能能够为引用和指针执行不同的优化集. (3认同)

R S*_*ahu 5

您需要通过引用传递Distanceget_val.然后签名get_val需要

void get_val(Distance& length);
Run Code Online (Sandbox Code Playgroud)

有了实现,有两个问题:

  1. 您正在修改的本地副本Distanceget_val.
  2. 你还没有初始化lm.


Ed *_*eal 5

使用传递引用(使用const)即

void get_val(Distance &length)
void disp(const Distance &length){
Run Code Online (Sandbox Code Playgroud)