C++結(jié)構(gòu)體初始化的10種寫法總結(jié)
1.前言
本篇目的:C++之結(jié)構(gòu)體初始化10種方式總結(jié)
2.C++中的結(jié)構(gòu)體(struct)和類(class)區(qū)別
C++中的結(jié)構(gòu)體(struct)和類(class)是兩種用于封裝數(shù)據(jù)和相關(guān)操作的復(fù)合數(shù)據(jù)類型。盡管它們?cè)谠S多方面相似,但它們?cè)贑++中的使用和設(shè)計(jì)理念上存在一些關(guān)鍵差異。
首先,從語法角度看,結(jié)構(gòu)體和類的基本定義形式非常相似。它們都允許我們定義數(shù)據(jù)成員(即變量)和成員函數(shù)(即函數(shù)),以便我們可以對(duì)數(shù)據(jù)進(jìn)行操作。然而,在C++中,結(jié)構(gòu)體默認(rèn)是公有(public)的,這意味著其成員默認(rèn)是公開的,可以直接訪問。相反,類默認(rèn)是私有的(private),這意味著其成員默認(rèn)是隱藏的,需要通過公有成員函數(shù)進(jìn)行訪問。
這種默認(rèn)訪問權(quán)限的差異反映了結(jié)構(gòu)體和類在C++中的設(shè)計(jì)理念。結(jié)構(gòu)體通常被用于將一組數(shù)據(jù)聚合在一起,形成一個(gè)邏輯上的整體,這些數(shù)據(jù)成員通常是可以直接訪問的。而類則更強(qiáng)調(diào)封裝和隱藏內(nèi)部狀態(tài),通過公有成員函數(shù)提供對(duì)內(nèi)部數(shù)據(jù)的訪問和操作,從而保護(hù)數(shù)據(jù)的完整性和安全性。
此外,類還提供了更多的特性,如繼承、多態(tài)和模板等,這些特性使得類在構(gòu)建大型、復(fù)雜的軟件系統(tǒng)時(shí)更加靈活和強(qiáng)大。結(jié)構(gòu)體雖然也可以實(shí)現(xiàn)一些基本的封裝和抽象,但在這些高級(jí)特性上則顯得力不從心。
總的來說,結(jié)構(gòu)體和類在C++中都是用于封裝數(shù)據(jù)和操作的復(fù)合數(shù)據(jù)類型,但它們?cè)谀J(rèn)訪問權(quán)限、設(shè)計(jì)理念以及提供的特性上存在差異。選擇使用結(jié)構(gòu)體還是類,應(yīng)根據(jù)具體的應(yīng)用場(chǎng)景和需求來決定。對(duì)于簡(jiǎn)單的數(shù)據(jù)聚合,可以使用結(jié)構(gòu)體;對(duì)于需要更復(fù)雜封裝和抽象的場(chǎng)景,則應(yīng)使用類。
3.代碼實(shí)例
直接初始化
struct MyStruct { int x; double y; }; MyStruct s1 = {10, 3.14};
使用成員初始化列表
struct MyStruct { int x; double y; }; MyStruct s2 = { .x = 10, .y = 3.14 };
默認(rèn)初始化并逐個(gè)賦值
struct MyStruct { int x; double y; }; MyStruct s3; s3.x = 10; s3.y = 3.14;
使用構(gòu)造函數(shù)初始化
struct MyStruct { int x; double y; MyStruct(int a, double b) : x(a), y(b) {} }; MyStruct s4(10, 3.14);
使用默認(rèn)構(gòu)造函數(shù)初始化
struct MyStruct { int x; double y; }; ???????MyStruct s5{}; s5.x = 10; s5.y = 3.14;
使用列表初始化
struct MyStruct { int x; double y; }; ???????MyStruct s6{}; s6 = {10, 3.14};
使用無名稱的臨時(shí)結(jié)構(gòu)體對(duì)象
struct MyStruct { int x; double y; }; ???????MyStruct s7 = MyStruct{10, 3.14};
使用emplace_back()
struct MyStruct { int x; double y; }; ???????std::vector<MyStruct> vec; vec.emplace_back(10, 3.14);
使用std::make_pair()
struct MyStruct { int x; double y; }; ???????std::pair<int, double> p = std::make_pair(10, 3.14); MyStruct s8 = {p.first, p.second};
使用memcpy()
struct MyStruct { int x; double y; }; MyStruct s9; int tempX = 10; double tempY = 3.14; std::memcpy(&s9, &MyStruct{tempX, tempY}, sizeof(MyStruct));
使用無名稱的臨時(shí)結(jié)構(gòu)體對(duì)象實(shí)例代碼 V1.0
#include <iostream> using namespace std; struct BinderHandle1 { int32_t handle; }; class BpBinder1 { public: BpBinder1(BinderHandle1 handle) { this->handle = handle; } private: BinderHandle1 handle; }; struct BinderHandle2 { int32_t handle; string data; }; class BpBinder2 { public: BpBinder2(BinderHandle2 handle) { this->handle = handle; } private: BinderHandle2 handle; }; int main() { int handle = 100; BpBinder1 *bp = new BpBinder1(BinderHandle1{handle}); delete bp; BpBinder2 *bp2 = new BpBinder2(BinderHandle2{handle,"124"}); return 0; }
使用無名稱的臨時(shí)結(jié)構(gòu)體對(duì)象實(shí)例代碼 V2.0
#include <iostream> using namespace std; struct BinderHandle2 { int32_t handle; string data; }; class BpBinder2 { public: BpBinder2(BinderHandle2 handle) { this->handle = handle; printf("xxx--------------->%s(), line = %d, handle = %d\n",__FUNCTION__,__LINE__,this->handle.handle); printf("xxx--------------->%s(), line = %d, data = %s\n",__FUNCTION__,__LINE__,this->handle.data.c_str()); } private: BinderHandle2 handle; }; int main() { int handle = 100; BpBinder2 *bp2 = new BpBinder2(BinderHandle2{handle,"124"}); delete bp2; return 0; }
到此這篇關(guān)于C++結(jié)構(gòu)體初始化的10種寫法總結(jié)的文章就介紹到這了,更多相關(guān)C++結(jié)構(gòu)體初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++設(shè)計(jì)模式之迭代器模式(Iterator)
這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之迭代器模式Iterator,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04C++實(shí)現(xiàn)LeetCode(159.最多有兩個(gè)不同字符的最長(zhǎng)子串)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(159.最多有兩個(gè)不同字符的最長(zhǎng)子串),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07c++ TCHAR轉(zhuǎn)string導(dǎo)致中文缺失或亂碼問題及解決
這篇文章主要介紹了c++ TCHAR轉(zhuǎn)string導(dǎo)致中文缺失或亂碼問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08C++簡(jiǎn)單實(shí)現(xiàn)shared_ptr的代碼
智能指針用于資源管理,為了保證資源的操作得到順利的執(zhí)行防止資源泄露,因此大多數(shù)實(shí)現(xiàn)都以noexcept在參數(shù)列表后聲明為不拋出異常,這篇文章主要介紹了C++簡(jiǎn)單實(shí)現(xiàn)shared_ptr的代碼,需要的朋友可以參考下2022-09-09在VC中隱藏控制臺(tái)程序窗口的實(shí)現(xiàn)代碼
大家都知道,當(dāng)編寫一個(gè)win32 console application時(shí),當(dāng)運(yùn)行此類程序的時(shí)候默認(rèn)情況下會(huì)有一個(gè)類似dos窗口的console窗口,但是有的時(shí)候我們只想在程序中運(yùn)行一段功能代碼,不希望顯示這個(gè)console窗口,讓代碼執(zhí)行完畢之后程序自動(dòng)退出2013-04-04