日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++学习】对私有构造析构函数的思考:new一个类对象vs直接创建类对象

發布時間:2023/12/10 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++学习】对私有构造析构函数的思考:new一个类对象vs直接创建类对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前置知識:

new的類對象需要手動delete。且使用堆空間。且只能用指針接收。

直接創建的類對象創建在棧中(或說堆棧)。不需要手動delete,隨著生存周期的結束(如所在的函數return了)而釋放,和堆棧空間一起釋放了。

為什么要私有構造函數?

把析構函數定義為私有的,就阻止了用戶在類域外對析構函數的使用。這表現在如下兩個方面: ??
????
??1. ??禁止用戶對此類型的變量進行定義,即禁止在棧內存空間內創建此類型的對象。要創建對象,只能用 ??new ??在堆上進行。 ??
????
??2. ??禁止用戶在程序中使用 ??delete ??刪除此類型對象。對象的刪除只能在類內實現,也就是說只有類的實現者才有可能實現對對象的 ??delete,用戶不能隨便刪除對象。如果用戶想刪除對象的話,只能按照類的實現者提供的方法進行。 ??
????
??可見,這樣做之后大大限制了用戶對此類的使用。一般來說不要這樣做;通常這樣做是用來達到特殊的目的,比如在 ??singleton(單例模式)? ?的實現上。

私有構造函數,私有析構函數的幾個例子:

?注意這里getInstance的實現不能保證單例。

例1

#include <iostream>using namespace std; class A {public:static A* getInstance() { return new A; }void Distroy() { delete this; }private:A() { cout << "construct A" << endl; }~A() { cout << "xigou A" << endl; } }; int main() {A* a_ptr = new A;return 0; }

報錯:

error: calling a private constructor of class 'A'

例2

#include <iostream>using namespace std; class A {public:static A* getInstance() { return new A; }void Distroy() { delete this; }private:A() { cout << "construct A" << endl; }~A() { cout << "xigou A" << endl; } }; int main() {A a;return 0; }

報錯

error: calling a private constructor of class 'A'

error: variable of type 'A' has private destructor

例3

#include <iostream>using namespace std; class A {public:static A* getInstance() { return new A; }void Distroy() { delete this; }public:A() { cout << "construct A" << endl; }private:~A() { cout << "xigou A" << endl; } }; int main() {A a;return 0; }

報錯:

error: variable of type 'A' has private destructor

?記住析構函數不能重載,所以沒法既定義public的也定義private的。

例4

#include <iostream>using namespace std; class A {public:static A* getInstance() { return new A; }void Distroy() { delete this; }public:A() { cout << "construct A" << endl; }private:~A() { cout << "xigou A" << endl; } }; int main() {A* a_ptr = new A;return 0; }

正常輸出:

construct A

例5:

#include <iostream>using namespace std; class A {public:static A* getInstance() { return new A; }void Distroy() { delete this; }private:A() { cout << "construct A" << endl; }~A() { cout << "xigou A" << endl; } }; int main() {A* a_ptr = A::getInstance();a_ptr->Distroy();//這句沒有也可以正常編譯,因為對象是new出來的,所以需要手動delete!return 0; }

正常輸出:

construct A

xigou A

參考鏈接:

https://blog.csdn.net/koudaidai/article/details/7546661

總結

以上是生活随笔為你收集整理的【C++学习】对私有构造析构函数的思考:new一个类对象vs直接创建类对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。