簡體   English   中英

C++ 運算符重載和“新”正在工作,但我不確定為什么/如何

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM