您好我來自爪哇其中以下是有效的:創建嵌入對象,並傳遞作爲參數
System.out.println(new String("Hello World"));
是有C++相當於通過創建在構造的物體或指針,並將其傳遞作爲參數同時等。
heap.insert(new Food);
您好我來自爪哇其中以下是有效的:創建嵌入對象,並傳遞作爲參數
System.out.println(new String("Hello World"));
是有C++相當於通過創建在構造的物體或指針,並將其傳遞作爲參數同時等。
heap.insert(new Food);
是的。例如,
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});
是的。你必須定義一個類,它的接受參數的構造函數,然後是一個接受該類的實例的函數,這就是全部。
最後,向類定義添加適當的拷貝構造函數或通過引用傳遞它。
它遵循一個例子:
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
是內存泄漏招致最簡單的方法之一,所以要注意!
你給的例子太簡單了。
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++有這個東西,它也有拉姆達的概念,它是非常強大的;)
Java的Lambdas現在也得到 –
@JohanLundberg很好,我沒有說Java沒有它們。在我看來,OP的問題的本質就是關於這些概念。答案是肯定的,我猜;) –
heap.insert(new Food);
本身的
是有效的C++語法。它構造了一個新的Food
類實例,並將其傳遞給堆的insert()方法。
但是,從Java轉換到C++時需要學習的關鍵基本差異在於,您的C++應用程序完全負責管理所有對象的生命週期。在Java中,你不需要考慮它。一旦某個對象不再被引用到任何地方,它就會被Java的垃圾回收器破壞。
C++使您負責管理每個對象的生命週期。無論何時您的應用程序不需要您在new
操作員處構建的對象,應該是delete
d,否則您將泄漏內存。
總結:
heap.insert(new Food);
只是故事的一半。 new
運算符將構造您的新類實例,並且您的heap
對象的insert()方法可能以某種方式將指針存儲到新類實例中。某處,您將需要delete
那個類實例,遲早。
如果函數參數是按值或通過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();
此代碼是完全有效的。 text
和c
是有效的對象。
std::string *text = new std::string();
MyClass *c = new MyClass();
c->do_something();
delete text;
delete c;
此代碼也有效*。但是它需要更多的輸入,如果你忘記刪除它們,你會得到內存泄漏。
*編輯:其實它不是例外安全!所有更有理由避免new
!
謝謝你們。在這個特定的例子中,我做了新的事情,因爲函數需要一個指針。如果將來任何人需要幫助下面的答案工作;但是,如果需要指針,則可以這樣完成。 myObject.insert((new Object2(parameters))); 如果新語句不在括號中,代碼將會失敗我不知道爲什麼,但它會。 – Rommeltrejo