2015-07-19 55 views
0

所以基本上我正在從本書中學習遊戲編程,目前我正在解釋數據成員是指向存儲對象的指針的位置在堆上。然後執行一些成員函數,如銷燬/複製或分配給另一個對象。我的功能如何連接到正確的成員函數

所以基本上我想明白的是,當我打電話三種功能「testDestructor()‘/’testCopyConstructor(Critter aCopy)」和「testAssignmentOp()」會自動將正確的成員函數,這聽起來很傻,但除非我誤解的東西,我沒有看到這本書解釋了每種功能如何去正確的成員功能。

我不知道它的晚上11點30分,也許我的大腦已經融化了,但我已經重讀了整個(幾頁)關於程序中發生了三次最新情況的詳細解釋,而且我無法做出正面或反面的如何它正確地使用正確的成員函數沒有某種「連接」?也許我錯過了一些基本的東西。

PS我明白了什麼是與代碼本身發生的事情,我只是不知道如何函數調用正確的成員函數

/Heap Data Member 
//Demonstrates an object with a dynamically allocated data member 

#include <iostream> 
#include <string> 

using namespace std; 

class Critter 
{ 
public: 
Critter(const string& name = "", int age = 0); 
~Critter();     //destructor prototype 
Critter(const Critter& c); //copy constructor prototype 
Critter& Critter::operator=(const Critter& c); //overloaded assignment op 
void Greet() const; 

private: 
string* m_pName; 
int m_Age; 
}; 

Critter::Critter(const string& name, int age) 
{ 
cout << "Constructor called\n"; 
m_pName = new string(name); 
m_Age = age; 
} 

Critter::~Critter()      //destructor definition 
{ 
    cout << "Destructor called\n"; 
    delete m_pName; 
} 

Critter::Critter(const Critter& c)  //copy constructor definition 
{ 
    cout << "Copy Constructor called\n"; 
    m_pName = new string(*(c.m_pName)); 
    m_Age = c.m_Age; 
} 

Critter& Critter::operator=(const Critter& c) //overloaded assignment op def 
{ 
    cout << "Overloaded Assignment Operator called\n"; 
    if (this != &c) 
    { 
     delete m_pName; 
     m_pName = new string(*(c.m_pName)); 
     m_Age = c.m_Age; 
    } 
    return *this; 
} 

void Critter::Greet() const 
{ 
    cout << "I'm " << *m_pName << " and I'm " << m_Age << " years old. "; 
    cout << "&m_pName: " << cout << &m_pName << endl; 
} 

void testDestructor(); 
void testCopyConstructor(Critter aCopy); 
void testAssignmentOp(); 

int main() 
{ 
    testDestructor(); 
    cout << endl; 

    Critter crit("Poochie", 5); 
    crit.Greet(); 
    testCopyConstructor(crit); 
    crit.Greet(); 
    cout << endl; 

    testAssignmentOp(); 

    return 0; 
} 

void testDestructor() 
{ 
    Critter toDestroy("Rover", 3); 
    toDestroy.Greet(); 
} 

void testCopyConstructor(Critter aCopy) 
{ 
    aCopy.Greet(); 
} 

void testAssignmentOp() 
{ 
    Critter crit1("crit1", 7); 
    Critter crit2("crit2", 9); 
    crit1 = crit2; 
    crit1.Greet(); 
    crit2.Greet(); 
    cout << endl; 

    Critter crit3("crit", 11); 
    crit3 = crit3; 
    crit3.Greet(); 
} 
+0

「數據成員是指向對象存儲在堆上的指針」笏 – Barry

+0

也許我應該有寫爲「我正在使用的數據成員是指向存儲在堆中的對象的指針」。 – Collwyr

回答

2

我不完全相信你的要求,但是:

分配,當你在表達式中使用=操作被調用,如在你的代碼:

crit1 = crit2; 
crit3 = crit3; 

不要與在聲明中使用=符號混淆(無論如何你都不會這樣做)。

當您嘗試創建一個對象構造被調用,如:

Critter crit2("crit1", 7); // constructor 

,其他線路可能看起來像:

Critter crit4;    // default constructor 
Critter crit5(crit3);  // copy-constructor 

如果一個構造函數有一個說法,是另一種它是相同類型的對象,它被稱爲複製構造函數。這只是一個術語,複製構造函數和其他構造函數之間沒有更多的根本區別。

在您的功能void testCopyConstructor(Critter aCopy)中,您可以看到它有一個參數Critter aCopy。當你傳遞參數crit的功能,它就像你創建一個使用函數參數的參數:

Critter aCopy(crit); // equivalent 

所以調用這個函數會使用它的拷貝構造函數初始化aCopy

每當一個本地對象超出範圍甲析構函數被調用,因此,當在testDestructor結束時達到的},則對象toDestroy被破壞。

+0

噢好吧,我明白你現在在說什麼,以及每個函數如何調用正確的構造函數,對不起,當我讀這本書時,它錯過了這一步,解釋了這一點,所以當每個構造函數被正確調用時,我不知道如何它是這樣做的 我認爲我錯誤理解正確的是這些是編譯器在你不創建自己的時候所做的自然事情,所以我從來沒有真正知道我的代碼中的這些實例調用這些構造函數,如代碼中所示,所以當我完成這件事時,顯示它對我來說毫無意義 感謝您爲我解釋簡單 – Collwyr

0

什麼,我想了解的是,當我打電話三種功能「testDestructor()」 /「testCopyConstructor(小動物ACOPY)」和「testAssignmentOp()」怎麼回事,它會自動將正確的成員函數,這可能聽起來很愚蠢,但除非我誤讀了某些東西,否則我沒有看到這本書解釋了每個函數是如何進入正確的成員函數的。

實例(非static)成員函數總是通過一個隱藏指針作爲第一個參數 - 在類中明確地提供的名稱this下 - 這指的是目標對象。這意味着,當在類(對象)的任何實例上調用成員函數時,對成員變量的任何範圍內引用將通過指針定位到this實例。

(這有據可查的,並沒有真的需要一個新的問題。希望你的書提到它在別處!)