c/c++整理--c++面向对象(5)
生活随笔
收集整理的這篇文章主要介紹了
c/c++整理--c++面向对象(5)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
構造函數的使用
以下代碼中的輸出語句為0嗎?為什么?
#include <iostream> using namespace std; struct CLS { int m_i; CLS(int i):m_i(i){ } CLS() { CLS(0); } }; int main() { CLS obj; cout<<obj.m_i<<endl; return 0; }在代碼第11行,不帶參數的構造函數調用了帶參數的構造函數。這種調用往往被很多人誤解,其實是不行的,而且往往會有副作用。可以加幾條打印語句測試一下:
#include <iostream> using namespace std; struct CLS { int m_i; CLS(int i):m_i(i) { cout<<"CLS():this= "<<this<<endl; } CLS() { CLS(0); cout<<"CLS():this= "<<this<<endl; } }; int main() { CLS obj; cout<<"&obj= "<<&obj<<endl; cout<<obj.m_i<<endl; return 0; } 程序執行結果: CLS():this= 0xbffa176c CLS():this= 0xbffa179c &obj= 0xbfe7391c 7823348可以看到,在帶參數的構造函數里打印出來的對象地址和對象obj的地址不一致。實際上,代碼14行的調用只是在棧上生成了一個臨時對象,對于自己本身毫無影響。還可以發現,構造函數的相互調用引起的后果不是死循環,而是棧溢出。
構造函數explicit與普通構造函數的區別
explicit構造函數是用來防止隱式轉換的。
#include <iostream> using namespace std; class Test1 { public: Test1(int n) { num = n; } //普通構造函數 private: int num; }; class Test2 { public: explicit Test2(int n) { num = n; } //explicit(顯示)構造函數 private: int num; }; int main() { Test1 t1 = 12; //隱式調用其構造函數,成功 Test2 t2 = 12; //編譯錯誤,不能隱式調用其構造函數 Test2 t3(12); //顯示調用成功 return 0; }Test1的構造函數帶一個int型參數,代碼第21行會隱式轉換成調用Test1的構造函數。而Test2的構造函數被聲明為explicit(顯示),這表示不能通過隱式轉換來調用這個構造函數,因此22行編譯錯誤。
explicit構造函數的作用
#include <iostream> using namespace std; class Number { public: string type; Number():type("void"){} explicit Number(short):type("short") {} Number(int):type("int"){ } }; void show(const Number& n) { cout<<n.type<<endl; } int main() { short s=42; show(s); return 0; }show()函數的參數類型是Number類對象的引用,18行調用show(s)時采取了以下所示的步驟:
(1)show(s)中的s為short類型,其值為42,因此首先檢查參數為short的構造函數能否被隱式轉換。由于第9行的構造函數被聲明為explicit(顯示調用),因此不能隱式轉換。于是進行下一步。
(2)42自動轉換為int型。
(3)檢查參數為int的構造函數能否被隱式轉換。由于第10行參數為int的構造函數嗎,沒有被聲明為顯示調用,因此此構造函數臨時構造出一個臨時對象。
(4)打印上一步臨時對象type的成員,即“int”
總結
以上是生活随笔為你收集整理的c/c++整理--c++面向对象(5)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GJB 软件质量保证报告(模板)
- 下一篇: 高清 GJB-5000B,2021最新版