2014-02-09 305 views
-1
#include <iostream> 

class My 
{ 
public: 
    My(int &val) : m_val(val) 
    { 
     std::cout << "int& constructor" << std::endl; 
     Print(); 
    } 
    My(const My& my) : m_val(my.m_val) 
    { 
     std::cout << "copy constructor" << std::endl; 
     Print(); 
    } 
    My &operator=(const My&) 
    { 
     std::cout << "operator =" << std::endl; 
     Print(); 
     return *this; 
    } 

    void Print() 
    { 
     std::cout << "m_val ptr = " << &m_val << std::endl; 
     std::cout << "m_val  = " << m_val << std::endl; 
    } 

    int &m_val; 
}; 

int main() { 
    My my = my; 
    return 0; 
} 

這個C++代碼是否正確?當這段代碼在gcc和msvc上編譯時,我感到很驚訝。這一計劃的這個C++代碼是否正確?

輸出是:

拷貝構造函數

m_val PTR = 0xb74a36e5

m_val = 1528349827

UPD:我關心的線

My my = my; 
+1

你爲什麼要問?有關它的事情會讓你覺得它*不是*? – 0x499602D2

+0

你是什麼意思,「正確」?編譯並運行的代碼並不意味着它是「正確的」...'system('rm -rf /')'會編譯/執行「correctLy」,但並不是很多人會認爲這是一個「正確」的程序。 –

+0

我想你需要一個預導師 –

回答

6

從正確的角度來看它是正確的,所以它編譯。名稱的範圍在聲明後立即開始,因此可以在其自己的初始化程序中使用變量名稱。

在使用未初始化的對象值的未定義行爲的意義上,這是不正確的。