将结构传递给函数

时间:2014-08-17 07:20:21

标签: c++ function structure

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

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

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

6 个答案:

答案 0 :(得分:9)

通过引用传递它们。

void get_val(Distance&);


void get_val(Distance &length){}

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

编辑:

感谢Benjamin Lindley。

答案 1 :(得分: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 ;
}

您使用引用就像常规变量一样(并且作为提示,变量本身就是一种引用!您以相同的方式调用函数 - get_val(l);disp(l);。)A { {1}}引用只是一个你无法改变的引用。通常你会将它们用于只读取值而不做其他任何事情的函数。

答案 2 :(得分:5)

您需要通过引用将Distance传递给get_val。然后get_val的签名需要

void get_val(Distance& length);

通过实施,有两个问题:

  1. 您正在Distance修改get_val的本地副本。
  2. 您尚未初始化lm

答案 3 :(得分:5)

使用pass by reference(使用const) 即。

void get_val(Distance &length)
void disp(const Distance &length){

答案 4 :(得分:3)

您应该通过引用传递结构对象。使用:

get_val (Distance& l);

在你的情况下,对象按值传递。因此,当您调用函数get_val (Distance l)时,该值将存储在l的成员变量中,但是当控件返回到main时,您存储的值不会被反映,因为它们存储在“复制“对象而非实际对象。

使用引用有一些优点,但绝对突出的是它可以防止创建对象的新副本,并减少调用复制构造函数的开销并减少内存占用。其次,你可以修改原始对象。

答案 5 :(得分:1)

当您以这种方式通过时,您只需传递Distance的副本。因此,Distance中的get_val对象只是lm的副本,lm都不会更新。

您想要做的是传递指向lm的指针:

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

然后这样称呼:

get_val(&l);
get_val(&m);

或者写出要通过引用传递的函数(参见R Sahu的回答)。