国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++中構造函數居然是可以直接調用的

2019-11-06 07:14:00
字體:
來源:轉載
供稿:網友

代碼如下

#include <iostream>class A{public: A():a(0),b(0){std::cout<<"調用第一個構造函數"<<std::endl;} A(int x):a(x),b(x+1){std::cout<<"調用第二個構造函數"<<std::endl;} ~A(){std::cout<<"調用析構函數"<<std::endl;} int geta(){ return a; } int getb(){ return b; }PRivate: int a; int b;};int main(){ A test; test = A(5); std::cout<<test.geta()<<std::endl; std::cout<<test.getb()<<std::endl; return 0;}

經過編譯和運行之后,結果如下:

調用第一個構造函數 調用第二個構造函數 調用析構函數 5 6 調用析構函數

首先要知道: 一、C++編譯器可以在沒有拷貝構造函數和Operator=這兩個函數的時候可以自動的生成這兩個函數。 二、這兩個函數只能是由按位拷貝的語義,因此是淺拷貝,當有指針成員的時候,它只能拷貝指針的數值,而不能拷貝指針指向的內容。因此這兩個函數僅僅在某些特定的情況下才可能有效的發揮作用。

代碼分析: 在聲明test的時候,調用了第一個構造函數,然后在執行到test=A(5)的時候,調用了第二個構造函數,重點就在這里,這里不是test調用了第二個構造函數,實際是編譯器生成了一個臨時對象,是這個臨時對象調用了第二個構造函數。前面提到了,在沒有自己寫拷貝構造函數和operator=這兩個函數的時候,編譯器會自動生成,這個時候的拷貝都是淺拷貝,編譯器執行A(5)的時候創建了一個臨時的對象,然后通過編譯器自己生成的operator=函數把這個臨時對象的值賦給了test,最后析構這個臨時對象。

這里有個值得注意的地方就是這種采用默認拷貝構造和operator=的拷貝和賦值都是淺拷貝,當有指針的時候應當特別注意不能這樣使用,容易出現問題。 還有就是這中直接調用構造函數的方式,還有可能造成野指針,例如:

A* ptr = &A(5);

在臨時對象消失之后,ptr成為了野指針。

如果想要延長臨時對象生存周期,有一種方法是對它進行const引用:

const A& a = A(5);

這樣只要a存在,由A(5)產生的臨時對象就會存在。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 凤台县| 永吉县| 普洱| 昌邑市| 五莲县| 大新县| 巴彦淖尔市| 西丰县| 聂拉木县| 临夏市| 翁源县| 望谟县| 龙泉市| 武威市| 威信县| 万盛区| 永新县| 高阳县| 十堰市| 峨眉山市| 巴青县| 巫溪县| 沙湾县| 普洱| 万宁市| 兴业县| 赤水市| 玉溪市| 得荣县| 安图县| 师宗县| 西吉县| 乾安县| 新宾| 龙南县| 视频| 靖西县| 庆阳市| 建湖县| 新闻| 永宁县|