2015-11-07 37 views
0

您好我來自爪哇其中以下是有效的:創建嵌入對象,並傳遞作爲參數

System.out.println(new String("Hello World")); 

是有C++相當於通過創建在構造的物體或指針,並將其傳遞作爲參數同時等。

heap.insert(new Food); 
+0

謝謝你們。在這個特定的例子中,我做了新的事情,因爲函數需要一個指針。如果將來任何人需要幫助下面的答案工作;但是,如果需要指針,則可以這樣完成。 myObject.insert((new Object2(parameters))); 如果新語句不在括號中,代碼將會失敗我不知道爲什麼,但它會。 – Rommeltrejo

回答

2

是的。例如,

std::vector<Food> c; 
c.emplace_back(constructor arguments for Food); 

通常情況下,最常見的情況是對象沒有作爲指針提供給方法。

如果heap.insert需要一個const引用:

void insert(const Food& val); 

那麼你可以用臨時的或現有的食品論據使用它,比如

heap.insert(Food{}); 

var auto foo = Food{constructor arguments}; 
heap.insert(foo); 
heap.insert(Food(constructor arguments)); 

或在某些情況下甚至

heap.insert({constructor arguments}); 
2

是的。你必須定義一個類,它的接受參數的構造函數,然後是一個接受該類的實例的函數,這就是全部。

最後,向類定義添加適當的拷貝構造函數或通過引用傳遞它。

它遵循一個例子:

struct S { 
    S(int x) { this->x = x; } 
    int x; 
}; 

void fn(S s) { } 
void cfn(const S &s) { } 

int main() { 
    fn(S{42}); 
    cfn(S{42}); 
} 

要知道,在這種情況下使用new是內存泄漏招致最簡單的方法之一,所以要注意!

2

你給的例子太簡單了。

cout << string("hello World"); 
// not necessary to contruct a string, but to show that it can be done on the spot 

heap.insert(Food()); // construct a Food on the spot... 

但在一般情況下,如果你談論的是匿名類和Java中類似的事情,C++有這個東西,它也有拉姆達的概念,它是非常強大的;)

+1

Java的Lambdas現在也得到 –

+0

@JohanLundberg很好,我沒有說Java沒有它們。在我看來,OP的問題的本質就是關於這些概念。答案是肯定的,我猜;) –

2
heap.insert(new Food); 
本身的

是有效的C++語法。它構造了一個新的Food類實例,並將其傳遞給堆的insert()方法。

但是,從Java轉換到C++時需要學習的關鍵基本差異在於,您的C++應用程序完全負責管理所有對象的生命週期。在Java中,你不需要考慮它。一旦某個對象不再被引用到任何地方,它就會被Java的垃圾回收器破壞。

C++使您負責管理每個對象的生命週期。無論何時您的應用程序不需要您在new操作員處構建的對象,應該是delete d,否則您將泄漏內存。

總結:

heap.insert(new Food); 

只是故事的一半。 new運算符將構造您的新類實例,並且您的heap對象的insert()方法可能以某種方式將指針存儲到新類實例中。某處,您將需要delete那個類實例,遲早。

2

如果函數參數是按值或通過const引用,並且您傳遞的類型可用於構造對象,則可以直接傳遞它。例如:

void print(const std::string& str); 

int main() 
{ 
    print("Hello world"); 
} 

std::string有一個構造,其可以接受字符串文字,因此,代碼編譯,創建臨時字符串對象,等同於:

print(std::string("Hello world")); 

如果構造需要多個參數,你可以直接在函數調用中創建一個臨時對象。例如:

void myfunc(const MyClass& c); 

myfunc(MyClass(param1, param2)); 

在Java中,新對象使用new創建。在C++中,new不是創建新對象所必需的,應該儘可能地避免,因爲這樣會更難避免內存泄漏。這是Java程序員最常犯的錯誤之一。

std::string text; 
MyClass c; 
c.do_something(); 

此代碼是完全有效的。 textc是有效的對象。

std::string *text = new std::string(); 
MyClass *c = new MyClass(); 
c->do_something(); 
delete text; 
delete c; 

此代碼也有效*。但是它需要更多的輸入,如果你忘記刪除它們,你會得到內存泄漏。

*編輯:其實它不是例外安全!所有更有理由避免new

相關問題