c/c++拷贝构造函数和关键字explicit
生活随笔
收集整理的這篇文章主要介紹了
c/c++拷贝构造函数和关键字explicit
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit
關(guān)鍵字explicit
修飾構(gòu)造方法的關(guān)鍵字,加上了,就告訴編譯器,不可以隱式初始化對象;不加就可以隱式初始化對象;
下面的代碼是可以正常編譯執(zhí)行的,但是加了關(guān)鍵字explicit,編譯就會錯我,因為Test t = 100;是隱式初始化對象,但是如果加上強制類型轉(zhuǎn)換后,就不會有錯誤了。
強制類型轉(zhuǎn)換:Test t = (Test)100;
- 拷貝構(gòu)造函數(shù)如果加上了explicit,下面的語句就無法編譯通過;不加可以。
- 觸發(fā)拷貝構(gòu)造函數(shù)的4種方式
? 1,Test t2(t1);//調(diào)用拷貝構(gòu)造函數(shù)
? 2,聲明的同時就賦值Test t3 = t2會調(diào)用拷貝構(gòu)造函數(shù);但是注意下面這種不會調(diào)用拷貝構(gòu)造函數(shù)。
? Test t3;
? t3 = t2;//會調(diào)用=的重載方法
? 3,方法的參數(shù)是對象類型test(t2);
? 4,方法的返回值是對象類型。原因:對象tmp在方法結(jié)束后就被釋放掉了,要返回到函數(shù)外,必須要復(fù)制tmp.
但是用gdb看了一下在return處并沒有調(diào)用拷貝構(gòu)造函數(shù),所以test方法結(jié)束后,tmp也沒有被釋放,調(diào)用test方法的t5的內(nèi)存地址和tmp是一樣的。個人猜測:老版本的gcc編譯器可能會在return處調(diào)用拷貝構(gòu)造函數(shù),但是新的編譯器(gcc 4.8.5-20)為了提高效率,避免了一次多余的拷貝。
void test(Test x){//進(jìn)入函數(shù)的時點會調(diào)用拷貝構(gòu)造函數(shù)int value;value = x.getData();Test tmp(value);return tmp;//return的時點會調(diào)用拷貝構(gòu)造函數(shù) } Test t5 = test(t1);一個注意點,拷貝構(gòu)造函數(shù)的參數(shù)最好用const限定,不然下面的代碼編譯不過(gcc 4.8.5-20)
#include <iostream> using namespace std;class Test{ public:Test(int d = 0):data(d){cout << "C:" << d << " " << this << endl;}Test(Test &t){cout << "Copy:" << t.data << " " << this << endl;data = t.data;}Test& operator = (const Test &t){cout << "Assign:" << this << " = " << &t << endl;if(this != &t){data = t.data;}return *this;}~Test(){cout << "F:" << this->data << "->" << this << endl;}int getData()const{return data;} private:int data; };Test fun(Test &x){int value = x.getData();Test tmp(value);return tmp;}int main(){Test t1(100); //編譯不過,因為拷貝構(gòu)造函數(shù)的參數(shù)沒有用const限制Test t2 = fun(t1);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/xiaoshiwang/p/9491296.html
總結(jié)
以上是生活随笔為你收集整理的c/c++拷贝构造函数和关键字explicit的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Centos 开机后,登录时无法输入密码
- 下一篇: 每日踩坑 2018-11-26 MVC