pos機(jī)初始化失敗103

 新聞資訊2  |   2023-07-25 11:54  |  投稿人:pos機(jī)之家

網(wǎng)上有很多關(guān)于pos機(jī)初始化失敗103,C++11 精要學(xué)習(xí)的知識,也有很多人為大家解答關(guān)于pos機(jī)初始化失敗103的問題,今天pos機(jī)之家(www.shbwcl.net)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、pos機(jī)初始化失敗103

pos機(jī)初始化失敗103

引言

變量初始化的工作,要是不細(xì)想,可能會覺得是一件挺簡單的事兒,例如int a = 100;。但在 C++ 的世界里,誰也不敢說哪件事是簡單的,要是寫成int a = {100};,不知道你有沒有見過?

其實(shí)后一種寫法是列表初始化方法,是 C++11 標(biāo)準(zhǔn)里定義的,它的結(jié)果也和前一種一樣。我們在下文會對列表初始化的用法、原理,以及如何避坑進(jìn)行詳細(xì)討論。

如果這個(gè)變量int a是出現(xiàn)在類的聲明中,那又有什么新花樣對它進(jìn)行默認(rèn)初始化呢?我們就從類的非靜態(tài)成員默認(rèn)初始化說起吧。

非靜態(tài)成員默認(rèn)初始化

這要從一個(gè)痛點(diǎn)說起。

在 C++11 標(biāo)準(zhǔn)之前,如果一個(gè)類的非靜態(tài)數(shù)據(jù)成員較多,那么用初始化列表方式,編寫構(gòu)造函數(shù)時(shí)就會比較痛苦。如下例所示,會發(fā)現(xiàn)這幾乎就是在窮舉各種情況。

class OneInit { public: OneInit() : x(0), y(false), z("init") {} OneInit(int x) : x(x), y(false), z("init") {} OneInit(bool y) : x(0), y(y), z("init") {} OneInit(const string &z) : x(0), y(0), z(z) {} private: int x; bool y; string z;};

這還僅是舉個(gè)栗子,實(shí)際情況里一個(gè)類里十來個(gè)成員是常有的事,真要這樣寫默認(rèn)初始化,費(fèi)勁不說,還容易出錯(cuò)。

C++11 提供了新的初始化方法,就是在類內(nèi)聲明處,直接對非靜態(tài)成員賦值即可。經(jīng)過改寫,看下新的版本:

