c++中构造函数 、析构函数的作用域详解
我們知道,在c++中,析構函數是在函數作用域尾部執行析構函數,從而釋放對象,但是有一種情況下,析構函數作用域發生變化,請看下面的例子,定義了一個Stock類,Stock類存放在stock.h中,主調用函數在stock.cpp中。
stock.h
1 #include <iostream> 2 #include <string.h> 3 class Stock{ 4 private: 5 char m_company[30]; 6 int m_stock_num; 7 float m_stock_price; 8 float total_price; 9 float stock_sum(){total_price= m_stock_num*m_stock_price;} 10 11 public: 12 int get_stock(char *company,int stock_num,float stock_price); 13 void increase(int num,float price); 14 void sell(int num,float price); 15 void update_price(float price); 16 void print_stock_info(); 17 friend Stock plus1(int stock_num,Stock t); 18 Stock operator+(Stock t); 19 Stock(char *p,int num,float price); 20 Stock(); 21 ~Stock(); 22 }; 23 24 Stock::Stock(char *company,int stock_num,float stock_price) 25 { 26 int len=strlen(company); 27 strncpy(m_company,company,len+1); 28 m_stock_num=stock_num; 29 m_stock_price=stock_price; 30 stock_sum(); 31 32 } 33 34 Stock::Stock() 35 { 36 m_stock_num=0; 37 m_stock_price=0; 38 stock_sum(); 39 std::cout<<"hello boy"<<std::endl; 40 } 41 42 Stock::~Stock() 43 { 44 std::cout<<"good bye"<<std::endl; 45 46 } 47 48 Stock plus1(int stock_num,Stock t) 49 { 50 Stock total; 51 total.m_stock_num=stock_num+t.m_stock_num; 52 return total; 53 54 } 55 56 57 inline Stock Stock::operator+(Stock t) 58 { 59 Stock total; 60 total.m_stock_num=m_stock_num+t.m_stock_num; 61 total.total_price=total_price+t.total_price; 62 return total; 63 } 64 65 inline int Stock::get_stock(char * company,int stock_num,float stock_price) 66 { 67 int len=strlen(company); 68 if (len>30) 69 return false; 70 strncpy(m_company,company,len+1); 71 m_stock_num=stock_num; 72 m_stock_price=stock_price; 73 stock_sum(); 74 return true; 75 } 76 77 void Stock::increase(int num,float price) 78 { 79 m_stock_num=m_stock_num+num; 80 m_stock_price=price; 81 stock_sum(); 82 } 83 84 void Stock::sell(int num,float price) 85 { 86 if(num>m_stock_num) 87 m_stock_num=0; 88 else 89 m_stock_num=m_stock_num-num; 90 91 m_stock_price=price; 92 stock_sum(); 93 } 94 void Stock::update_price(float price) 95 { 96 m_stock_price=price; 97 98 } 99 void Stock::print_stock_info() 100 { 101 std::cout<<m_stock_num<<std::endl; 102 std::cout<<total_price<<std::endl; 103 }stock.cpp
1 #include "stock.h" 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 int main() 6 { 7 char *p; 8 p=new char[100]; 9 strcpy(p,"baidu"); 10 Stock object[4]; 11 object[0].get_stock(p,100,2.3); 12 object[1].get_stock(p,100,2.3); 13 object[2]=object[0]+object[1]; 14 object[2].print_stock_info(); 15 object[3]=plus1(100,object[2]); 16 object[3].print_stock_info(); 17 return true; 18 19 }可以看到我們聲明友元函數plus1后,將object[2]對象通過構造函數傳遞到友元中,此時友元函數中先調用拷貝構造函數接受參數,然后調用 默認構造函數形成局部total對象,在我們完成加的動作之后,對象要返回,此時調用析構函數,但若此時我們采用引用的返回值方式?Stock &plus1(int stock_num,Stock t)?,調用同樣成功,但對象被銷毀了,為什么還可以被引用 ?而繼續使用。我們來看一下兩種返回方式的結果:
返回對象,
返回對象引用,
此時編譯器應該是做過優化,因為函數的作用域結尾處,應該調用過析構函數了(從圖中可以看出來,調用了5次構造函數,6次析構函數,有一次復制構造函數),所以析構 函數肯定是被執行了,但是編譯器作過優化處理,使得對象依舊可以被傳遞,此時編譯器會給出警告提示。但是在1個函數中,我們可以返回1個在函數調用結束不會被釋放的對象的引用。比如外部傳入的對象,比如函數所屬類的成員變量等。而返回局部變量(對象引用)是很危險的,但是返回對象則是可以的,因為返因對象時會調用復制構造函數、然后才是析構函數。如果我們plus1調用傳遞的是引用時,此時結果為
,不會調用復制構造函數。當改為值傳遞后,復制構造函數又被重新調用,
?
轉載于:https://www.cnblogs.com/hitwhhw09/p/4629783.html
總結
以上是生活随笔為你收集整理的c++中构造函数 、析构函数的作用域详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: maven发碰到的问题
- 下一篇: js:进一步关闭(范围:下一个)