2012-10-25 50 views
2

有什麼差別,當我做函數調用在C++中,從該對象方法與指針和不 :C++通過指針或不進功能

void Main::Init() 
{ 
    Foo foo; 
    Obj obj; 
    Obj.someMethod(foo) // signeture : someMethod(Foo f) 
} 

這樣:

void Main::Init() 
{ 
    Foo* foo = new foo(); 
    Obj obj; 
    Obj.someMethod(foo) // signeture : someMethod(Foo* f) 
} 

UPDATE
or this:

void Main::Init() 
    { 
     Foo* foo = new foo(); 
     Obj obj; 
     Obj.someMethod(foo) // signeture : someMethod(Foo *& f) 
    } 

更推薦的是在內存和編譯器長期的更好的是什麼 在實際我沒有看到在這兩個我得到了我需要出去富

+4

代碼有問題:在第二個例子中,我認爲你希望'obj'是指針而不是'foo'。 – jogojapan

+1

不僅如此,在每個示例中,簽名都是錯誤的。 (我認爲你的電話裏有'foo'和'obj'混在一起)。 – Mankarse

+0

固定抱歉更新了示例 – user63898

回答

2
someMethod(Foo f) 

f通過實例傳遞的對象,即f成爲實際參數foo副本傳入函數。對f所做的任何修改someMethod都不會改變foo

通常,通過常量引用someMethod(const Foo& f)來傳遞f會更有效。因此,將避免複製,並且在someMethod中調用非常量方法f會導致編譯器錯誤。

someMethod(Foo *f) 

f一個指向對象。假設實際參數foo已初始化(與您的示例不同),則由someMethod所做的任何修改f指向的對象實際上將應用於foo指向的對象。

someMethod(Foo *& f) 

f的指針的引用的對象。這通常用於聲明指針類型的輸出參數。例如:

void someMethod(Foo *& f) 
{ 
    f = new Foo(); 
} 

作爲f是實際參數Foo* foo一個參考,new Foo結果被分配給foo在功能上退出。

+0

固定,如果我只想得到 f對象中的信息,我可以使用第一種方法嗎? 在內存方面的? – user63898

+0

@ user63898:既不,請參閱更新的答案 – Andrey

2

的第一代碼不編譯任何差異。

在第二個片段中,foo是一個指針,而obj是一個對象。當它期待Foo*對象時,您正在調用foo.someMethod(obj)。與第一個片段一樣。

從我看到你的意思是:

obj.someMethod(foo);

說明:

在第一個片段

foo是一個對象。該對象作爲COPY傳遞給someMethod函數(按值調用)。在someMethod中對foo所做的更改不會反映在Main::Init()foo中。

在第二個片段中,foo作爲指向對象的指針發送。它被稱爲「參考呼叫」。的foo地址將被髮送到someMethod,以便它可以修改對象或做用它的東西