#include <iostream>
using namespace std;
class human{
public:
human();
human(const human&);
static int human_num;
~human();
void print();
};
int human::human_num = 0;
human::human(){
human_num++;
print();
}
human::human(const human& rhs){
human_num++;
print();
}
human::~human(){
human_num--;
print();
}
human f1(human x)
{
return x;
}
void human::print(){
cout <<"human num is: " <<human_num <<endl;
}
int main(int argc, char* argv[]){
human h1;
human h2=f1(h1);//這里理解不了
return 0;
}
human h2=f1(h1)//這里為什么會2次呼叫human::human(const human& rhs)
我以為是這樣:
先創建human h2這個物件(呼叫默認建構式)
然后再創建human f1這個物件函式(呼叫一般建構式)
再接著創建human x這個物件(呼叫默認建構式)
為什么系統卻是這樣呼叫,能不能大致講下c++是怎么創建這個程序
uj5u.com熱心網友回復:
你的理解有錯誤兩次拷貝構造是,h1傳入f,將發生一次拷貝構造。構造出x,
human h2=f1(h1);//這里呼叫第二次拷貝構造,構造出h2
uj5u.com熱心網友回復:
樓主不知道函式呼叫是怎么傳引數的嗎?第一次呼叫,是實參到形參的拷貝(也就是main堆疊的h1拷貝到f1堆疊的h1)
第二次拷貝,是f1的回傳值拷貝到h2
uj5u.com熱心網友回復:
這里涉及傳參的步驟:拷貝函式的作用就是傳參時候使用的h1→X,X→h2uj5u.com熱心網友回復:
human h2=f1(h1)第一次是函式引數的拷貝,呼叫拷貝建構式
第二次是h2初始化,呼叫拷貝建構式,不呼叫賦值函式
human h2 (h1);呼叫拷貝建構式
human h2;
h2=h1; 呼叫賦值函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/20738.html
標籤:新手樂園
上一篇:關于C語言陣列和指標有個問題
