[英]Function returning unexpected struct values
我是結構和用戶定義的數據類型的新手,我試圖創建一個返回結構的函數:
評論突出了問題:
#include <iostream>
using namespace std;
struct num {
int n[2];
};
num func( num x, int a, int b) {
x.n[0] = a+b;
x.n[1] = a*b;
return x;
}
int main() {
int x,y;
num s1;
cout << "enter: ";
cin >> x >> y;
func(s1,x,y);
cout << s1.n[0] << "\n" << s1.n[1]; // THIS GIVES ERROR
cout << func(s1,x,y).n[0] << "\n" << func(s1,x,y).n[1]; // THIS DOENST GIVE ERROR
return 0;
}
我理解第二種方法有意義並返回struct變量。 然后放一個點來解決struct的內部變量。
但我不明白為什么第一種方法失敗 ,或給出奇數輸出。 該函數已完成其工作,即使s1.n[0] = x + y
和s1.n[1] = x*y
現在,打印s1.n[0]
應該只打印x + y
。 我們如何檢查和糾正函數的內部工作原理?
您必須將返回的值分配給main中的結構對象
s1 = func(s1,x,y);
在體內,該函數處理原始對象的副本。 它不會更改原始對象,因為它是按值傳遞的。
另一種方法是通過引用傳遞結構
void func( num &x, int a, int b) {
x.n[0] = a+b;
x.n[1] = a*b;
}
在這種情況下,你可以寫
func(s1,x,y);
或者你可以使用甚至所謂的C方法通過引用傳遞
void func( num *x, int a, int b) {
x->n[0] = a+b;
x->n[1] = a*b;
}
並稱之為
func( &s1, x, y );
至於這個說法
cout << func(s1,x,y).n[0] << "\n" << func(s1,x,y).n[1];
然后您訪問由函數的兩次調用返回的兩個臨時對象的數據成員。 執行此語句后,將刪除這些臨時對象。
看起來你永遠不會分配func()
的返回值。 您的函數返回結構,但您永遠不會分配它。 要解決這個問題,你應該能夠簡單地說: s1 = func(s1,x,y);
這會將結構的修改版本分配給s1變量。
或者,您可以重寫func()
以接受指向結構的指針。 這將允許您修改結構而不必返回它:
void func( num *x, int a, int b) {
x->n[0] = a+b;
x->n[1] = a*b;
}
然后你只需要調用func()
來調用: func(&s1, x, y);
您沒有通過引用傳遞結構,因此結果。 請嘗試以下方法:
void func(num &x, int a, int b) {
x.n[0] = a+b;
x.n[1] = a*b;
}
由於你的結構是通過引用傳遞的,所以函數不需要返回任何內容,無論如何它都會被更改。 虛空會更合適。
這是因為您已經按值傳遞了結構,而您的意圖看起來像是要通過引用傳遞。 查看此鏈接: http : //courses.washington.edu/css342/zander/css332/passby.html
num func( num &x, int a, int b)
應該解決你的問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.