我正在练习不同的方法来为结构变量赋值。但当 我试过这个我得到一些垃圾价值。这是代码。
#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 ;
}
为什么我将垃圾值作为输出?
答案 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);
通过实施,有两个问题:
Distance
修改get_val
的本地副本。l
或m
。答案 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
对象只是l
和m
的副本,l
和m
都不会更新。
您想要做的是传递指向l
和m
的指针:
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的回答)。