[英]C++ Operator Overloading and 'new' is working, but I'm not sure why/how
要完全理解我的查詢和混淆,請參閱第一個 TeamUp 函數,該函數使用 new Enemy(one+two) 聲明指向 Enemy 的指針 - 正如您將看到的,這些是引用先前創建的其他兩個 Enemy 對象的變量。
從本質上講,我將敵人加在一起以產生第三個,這將具有兩個父敵人的某些品質。
我已經為 Enemy 類重載了 .cpp 文件中的 + 運算符,如本文底部附近列出的那樣,但是我很難理解為什么在這行代碼中只創建了一個 Enemy 對象,因為我創建了一個指針然后分配'new Enemy' 然后一個對象(理論上)也從重載的運算符返回 '(one+two)'。 最初我很驚訝這有效,並想了解它為什么有效; 您將從我重載運算符的位置看到,除了(如我所想的)已經為指針創建的對象之外,我還返回了一個 Enemy 對象。 :
new Enemy(one+two)
我很想清楚這一點,因為我不明白它為什么起作用,並且我進一步研究了新的關鍵字和運算符重載,我不完全確定它為什么起作用,有人可以幫助解釋發生了什么在括號中(它是否充當構造函數/初始化器?),因為它似乎在調用重載的 operator+ 而不是構造函數(或者它同時在做兩者)。 並且更清楚為什么這不會創建兩個對象(即使最終會失敗)。
基本上,那些能幫助我解決這個問題的人會比我更了解我的要求。 很高興能像往常一樣進一步閱讀並重定向到某些材料。 感謝您的耐心等待。
重載的操作符代碼是:
Enemy operator+(Enemy& En, Enemy& En2)
{
//return En.strength + En2.strength; (other attempts / learning)
Enemy birthed;
birthed.strength = En.strength + En2.strength;
birthed.health = En.health + En2.health;
return birthed;
主要代碼
**
#include <iostream>
#include <vector>
#include "Enemy.h"
#include <string>
using std::cout;
//globals
std::vector<Enemy> Enemies;
void TeamUp(Enemy &one, Enemy &two, std::string name) {
Enemy* baby = new Enemy(one+two);
//*baby= one+two;
//baby->health = one + two;
baby->Name = name;
baby->Mum = one.Name;
baby->Dad = two.Name;
Enemies.push_back(*baby);
//std::cout << "babies str and health is " << baby->strength << " and " << baby->health << std::endl;
}
void TeamUp(Enemy &one, Enemy &two) {
Enemy *baby = new Enemy;
//baby->health = one + two;
baby->Mum = one.Name;
baby->Dad = two.Name;
Enemies.push_back(*baby);
//std::cout << "babies str and health is " << baby->strength << " and " << baby->health << std::endl;
}
int main() {
Enemy daddy("John");
Enemy mummy("Lisa");
daddy.info();
// std::cout << "babies str and health is " << baby.health << " " << baby.strength << std::endl;
TeamUp(mummy, daddy, "Ryan");
TeamUp(mummy, daddy, "Jeriel");
TeamUp(mummy, daddy);
TeamUp(mummy, daddy);
TeamUp(mummy, daddy);
TeamUp(mummy, Enemies[0]);
for (Enemy i: Enemies) {
i.info();
}
cout << Enemy::amount;
//std::cout<< "babies str and health is " << baby.health << " " << baby.strength;
}
這可能是因為您的編譯器非常優化。 這是您的operator+
:
Enemy operator+(Enemy& En, Enemy& En2)
{
//return En.strength + En2.strength; (other attempts / learning)
Enemy birthed;
birthed.strength = En.strength + En2.strength;
birthed.health = En.health + En2.health;
return birthed;
}
一個聰明的編譯器會看到永遠返回birthed。 因此,它在返回值所在的內存空間中創建了birthed,避免了構造函數。 到這一行:
Enemy* baby = new Enemy(one+two);
智能編譯器現在將執行以下兩項操作之一:
Enemy
的移動構造函數,然后調用new
。one+two
的結果放在分配內存的地方。如您所見,您的編譯器能夠避免使用兩個構造函數。
我希望我有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.