2013-08-22 199 views
2
#include <iostream> 
using namespace std; 

class A 
{ 
    int n; 
public: 
    A() 
    { 
     cout << "Constructor called" << endl; 
    } 
    ~A() 
    { 
     cout << "Destructor called" << endl; 
    } 
}; 

int main() 
{ 
    A a;   //Constructor called 
    A b = a;  //Constructor not called 
    return 0; 
} 

輸出:解釋這個C++代碼

Constructor called 
Destructor called 
Destructor called 

構造函數被調用一次,而析構函數被調用兩次 這到底是怎麼happning?這是不確定的行爲?

回答

3

在片段

A b = a

你是不是叫你的構造,但生成的拷貝構造函數:

class A 
{ 
    int n; 
public: 
    A() 
    { 
     cout << "Constructor called" << endl; 
    } 
    A(const A& rv) 
    { 
     cout << "Copy constructor called" << endl; 
     // If you are not using default copy constructor, you need 
     // to copy fields by yourself. 
     this->n = rv.n; 
    } 
    ~A() 
    { 
     cout << "Destructor called" << endl; 
    } 
}; 
0

創建了對象A的兩個實例。一個是由構造函數創建的,另一個是由複製構造函數創建的。由於你沒有明確定義一個,所以編譯器爲你做了工作。

一旦應用程序退出,由於有兩個對象,析構函數方法被調用兩次。

+1

它不是'運營商=' –

+1

它不是賦值運算符,它與'運算符='相同, –

0

A b = a => A b(a)=>這將調用該類的默認拷貝構造函數。