class OneInit { public: OneInit() {} OneInit(int x) : x(x) {} OneInit(bool y) : y(y) {} OneInit(const string &z) : z(z) {} private: int x = 0; bool y = false; string z{"init"}; //這是列表初始化方法,下節(jié)會具體講述};

是不是簡化得多了,是不是有一種清爽感撲面而來?構(gòu)造函數(shù)里,只關(guān)注你想初始化的成員就好,所有默認(rèn)值都可以放在聲明處,一次性解決。

雖然方便,但仍有兩點(diǎn)注意事項(xiàng),以免掉坑。

第一,不要使用括號()對非靜態(tài)數(shù)據(jù)成員進(jìn)行初始化;第二,不要使用auto關(guān)鍵字聲明和初始化非靜態(tài)數(shù)據(jù)成員。

其實(shí)你真用了上面的方法,編譯也會報(bào)錯(cuò),只是要知道錯(cuò)在哪里。

列表初始化

在介紹列表初始化之前,我們先回顧一下已有的兩種初始化方式:直接初始化和拷貝初始化。

直接初始化一般使用括號方式,將初始值賦予變量。而拷貝初始化,則是使用等號對變量進(jìn)行初始化。

示例代碼如下:

class OneInit { public: OneInit(int x) {}};int main() { OneInit one(100); // 直接初始化 OneInit one2 = 101; // 拷貝初始化 OneInit *one3 = new OneInit(102); // 思考題:這是哪種初始化類型?}

需要注意的是,拷貝初始化的等號并不是賦值的含義,而是隱式調(diào)用構(gòu)造函數(shù)。如果在構(gòu)造函數(shù)前加上explicit關(guān)鍵字,則編譯會失敗。explicit的作用就是強(qiáng)制構(gòu)造函數(shù)必須顯式調(diào)用。

那么,我們來看一下 C++11 中新增的列表初始化的方法,它使用花括號{}對變量進(jìn)行初始化。列表初始化也有直接和拷貝兩種初始化類型。

還是用代碼說話:

class OneInit { public: OneInit(int x, string y) {}};int main() { OneInit one{100, "init"}; // 直接初始化 OneInit one2 = {101, "init"}; // 拷貝初始化 OneInit *one3 = new OneInit{102, "init"}; // 直接初始化,知道上面思考題的答案了吧}

上述代碼在構(gòu)造函數(shù)中增加了一個(gè)string類型參數(shù),以方便大家看到,在多參數(shù)的情況下,如何編寫列表初始化方法。

乍一看,這似乎和括號初始化方式差別不大,但它有一個(gè)妙用,就是在使用函數(shù)返回對象的時(shí)候,可以用列表初始化方式進(jìn)行多參數(shù)的隱式構(gòu)造,看代碼來體會一下:

class OneInit { public: OneInit(int x, string y) {}};OneInit get_object() { return {103, "init"}; // 簡化了生成對象的過程}int main() { OneInit one = get_object();}

相信大家對列表初始化的規(guī)則已經(jīng)了解,下面我們講一個(gè)高階應(yīng)用。

容器初始化

我們對于數(shù)組可以方便地以int array[] = {1, 2, 3};這樣的方法來初始化。但是對于 STL 庫中的眾多容器,以前卻沒什么好辦法,只能寫一個(gè)循環(huán)不斷地追加值。

現(xiàn)在借助于列表初始化,我們也可以做到像數(shù)組一樣初始化容器對象了。

int main() { int array1[]{1, 2, 3}; int array2[] = {1, 2, 3}; vector<int> v1{1, 2, 3}; vector<int> v2 = {1, 2, 3}; list<int> l1{1, 2, 3}; list<int> l2 = {1, 2, 3}; map<string, int> m1{ {"one", 1}, {"two", 2}, {"three", 3} }; map<string, int> m2 = { {"one", 1}, {"two", 2}, {"three", 3} };}

STL 容器對象的初始化,看起來也如絲般光滑了。這個(gè)實(shí)現(xiàn)離不開一個(gè)前提,就是容器類要支持std::initializer_list為形參的構(gòu)造函數(shù)。

std::initializer_list是一個(gè)支持begin, end, size成員函數(shù)的類模板。編譯器首先將花括號的內(nèi)容構(gòu)造為一個(gè)std::initializer_list對象,然后匹配容器類的構(gòu)造函數(shù),只要形參是std::initializer_list類型,那么執(zhí)行相應(yīng)的構(gòu)造函數(shù)。

在構(gòu)造函數(shù)中對begin, end范圍內(nèi)的數(shù)據(jù)進(jìn)行循環(huán),就實(shí)現(xiàn)了多參數(shù)元素的初始化。說起來真不復(fù)雜,各位有心的完全可以自己定義一個(gè)類,然后支持std::initializer_list形參的構(gòu)造函數(shù),也能實(shí)現(xiàn)自有的列表初始化方法了。

不知道你注意到?jīng)]有,map 的初始化有點(diǎn)與眾不同,對于多參數(shù)的元素,似乎只管嵌套就完了。如果深究的話,你會發(fā)現(xiàn)內(nèi)層元素{"one", 1}其實(shí)是隱式調(diào)用了std::pair構(gòu)造函數(shù),而外層則是走的std::initializer_list方式。

注意事項(xiàng)

列表初始化容易掉坑的地方,就是在隱式縮窄轉(zhuǎn)換上。例如int a = 10240; char b = a;中,變量 b 的初始化就發(fā)生了隱式縮窄,信息發(fā)生了丟失。這種問題編譯時(shí)有可能警告都不會有,所以要千萬小心。

要避免這樣的問題,需要知道四條隱式縮窄規(guī)則:

從浮點(diǎn)類型轉(zhuǎn)換到整數(shù)類型;從long double轉(zhuǎn)換到long或float。或從double轉(zhuǎn)換到float;從整數(shù)類型或非強(qiáng)枚舉類型,轉(zhuǎn)換到浮點(diǎn)類型;從整數(shù)類型或非強(qiáng)枚舉類型,轉(zhuǎn)換到不能代表所有原始類型值的整數(shù)類型。

以下代碼是錯(cuò)誤示例,請仔細(xì)看:

int main() { int a = 10240; double b = 99.9; int c = {3.0}; // 對應(yīng)規(guī)則1 float d = {b}; // 對應(yīng)規(guī)則2 float e = {a}; // 對應(yīng)規(guī)則3 char f = {a}; // 對應(yīng)規(guī)則4}結(jié)語

沒想到一個(gè)變量初始化,也能整出這么多說法來。即使是一件看起來應(yīng)該簡單的事情,在 C++ 里面也能不斷挖出坑來。所以誰也不敢說自己是 C++ 高手,那是分分鐘被打臉。

不管怎樣,讓我們記住本文最重要的三個(gè)點(diǎn),方便自己以后寫代碼吧:

類的非靜態(tài)成員,可以在聲明處直接初始化;使用列表初始化方法,簡化多參數(shù)構(gòu)造函數(shù)隱式執(zhí)行;STL 容器對象,可直接使用列表初始化方法。

參考資料:

謝丙堃 現(xiàn)代C++語言核心特性解析 人民郵電出版社

以上就是關(guān)于pos機(jī)初始化失敗103,C++11 精要學(xué)習(xí)的知識,后面我們會繼續(xù)為大家整理關(guān)于pos機(jī)初始化失敗103的知識,希望能夠幫助到大家!

轉(zhuǎn)發(fā)請帶上網(wǎng)址:http://www.shbwcl.net/newsone/89408.html

你可能會喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 babsan@163.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。