2012-11-18 72 views
0

我正在學習C++中的結構類型,並試圖編寫一個函數來改變結構類型變量的成員值。 但是,它產生了意想不到的輸出,我無法弄清楚爲什麼會發生這種情況。 /程序來測試結構類型/使用函數操作結構數據類型的值

#include <iostream> 
#include <cstring> 
using namespace std; 
struct myStruct 
{ 
    string a; 
    string b; 
    int c; 
    float d; 
}; 

void assignValues(myStruct myobj) 
{ 
    myobj.a = "foobar"; 
    myobj.b = "Foo Bar"; 
    myobj.c = 12; 
    myobj.d = 15.223; 
} 
int main() 
{ 
    myStruct x; 
    cout << x.a <<endl; 
    //x.a = "Hello world"; 
    //x.b = "This is C++"; 
    //x.c = 10; 
    //x.d = 13.1332; 
    assignValues(x); 
    cout << x.a<<endl; 
    cout << x.b << endl; 
    cout << x.c << endl; 
    cout << x.d << endl; 
} 

如果我使用單獨的賦值語句,(我已經在代碼中註釋掉),而不是assignValues()函數,我得到預期的輸出。

PS:是我預期的輸出的值如下所示: foobar的, 富酒吧, 12, 15.223

+1

通過引用傳遞!您正在傳遞值,它基本上將結構對象的副本傳遞給函數,函數將修改副本而不是原始對象。原始對象仍具有不確定值,因爲該對象從未初始化過。 –

+0

我如何'通過參考'? – mahela007

回答

3

通行證MYSTRUCT參數通過參考assignValue功能,所以它可以被修改:

void assignValues(myStruct& myobj) 
         ^^^ pass by reference 
{ 
    myobj.a = "foobar"; 
    myobj.b = "Foo Bar"; 
    myobj.c = 12; 
    myobj.d = 15.223; 
} 
+0

謝謝..與Als發表的評論一起,這篇文章告訴我我需要知道什麼。 – mahela007

0

雖然你可以通過一個函數指針:

void assignValues(myStruct* myobj) //<---- pointer 
{ 
    myobj->a = "foobar"; 
    myobj->b = "Foo Bar"; 
    myobj->c = 12; 
    myobj->d = 15.223; 
} 
+1

你可以,但通常不推薦。除其他外,指針可以爲空。這不會引用。 –

+0

O真的嗎?當然,它們可以是空的,壞的等等。這只是修改數據的另一種方式,不是嗎?或者今天沒有人使用指針? –