Қазіргі C ++ / компаниясының инициализациясы Company Blog Jug Ru Group / HABR

Инициализацияның семантикасы C ++ ең күрделі бөліктерінің бірі екендігі белгілі. Әр түрлі синтаксисті сипатталған инициализацияның көптеген түрлері бар, олар барлық өзара әрекеттеседі және сұрақтар тудырады. C ++ 11 «әмбебап инициализация» ұғымын әкелді. Өкінішке орай, ол одан да күрделі ережелер әкелді, ал өз кезегінде олар C ++ 14, C ++ 17-де бұғатталған және C ++ 20-да қайтадан өзгерді.

KAT - бейне және Тимур Д.О. Тимурдың есебінің (Timur Doumler) C ++ Ресей конференциясынан аударма (Timur Doumler). Тимур алдымен C ++ тіліндегі инициолизацияның нәтижелерін қорытындылайды, инициализацияның, тәттілердің, тәттілер мен тосынсыйлардың ағымдағы нұсқасына, осы ережелерді қалай тиімді пайдалану керектігін түсіндіреді және ақыры жаңа ұсыныстар туралы айтады C ++ 20 семантикасын жасайтын стандарт біршама ыңғайлы. Әрі қарай, әңгіме оның бетінен.

Мазмұны.

Сіз қазір көріп отырған ГИФКА, бұл есептің негізгі идеясын жақсы біледі. Мен оны Интернеттегі ғаламторда жарты жыл бұрын таптым және Twitter-де орналастырылғанмын. Пікірлерде біреу оның үш-ден астам инициализацияның жоқтығын айтты. Талқылау басталды, оның барысында маған бұл туралы есеп беру ұсынылды. Сондықтан бәрі басталды.

Николай Юросутис инициализация туралы айтты. Оның баяндамасында слайд болды, оның ішінде 19 түрлі жолмен басталды:

int i1; // анықталмаған құндылық I2 = 42; // Ескерту: 42int i3 (42); // 42int i4 = int (); // 42int i5 {42} // 42int i6 = {42} // 42int i7 {} // 0int i8 {{}; // 0auto I9 = 42; // 42Auto I10 {42} // C ++ 11: std :: std: std >list <int>, c ++ 14: Intauto I11 = {42}; // Inits std :: sted: intory_list <int> 42auto i12 = int {42}; // Intits Int Int, I13 (); // fingint i14 (7, 9) функциялары; // Comple-Time ErrorIty I15 = (7, 9); // OK, Int, Int INT INT INT I16 = int (7, 9); // Comple-Time Errity I17 (7, 9); // Comple-Time Errayuto I18 = (7, 9); // OK, INT INT INT INT (үтірмен оператор) Auto I19 = int (7, 9); // Компиляция-уақыт қатесі 

Меніңше, бұл бағдарламалау тілінің ерекше жағдайы. Айнымалыны баптандыру қарапайым әрекеттердің бірі, бірақ оны мүлде жасау үшін, бірақ c ++ тілінде. Бұл тілде соңғы жылдары стандартты, түзетулер мен өзгерістерден ауытқулар туралы көптеген есептер болатыны екіталай. Инициализация ережелері Стандарттан стандартқа ауысады, ал Интернетте C ++ тіліндегі инициализацияның қалай конфигурацияланғандығы туралы есепсіз хабарламалар бар. Сондықтан, оны жүйелі түрде қарау үшін - тапсырма емес.

Мен хронологиялық тәртіпте материалды жариялаймын: алдымен біз мұрагерлік, содан кейін C ++ 98, содан кейін C ++ 03, C ++ 03, C ++ 11, C ++ 11, C ++ 14 және C ++ 14 және C ++ 17 және C ++ 17 және C ++ 11 және 17-ге дейін сөйлесетінін айтамыз. Біз кең таралған қателіктерді талқылаймыз, және мен дұрыс инициализацияға қатысты ұсыныстарымды беремін. Мен сонымен қатар C ++ 20-да инновациялар туралы сөйлесемін. Есептің соңында шолу кестесі ұсынылады.

Әдепкі инициализация (c)

C ++ тілінде С ++ тілінде С ++ мұрагерліктері, сондықтан біз одан бастаймыз. C-де айнымалыларды баптаудың бірнеше жолы бар. Оларды мүлдем іске қосуға болмайды, және бұл деп аталады Әдепкі инициализация . Менің ойымша, бұл сәтсіз атау. Штатымның мәні, әдепкі айнымалы мәнге мән берілмейді, ол жай ғана іске қосылмайды. Егер сіз C ++ және c-де қосылмаған айнымалыға жүгінсеңіз, белгісіз мінез-құлық:

Int main () {int i; Қайтару i; // анықталмаған мінез-құлық} 

Бұл пайдаланушы түрлеріне қатысты: егер кейбір жағдайда болса құрылыс Оларға қолданылған кезде, оларға қолданылған кезде, белгісіз әрекеттер бар, олар да туындайды:

Құрылымдық виджет {int i; int j;}; int marry () {виджет виджеті; Қайтару виджеті.i; // белгісіз мінез-құлық} 

Көптеген жаңа дизайн C ++: сыныптар, дизайнерлер, көпшілік, жеке, әдістерге қосылды, бірақ жаңадан сипатталған мінез-құлыққа ештеңе әсер етпейді. Егер кейбір элемент сыныпта іске қосылмаса, онда оған қол жеткізген кезде белгісіз мінез-құлық пайда болады:

Сынып виджеті {көпшілікке: виджет () {} int it get_i () constoxcept {Мені қайтару; } int get_j () constoxcept {accue j; } Жеке: int i; int j;}; int marry () {виджет виджеті; Widget.get_i () қайтару; // анықталмаған мінез-құлық!} 

Сыныптың әдепкі элементін C ++ тіліндегі сиқырлы әдіс жоқ. Бұл қызықты сәт, және менің алғашқы бірнеше жылдарымда C ++ көмегімен мен білмедім. Компилятор да, мен содан кейін қолданған компилятор да, бұл туралы еске салмады. Менің әріптестерім кодты тексеру кезінде осы мүмкіндікке назар аудармады. Мен осы жылдардағы жазған кодта болғандықтан, бұл менің кодта болғанына сенімдімін, өте таңқаларлық қателер бар. Менің ойымша, сыныптар олардың айнымалы мәндерін баптауы керек сияқты.

C ++ 98-де, сіз айнымалыларды мүшелерді инициализатор тізімін қолданып баптай аласыз. Бірақ мәселені шешудің мұндай шешімі оңтайлы емес, өйткені ол әр дизайнерде жасалуы керек және оны ұмыту оңай. Сонымен қатар, инициализация айнымалы мәндер жарияланған және нысаннан келмейтін тізімде емес:

// C ++ 98: C ++ 98: Movies ListSclass виджеті {көпшілікке: виджет (): i (0), j (0) {} // мүше тізім (0) {} // мүше тізім } int get_j () constoxcept {accue j; } Жеке: int i; int j;}; int marry () {виджет виджеті; Widget.get_i ()} 

C ++ 11-де әдепкі инициалерлер қосылды, бұл әлдеқайда ыңғайлы. Олар сізге барлық айнымалыларды бір уақытта баптауға мүмкіндік береді және барлық элементтердің инициализацияланғанына сенімділік береді:

// c ++ 11: Әдепкі мүше. } int get_j () constoxcept {accue j; } Жеке: int i = 0; // Әдепкі Мүшелер инициалдары Int j = 0;}; int main () int {виджет виджеті; Widget.get_i ()} 

Менің алғашқы ұсынысым: Мүмкіндігінше әрдайым DMI қолданыңыз (тікелей мүшелерді бапкерлер). Оларды кіріктірілген түрлерімен бірге пайдалануға болады ( қалқымалы. и int. ), сондықтан объектілермен. Элементтерді баптандыру әдеті бұл мәселені саналы түрде жақындатады.

Жеткізуді баптандыру (c)

Сонымен, инициализациялау әдісінен алынған бірінші мұрагерлік әдепкі бойынша инициализациялау болып табылады және оны қолдануға болмайды. Екінші жол - Бастауды көшіру . Бұл жағдайда біз айнымалы мәнді және теңдік белгісін көрсетеміз - оның мәні:

// Mainnisalint негізгі () {int i = 2;} көшіру 

Көшіруді көшіру Аргумент Мәні функциясына берілсе немесе нысан мәннің мәнінен қайтарылған кезде де қолданылады:

// инициализацияланған квадратты көшіру (int i) {Мені қайтару i;} 

Теңдік белгісі мән тағайындалған әсер тудыруы мүмкін, бірақ бұлай емес. Жеткізуді көшіру Мәнді тағайындау емес. Осы есепте тапсырмалар туралы ештеңе болмайды.

Бастауды көшірудің тағы бір маңызды қасиеті: егер мәндердің түрлері сәйкес келмесе, онда ол орындалады Конвертация тізбегі (Түрлендіру тізбегі). Айырбастау дәйектілігі белгілі бір ережелерге ие, мысалы, ол нақты дизайнерлерге себеп болмайды, өйткені олар құрылысшыларды өзгерте алмайды. Сондықтан, егер сіз объект үшін инициализациялауды жасасаңыз, дизайнер нақты деп белгіленген, компиляция қателігі пайда болады:

Құрылым виджеті {Flight Widget (int) {}}}; виджет W1 = 1; // қате 

Сонымен қатар, егер басқа конструктор болса, онда ол нақты емес, бірақ ол түрден гөрі нашар, содан кейін көшіруді бастау инициализациялау оның айқын конструкторды елемеу арқылы тудырады:

СҒК Виджеті {Finlit виджеті (int) {} виджеті (екі рет) {}}}; виджет W1 = 1; // қоңырау виджеті (екі рет) 

Агрегатты баптандыру (c)

Мен айтқым келетін үшінші түрі - Агрегатты баптандыру . Ол массив бұйра жақшалардағы бірқатар мәндермен инициализацияланған кезде орындалады:

INT I [4] = {0, 1, 2, 3}; 

Егер ол массивтің мөлшерін көрсетпесе, онда ол жақшаларда жасалған мәндер санынан алынады:

int j [] = {0, 1, 2, 3}; // Массивтің мөлшерін шегеру 

Дәл осындай инициализация агрегаттық сыныптар үшін қолданылады, яғни, мұндай сыныптар, яғни бұл жалпы элементтер жиынтығы болып табылады (агрегаттық сыныптар анықтамасында тағы бірнеше ережелер бар, бірақ біз оларға тоқтамаймыз):

Құрылымдық виджет {int i; Жүзу j;}; виджет виджеті = {1, 3.14159}; 

Бұл синтаксис тіпті C және C ++ 98-де жұмыс істеді, ал C ++ 11-ден бастап, сіз оған теңдік белгісін өткізіп жібере аласыз:

Виджет виджеті {1, 3.14159}; 

Агрегаттық инициализация іс жүзінде әр элемент үшін инициализацияны көшіруді қолданады. Сондықтан, егер сіз агрегатты инициализацияны (теңдік белгісімен де, онсыз да, онсыз да) қолданғыңыз келсе, нақты дизайнерлер бар бірнеше объектілер үшін сіз әр объект үшін инициализацияны көшіре аласыз, және компиляция қателігі:

Құрылым виджеті {Finlit виджеті (int) {}}}; {}}}; {WINDGE W1, W1, W1, W2;}; int main () {int the swordy = {{3, 4}; // қате {3, 4} қате; // қате} 

Егер осы нысандар үшін тағы бір дизайнер болса, ол анық емес, ол аталады, тіпті ол түріне қарағанда нашар болса да:

Құрылым виджеті {FINICIT виджеті (int) {} виджеті (DOWN) {}}} {}} {W1, w1, w2, w2;}; int main () {int the swordy = {{3, 4}; // қоңыраулардың виджеті (екі есе), бұл {3, 4}; // қоңырау виджеті (қос)} 

Жиынтық инициализацияның басқа мүлкін қарастырыңыз. Сұрақ: Бұл бағдарламаны қандай мән қайтарады?

Құрылымдық виджет {int i; int j;}; int main () {виджет виджеті = {1}; Widget.j қайтарыңыз;} 
Жасырын мәтін

Толығымен оң, нөл. Егер сіз агрегатты баптандыру кезінде бірнеше элементтерді өткізіп жіберсеңіз, онда нөлдер тиісті айнымалыларға тағайындалады. Бұл өте пайдалы қасиет, өйткені оның арқасында ешқашан біріктірілмеген элементтер бола алмайды. Ол жиынтық сабақтармен және массивтермен жұмыс істейді:

// барлық элементтер Zeroint [100] = {} арқылы іске қосылады; 

Жиынтық инициализацияның тағы бір маңызды қасиеті - жақшалар (жақшалар) жоқ. Сіздің ойыңызша, бұл бағдарлама не қайтарады? Онда бар Виджет. бұл екі мәннің бірлігі int. , И. Нәрсе , агристиялық Виджет. и int. . Біз не аламыз, егер оған екі тілді көрсетсек: {12} ?

Құрылымдық виджет {int i; int j;}; құрылымы {виджет W; int k;}; int marry () {t = {1, 2}; Қайтару t.k; // Біз не аламыз?} 
Жасырын мәтін

Жауап: нөл. Міне, біз боранмен (Subaggregate), яғни кірістірілген агрегаттық сыныппен жұмыс жасаймыз. Мұндай сабақтарды кірістірілген жақшаларды қолдана отырып баптауға болады, бірақ осы жұптардың біреуін өткізіп жіберуге болады. Бұл жағдайда, металлургияның рекурсивті айналма жолдары орындалады және {12} Ол теңестіреді {{1, 2}, 0} . Танылуы керек, бұл мүлік анық емес.

Статикалық инициализация (c)

Соңында, С-тен де мұрагерлікке ие Статикалық баптандыру : Статикалық айнымалылар әрқашан басталады. Мұны бірнеше жолмен жасауға болады. Статикалық айнымалы мәнді тұрақты өрнекпен бастауға болады. Бұл жағдайда баптандыру құрастыру кезінде пайда болады. Егер айнымалы ешқандай мән бермесе, ол нөлдік мәнмен ғана байланыстырылады:

Ist i = 3; // константатиттің инициализациясы j; // инициализация Zeroint Main () {{қайтару i + j;} 

Бұл бағдарлама 3-ке оралады jІске қосылмаған. Егер айнымалы мән тұрақты болмаса, бірақ проблемалар туындауы мүмкін.

Міне, нақты кітапханадан мысал келтірілген, оның үстінен мен жұмыс істедім:

Статикалық түс қызыл = {255, 0, 0}; 

Бұл түсті класс, ал негізгі түстер (қызыл, жасыл, көк) статикалық нысандар ретінде анықталды. Бұл рұқсат етілген әрекет, бірақ инициализаторда қолданылатын басқа статикалық объект пайда болады қызыл , белгісіздік пайда болады, өйткені айнымалылар инициализацияланған қиын тәртіп жоқ. Сіздің өтінішіңіз біріктірілген айнымалысына сілтеме жасай алады, содан кейін ол құлайды. Бақытымызға орай, C ++ 11-де дизайнерді қолдану мүмкін болды contrixpr Содан кейін біз үнемі инициализациялаумен айналысамыз. Бұл жағдайда инициализация процедураларында ешқандай проблемалар туындамайды.

Сонымен, инициализацияның төрт түрі C тілінен мұра болады: әдепкі инициализация, көшіру, жиынтық және статикалық баптандыру.

Тікелей инициализация (C ++ 98)

Енді C ++ 98-ге бұрылайық. Мүмкін, систердің ++ көмегімен ажыратылатын ең маңызды мүмкіндік. Міне, конструктордың шақыруы:

Виджет виджеті (1, 2); int (3); 

Сол синтаксистің көмегімен сіз кірістірілген түрлерін баптай аласыз int. и қалқымалы. . Бұл синтаксис шақырылған Тікелей инициализация . Ол әрқашан жақшаларда дәлел болған кезде жұмыс істейді.

Ендірілген түрлер үшін ( int. , Будақ , қалқымалы. ) Мұнда баптандыруды көшірудің ешқандай айырмашылығы жоқ. Егер біз пайдаланушы түрлері туралы айтатын болсақ, онда инициализацияны көшіруден айырмашылығы, сіз тікелей баптандырумен бірнеше дәлелдерді жібере аласыз. Іс жүзінде, бұл тікелей инициализациялау және ойлап табылған.

Сонымен қатар, тікелей инициализациялау арқылы конверсиялық тізбегі орындалмайды. Оның орнына, құрылысшы шамадан тыс жүктеменің (артық жүктеме шешімі) шақырылады. Тікелей инициализациялау үшін функцияның функциясы сияқты синтаксис, ал сол логика басқа C ++ функцияларында қолданылады.

Сондықтан, нақты дизайнермен болған жағдайда, тікелей инициализация қалыпты түрде жұмыс істейді, бірақ инициализациялау мәселелерін көшіру қатесі:

Құрылым виджеті {Flight Widget (int) {}}}; виджет W1 = 1; // қателік жолжеті w2 (1); // бұл рұқсат етілген 

Екі конструктормен ахуалда, олардың біреуі анық, ал екіншісі типке қарағанда нашар, ал тікелей инициализацияланған, бірінші рет шақырылады, ал көшіру кезінде екінші. Мұндай жағдайда синтаксистің өзгеруі басқа дизайнерге қоңырау шалуға әкеледі - олар көбінесе бұл туралы ұмытып кетеді:

СҒК Виджеті {Finlit виджеті (int) {} виджеті (екі рет) {}}}; виджет W1 = 1; // виджет (қос) виджет W2 (1); // қоңырау виджеті (int) 

Тікелей инициализация әрқашан жақшалар қолданылған кезде қолданылады, соның ішінде дизайнерлік қоңырау шалушы, сондай-ақ уақытша нысанды, сондай-ақ өрнектерді баптау үшін қолданылады жаңа жақшалар мен өрнектердегі инициализатормен Құйма. :

ПайдалануWidget (виджет (1, 2)); // қоңырау дирексері барерлер * Widget_ptr = жаңа виджет (2, 3); // attsic_cast <args) -мен жаңа өрнек <виджет> (зат); // Тас. 

Бұл синтаксис C ++ өзін-өзі сақтай отырып, оның маңызды кемшіліктері бар және оның маңызды кемшіліктері бар, олар Бағдарламалық есепте айтылған Николайдың маңызды кемшілігі бар: Ең көп таланттар . Бұл құрастырушының жарнама ретінде оқи алатын барлық нәрсе (декларация), ол жарнама ретінде оқиды.

Сынып бар мысалды қарастырыңыз Виджет. және сынып Нәрсе , және құрылысшы Нәрсе ол алады Виджет. :

Құрылым виджеті {}; құрылым. 

Бір қарағанда, баптаған кезде Нәрсе Ол әдепкі бойынша беріледі Виджет. Бірақ іс жүзінде бұл функция осында хабарландыру. Бұл код кіре берісте басқа функцияны алатын функцияны жариялайды, ол кіруге және қайтаруға ештеңе алмайды Виджет. , және бірінші функция қайтады Нәрсе . Код қателіксіз құрастырылған, бірақ біз бұл әрекетті басқара алмадық.

Мәнмен инициализация (C ++ 03)

Келесі нұсқаға жүгінейік - C ++ 03. Бұл нұсқада айтарлықтай өзгерістер болған жоқ, бірақ олай емес. C ++ 03-де пайда болды Инициализация мағынасы Бос жақшалар жазылған (инициализация) (мәнді баптандыру):

Int main () {int (); // UB C ++ 98, 0, 0-ден бастап C ++ 03} 

C ++ 98-де, белгісіз мінез-құлық осы жерде туындайды, өйткені әдепкі инициализация пайда болады және C ++ 03-тен басталады Бұл бағдарлама нөлді қайтарады.

Ереже: Егер пайдаланушы анықтаған әдепкі дизайнер болса, инициализация осы конструкторды баптандыруға мәжбүр етеді, әйтпесе нөл қайтарылады.

Пайдаланушы конструкторымен көбірек оқуды қарастырыңыз:

Микс виджеті {int i;}; виджет get_widget () {return виджеті (); // мәнді баптандыру} int main () {get_widget (). Мен;} 

Бұл бағдарламада функция жаңадан жасалған мәнді баптандырады Виджет. Және оны қайтарады. Біз бұл мүмкіндікті және қосыламыз. iҚарсы болу Виджет. . C ++ 03-тен бастап RETURN мәні мына жерден нөлден тұрады, өйткені әдепкі теңшелетін дизайнер жоқ. Егер мұндай дизайнер болса, бірақ іске қосылмаса i, Біз анықталмаймыз:

МЕМЛЕК Виджет {Виджет () {} // пайдаланушы дизайнері int i;};} виджет get_widget () {WINDGET get_widget () {қайтару виджеті (); // мәнді баптандыру} int main () {get_widget (). Мен; // мән іске қосылмаған, ub} пайда болады 

Айта кету керек, «пайдаланушы» «пайдаланушы анықтаған» дегенді білдірмейді. Бұл дегеніміз, пайдаланушы дизайнердің денесін, яғни, бұйра жақшаларды беруі керек дегенді білдіреді. Егер жоғарыда көрсетілген мысалда дизайнердің денесін ауыстырыңыз = Әдепкі. (Бұл мүмкіндік C ++ 11-ге қосылды), бағдарламаның мағынасы өзгереді. Қазір бізде пайдаланушы анықтайтын дизайнер бар (пайдаланушы анықтаған), бірақ пайдаланушы (пайдаланушы берген) бермейді, сондықтан бағдарлама нөлді қайтарады:

Микмин виджеті {Виджет () = әдепкі; // пайдаланушы анықтаған, бірақ пайдаланушы емес, int i;};}; виджет get_widget () {қайтару виджеті (); // мәнді баптандыру} int main () {get_widget (). Мен; // 0 қайтарады 0} 

Енді көрейік Виджет () = Әдепкі сыныптан тыс. Бағдарламаның мағынасы қайтадан өзгерді: Виджет () = Әдепкі Оны қолданушы дизайнері, егер ол сыныптан тыс болса, оны ұсынады. Бағдарлама қайтадан белгісіз әрекетті қайтарады.

Микс виджеті {Виджет (); int i;}; виджет :: Виджет () = әдепкі; // Сыныптан тыс, ол пайдаланушы-іске қосылғанWidget get_widget () {қайтару виджеті () деп саналады; // мәнді баптандыру} int main () {get_widget (). Мен; // Қайта мән енгізілмейді, ub} 

Белгілі бір логик бар: сыныптан тыс конструктор сыныптан тыс конструктор басқа хабар тарату бөлімшесінде болуы мүмкін. Компилятор бұл конструкторды көре алмауы мүмкін, өйткені ол басқа файлда болуы мүмкін .Cpp . Сондықтан, осындай құрылысшы туралы қандай-да бір тұжырым жасау үшін құрастырушы бола алмайды және ол конструкторды конструктордан денемен ажырата алмайды = Әдепкі. .

Әмбебап инициализация (c ++ 11)

C ++ 11 нұсқасында көптеген өте маңызды өзгерістер болды. Атап айтқанда, әмбебап (біркелкі) инициализация енгізілді, оны мен «Unicornition-Unicornization» деп атағанды ​​жөн көрдім («БИНИНАЛИВТІК-Unicorn»), өйткені бұл жай сиқырлы. Неге пайда болғанын қарастырайық.

Сіз байқағаныңыздай, C ++ тілінде әр түрлі мінез-құлық синтаксисі әртүрлі. Дөңгелек жақшалармен Vexing талшықтарын тудырған көптеген қолайсыздықтар. Инициализацияны біріктіретін әзірлеушілерге ұнамады, бірақ оларды массивтермен ғана қолдануға болады, бірақ олар сияқты контейнерлермен емес Std :: Вектор . Орнына орындау керек еді .rerve. и .Push_back немесе барлық қорқынышты кітапханалардан ләззат алыңыз:

// Бұл мүмкін емес еді, бірақ мен std :: векторлы :: Векторлар <int> vec = {0, 1, 2, 4, 4, 4, 4}; // Мен келесідей жазуым керек: std :: Вектор <int> vec; vec.reserve (5); vec.push_back (0); vec.push_back (1); vec.push_back (2); vec.push_back (2); vec.push_back (3); vec.push_back (4); 

Осы мәселелердің барлығында тіл жасаушылар синтаксисті бұйра жақшалармен, бірақ теңдік белгісімен таныстыру арқылы шешуге тырысты. Бұл барлық түрлер үшін бірыңғай синтаксис болады деп болжалды, олар барлық түрлері қолданылады және Vexing Palse проблемасы туындамайды. Көп жағдайда бұл синтаксис өз міндетін орындайды.

Бұл жаңа инициализация шақырылады Инициализация тізімі Бұл екі түрге айналады: тікелей және көшірме. Бірінші жағдайда, жай ғана жақшалар пайдаланылады, екіншісінде, екінші - бұйра жақшалар, теңдік белгісі бар жақшалар:

// Direct List-инициализациялау виджеті {1, 2}; // көшіру тізімі-баптауды іске қосу виджеті = {1, 2}; 

Даралау үшін пайдаланылатын тізім аталады Бронь-init-lies . Бұл тізімде бұл объект емес, оның түрі жоқ. C ++ 11-ге өтуі алдыңғы нұсқалардан өту жиынтық түрлерімен ешқандай проблемалар туғызбайды, сондықтан бұл өзгеріс маңызды емес. Бірақ қазір бұйра жақшадағы тізім жаңа мүмкіндіктер пайда болды. Оның түрі болмаса да, оны жасыруға болады ЖЖБИ :: instinister_list. Бұл сондай-ақ ерекше жаңа түрі. Ал егер кіреберісте алатын құрылысшы болса ЖЖБИ :: instinister_list. , бұл дизайнер деп аталады:

Үлгі <typeName t> Сынып векторы {// ... векторы (ЖЖБИ :: std :: sted :: instactizer_list <t> init); // инициализатор_List} дизайнері}; std :: Векторлар <int> vec {0, 1, 2, 3, 4}; // осы ^ конструкторға әкеледі 

Меніңше, C ++ комитеті ЖЖБИ :: instinister_list. Бұл ең сәтті шешім болған жоқ. Оның пайдасы жақсыдан да көп зиян келтіреді.

Бұдан бастайық ЖЖБИ :: instinister_list. - Бұл элементтері бар белгіленген өлшемді вектор. const. . Яғни, оның түрі, оның функциялары бар Баста. и Соңы. Бұл итераторларды қайтарған, итератордың жеке түрі бар және оны пайдалану үшін сізге арнайы тақырып қосу керек. Өйткені элементтер ЖЖБИ :: instinister_list. па const. , оны жылжыту мүмкін емес, сондықтан TЖоғарыдағы код - тек жылжыту түрі, код орындалмайды.

Әрі қарай, ЖЖБИ :: instinister_list. Бұл объект. Оны қолдана отырып, біз, іс жүзінде, объектілерді құрамыз және жібереміз. Әдетте, компилятор оны оңтайландыруы мүмкін, бірақ семантика тұрғысынан, бізде әлі де қажет емес заттармен айналысады.

Бірнеше ай бұрын Twitter-де сауалнама жүргізілді: егер сіз қайтып оралып, C ++-ден алып тастасаңыз, не алып тастайсыз? Дауыстардың көпшілігі дәл келді инициал_ .

https://twitter.com/shafikyaghmour/status/105803143935561728.

Жақында Джейсон Төрнер екі сағаттық есепті ойнады Қалай түзетуге болады? . Егер сіз осы тақырыппен толығырақ танысқыңыз келсе, мен бұл есепті ұсынамын.

Жаңа синтаксисті шешейік. Ол кіреберісті қабылдаған құрылысшыларды тудырады инициал_ Бұл қиындықтар ескі синтаксистің тікелей инициализациясымен салыстырғанда көптеген мәселелерді тудырады. Көбінесе келесі мысалды жүргізеді:

Std :: Векторлық <int> v (3, 0); // Векторда 0, 0, 0, 0 ,: Vectory <int> v {3, 0} болады; // Векторда 3, 0 бар 

Егер сіз қоңырау шалсаңыз Вектор Екі дәлелмен int. Тікелей инициализацияны қолданыңыз, бірінші дәлел вектордың өлшемін алады, ал екіншісі - элементтің мәні. Шығу - бұл үш нөлдің векторы. Егер дөңгелек кронштейндердің орнына сурет жазыңыз, содан кейін пайдаланыңыз инициал_ Өнім екі элементтің векторын, 3 және 0-ге ие болады.

Осы синтаксистің одан да біртүрлі әрекетінің мысалдары бар:

ЖЖБИ :: S жол (48, 'a'); // «Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa» STD :: жол с {48, «А»}; // «0а» 

Бірінші жол «A», ал екінші жолда «0а» жолында 48 таңбадан тұрады. Себебі, дизайнер Ішек Кірісті қабылдайды инициал_ Таңбалардан. 48 - бүтін сан, сондықтан ол символға айналады. ASCII-де, 48 саны - «0» символы. Бұл өте таңқаларлық, өйткені дәл осындай дәлелдерді қабылдаған дизайнер бар, int. и Char. . Бірақ бұл дизайнерді шақырудың орнына, мүлдем айқын емес өзгереді. Нәтижесінде, ол көбінесе өзін біз күткендей емес, кодты шығарады.

Шаблондарды пайдалану кезінде одан да қиындықтар туындайды. Бұл бағдарламаны не қайтарады деп ойлайсыз? Вектордың мөлшері қандай?

Үлгі <typeName t, size_t n> Авто Тест () {Return str :: int {n} {n}; of {n} {t> () {return test test test (std :: struct, stret, 3> (). Өлшем ();} 
Жасырын мәтін

Біз үш жолмен вектор аламыз, яғни жауап 3. бірақ егер Ішек ауыстырылды int. , жауап 1, өйткені ЖЖБИ :: Вектор <std :: int> пайдаланылады инициал_ . Шаблон параметріне байланысты, не дизайнер шақырылады инициал_ немесе басқа дизайнер. Және оның орнына Ішек немесе int. пайдалану қалқымалы. , Мен мұның бәрін білмеймін. Мұндай кодтың мінез-құлқын болжау өте қиын, және ол көптеген қолайсыздықтар туғызады. Мысалы, біз фигуралық жақшалармен агрегаттық түрлер үшін жұмыс істейтін EMPLE функциясын жаза алмаймыз. Жалпы, агрегатты инициализация және синтаксис {} Шаблондармен жұмыс жасамаңыз.

Енді дәл инициализация тізімін нақты анықтайық.

Жиынтық түрлері үшін, мұндай инициализациямен агрегат орындалады инициализация. Кіріктірілген түрлер үшін - тікелей инициализациялау ( {a} ) немесе

  1. Түймесін көшіру ( ЖЖБИ :: instinister_list. = {a}
  2. ); Сабақ үшін мұндай дәйектілік орындалады: Біріншіден, «ашкөздік» конструктор қоңырауымен орындалады, ол

.

Егер бұл қоңырау үшін айқын емес өзгерістер жасау қажет болса - олар орындалады. {a} Егер қолайлы дизайнер болмаса, әдеттегідей aҚоңыраулар дизайнері

() {} Шамадан тыс жүктеме рұқсатымен. инициал_ Екінші қадам үшін бірнеше ерекшелік бар. 1-жолю: пайдалану ?

тізімде бір элемент болған кезде 

. инициал_ Көшірме инициализацияны қолдануға болады. инициал_ 2-жол • Бос бұйра жақшалар, инициал_ .

Әдепкі дизайнермен және дизайнермен бірге тере берейік {} . Виджет () = Әдепкі и Қоңырау шалған кезде не болады Виджет <int> Виджет {} \

Виджет () = Әдепкі :

Template TypeName <t> Музыкалық виджет {Виджет (); Виджет (std :: std: sticeize_list <t>;}; int main () {виджет <int> Виджет {}; // Дизайнер қандай деп аталады?} 

Қоңырау шалған кезде не болады :

Біз дизайнерге қоңырау шалуды күтеміз 

Біз оны босатқан кезде int. пайдалану бұйра жақшада. Шын мәнінде, әдепкі дизайнер шақырылады. Тек дизайнер болмаған кезде, дизайнер қабылдау деп аталады . Егер мұндай құрылыс жоқ болса, инициализация жүзеге асырылады. Өкінішке орай, осы ережелерді сақтау керек.

Пайдаланылған кезде біз инициализацияны көбірек талдаймыз 

. Міне, қайтадан, қашан есте сақтау керек бұйра жақшада. Шын мәнінде, әдепкі дизайнер шақырылады. Тек дизайнер болмаған кезде, дизайнер қабылдау деп аталады Виджет () {}

Әр түрлі мінез-құлық бар - біз бұл туралы айттық. 

Микмин виджеті {Виджет () = әдепкі; i int i;}; int main () {виджет виджеті {}; // инициализация (нөл) (нөл), VEXING талдау ведомын виджет.i; // 0 қайтарады 0} Микмин виджеті {Виджет () {}; // пайдаланушыға int i;}; int main () {виджет виджеті {}; // баптандыру, әдепкі дизайнерді қайтару виджеті.i шақырылады; // инициализацияланбаған, ub} пайда болады Инициализация тізімінде пайдалы мүмкіндік бар: мәндер ауқымын тарылтуға рұқсат етілмейді (тар жіберу). Егер іске қосу үшін болса Микмин виджеті {Виджет () {}; // пайдаланушыға int i;}; int main () {виджет виджеті {}; // баптандыру, әдепкі дизайнерді қайтару виджеті.i шақырылады; // инициализацияланбаған, ub} пайда болады Қос.

Бұл суспензияны конверсиялау және бұл код құрастырылмаған: 

Int main () {int i {2.0}; // қате!}

Дәл солай, егер агрегаттық объект элементтер тізімімен басталса 

. Бұл инновация C ++ 11, және ол тілдің ескі нұсқаларында жазылған кодты жаңарту кезінде көбірек қателіктер тудырады. Бұл мұрагерлік кодтың үлкен көлемін қолдаумен көп жұмыс жасайды: инициал_ Құрылымдық виджет {int i; int j;}; int main () {виджет виджеті = {1.0, 0.0}; // C ++ 11-де қате C ++ 98/03} -ден айырмашылығы инициал_ Әрі қарай, сіз тізімді іске қосқан кезде, сіз бекітілген жақшаларды қолдануға болады, бірақ жиынтық инициализациядан айырмашылығы, сіз жетіспейтін жақшалармен жұмыс істемейсіз (жақша). Бір жағынан, ендірілген жақшаларды қолдану өте пайдалы, олар нақтылайды. Мысалы, бізде бар

карта инициал_ . Содан кейін сыртқы бұйра кронштейндер мұны бастайды инициал_ , және ішкі бұйра жақшалары - оның элементтері: Std :: std ::: std ::: std> my_map {{{{{{{{{{{}, 0}, {def ', 1}}}; Бірақ тек осы дизайннан зиян келтірілген жағдайлар бар. Мұндай істі қарастырайық: Ішек Std :: Векторлық :: VTIR <: string> v1 {{abc »,« Def »}; // OKST :: Векторлы :: VTER <std :: жол> v2 {{{abc »,« Def »}}; // ?? Char. Естеріңізге сала кетейік, бұл инициализация емес, бұл инициализация тізімі

. Бірінші жолда біз қолданамыз

  • Демек, екі жолдың ішінде, нәтижесінде ол екі жолдың векторы екені анық. Егер сіз бұл жақшаларды басқа екі бұйра жақшаға айналдырсаңыз, белгісіз мінез-құлық алынады. Неге екенін анықтауға тырысайық.
  • Сыртқы

Оның бір ғана элементі бар - ішкі

Сондықтан біз бір қатармен вектор аламыз. Бұл жол ішкі тізіммен екіге енгізіледі 

Const char *

. Ол шығады, В.

Итераторлар бар конструктор бар 

Бастау және аяқтау. Сонымен, бұл екі жол итераторларға айналады. Бұдан әрі оқу Басынан бастап, ол қарапайым емес жадқа және бағдарлама түседі.

Мораль:

Ішіндегі бұйра кронштейндермен тізімдерді оқыңыз;

Жиынтық түрі болмаса, сырғанау жұмыс істемейді. 

Ары қарай жылжу. Брондау тізімін беру және қайтару сонымен қатар тізімді көшіру арқылы ғана басталады. Бұл өте пайдалы мүлік: Виджет <int> f1 () {{{3, 0}; // көшірме-тізім} қайтару мәнін іске қосу} VOID F2 (виджет); F2 ({3, 0}); // Көшіру тізімінің аргументінің инициализациясы Егер мән қайтарылса, оны баптандыруды көшіру арқылы қолданады, сондықтан, сіз БРАЖАТТІ ТІЗІМДЕР ҚАЙТАРЫҢЫЗДАН, Тізімді көшіру үшін оны көшіру үшін пайдаланылады. Егер сіз БРАЖАЦИЯЛЫҚ тізімі мүмкіндіктерін берсеңіз, ол сонымен қатар тізімді көшіру арқылы басталады. Виджет <int> f1 () {{{3, 0}; // көшірме-тізім} қайтару мәнін іске қосу} VOID F2 (виджет); F2 ({3, 0}); // Көшіру тізімінің аргументінің инициализациясы Әрине, бұл жақшалардағы кейбір қиындықтарға әкеледі. Кэквер ағын жақында керемет пост болды, онда әр түрлі деңгейдегі функциялар қарастырылды. Барлық деңгейлердегі нәтижелер басқаша екені белгілі болды. Мен егжей-тегжейге шықпаймын, өйткені бәрі өте қиын, бірақ бұл фактінің өзі индикативті: ЖЖБИ :: instinister_list. :

#include <iOStream> {a () {} a (const A &) {}} {&} {}} {}}; scrist b {b (const A &) {&} {}}} {}}}; жарамсыз f (const A &) {std :: cout :: cout :: cout << «A» << Жұлдыз :: ENDL; } Run f (cont b &) {std :: cout << «b» << «std :: Endl; } int main () {a a; f ({a}); // a f ({{a}}); // Angrivubute F ({{{a}}); // b f ({{{a}}}}); // сәйкес функция} 

C ++ 14-тегі жақсартулар Сонымен, біз барлық нұсқалардан C ++ 11-ге дейін өттік. Біз өткен нұсқалардың барлық инициализациясын, сонымен қатар тізімнің ішкі көрінісін талқыладық, олар жиі нақты ережелерде жұмыс істейді. Қазір C ++ 14 туралы сөйлесіңіз. Онда бұрынғы нұсқалардан қолданылған кейбір мәселелер анықталды. Мысалы, C ++ 11-де, жиынтық сыныптар тікелей қажетсіз қиындықтар туғызған тікелей мүше бастапқы мүше бола алмады. Жоғарыда мен тікелей мүше жазылғандар үшін өте пайдалы деп айттым. C ++ 14-тен бастап, жиынтық сыныптар тікелей мүше бастапқы мүше болуы мүмкін: int. Микс виджеті {int i = 0; int j = 0;}; виджет виджеті {1, 2}; // C ++ 14 басталады Николайдың екінші абаттандыруы Бағдарламаның есебін атап өтті, ол байланысты АВТОМАТТЫ. Сонымен, біз барлық нұсқалардан C ++ 11-ге дейін өттік. Біз өткен нұсқалардың барлық инициализациясын, сонымен қатар тізімнің ішкі көрінісін талқыладық, олар жиі нақты ережелерде жұмыс істейді. Қазір C ++ 14 туралы сөйлесіңіз. Онда бұрынғы нұсқалардан қолданылған кейбір мәселелер анықталды. . Егер кейін C ++ 11-де болса int. Бронды-init-lies-та, әрқашан теруге әкелді INT I = 3; // интинт I (3); // INTINT I {3}; // Intint i = {{}; // Intauto i = 3; // Intauto i (3); // Intauto i {3}; // C ++ 11 - STD :: std :: instinister_list <int> auto i = {{}; // C ++ 11 - STD :: std :: insticaizer_list <int> Бұл мінез-құлық жағымсыз: олар жазған кезде Николайдың екінші абаттандыруы Бағдарламаның есебін атап өтті, ол байланысты Авто i {3} int. , көбінесе білдіреді инициал_ .

, бірақ жоқ 

ЖЖБИ :: sted: stostiant_list <int>

. C ++ 14-де бұл мінез өзгерді және

  • енді оқыңыз ЖЖБИ :: instinister_list. .

  • . Егер осы мысалдағы бұйра жақшаларда бірнеше мәндер, бұл код жасалмайды. Алайда, ЖЖБИ :: instinister_list. Auto i = {{}

  • Әрқашан оқыңыз . Көріп отырғаныңыздай, сәйкессіздік бұл жерде қалады: Тікелей инициализациялау бар немесе , және инициализацияны көшіру кезінде - Авто i = 3; // Intauto I (3); // Intauto i {3}; // c ++ 14 - int, бірақ тек бір элементала тізімінде жұмыс істейді, бірақ i = {3}; // STD болып қалады :: instinizer_list <int>

  • Соңында, статикалық инициализация мәселесі C ++ 14-де шешілді, бірақ бұл менің айтқандарымнан әлдеқайда маңызды болды және біз оған тоқтамаймыз. Егер тілегім болса, сіз бұл туралы өзіңіз оқи аласыз.

    • Осы түзетулерге қарамастан, C ++ 14-де, инициализация тізімінде көптеген проблемалар бар:
    • Дизайнер қабылдайтынын бірден түсінбейді
    • Өзімдікі
  • Тек түрлерімен жұмыс істемейді.

Практикалық синтаксис шаблондар үшін пайдасыз, сондықтан Эминет. Make_unique. Сіз жиынтық түрлер үшін пайдалана алмайсыз. Бізде бірнеше түсініксіз ережелер бар:

Бос бұйра борлар бос емес, басқаша ұстаңыз;

Кірістірілген бұйра кронштейндер түсініксіз жолмен жүреді;

Авто жұмыс әрқашан анық емес. int. Соңында, мен әлі күнге дейін тізімнің инициализациясы макростармен жұмыс істемейтінін айтпадым.

Макростар туралы мысал: ЖЖБИ :: instinister_list. Растау (виджет (2,3))

Орындалды, A.

Растау (виджет {2,3}) 

Алдын ала процессорды бұзады. Факт, макростың арнайы ережесі бар, ол дөңгелек жақшадағы үтірді дұрыс оқиды, бірақ ол фигуралар жақшалар үшін жаңартылмаған. Сондықтан, бұл мысалдағы үтір макростың бірінші дәлелінің соңы ретінде қарастырылады, дегенмен жақшалар әлі жабылмаған. Бұл сәтсіздікке әкеледі.

C ++ тілінде қалай баптауға болады 

C ++ тіліндегі мәндерді қалай дұрыс баптандыру туралы бірнеше кеңестер ұсына аламын. инициал_ Сияқты қарапайым түрлер үшін

Тексерумен инициализацияны, яғни теңдік пен құндылық белгісін пайдаланыңыз - бұл көптеген бағдарламалау тілдерінде жасалады және мұның бәрі бұған көну үшін қолданылады.

  • Суреттің жақшалары басқа жағдайларда жақсы: жиынтық инициализация үшін, дизайнерлерді қабылдауға шақыру Және тікелей мүшеге арналған түзетулер үшін. Соңғы жағдайда біз тікелей инициализация синтаксисін қолдана алмаймыз, сондықтан жақшалар сол жерде қолайлы.

  • Сонымен қатар, Vravenny нысандарын беру және қайтару үшін бұйра кронштейндерді қолдану ыңғайлы. Екі бос бұйра жақшаның көмегімен сіз уақытша объектінің мәнін тез бастай аласыз. и Құрылым нүктесі {int x = 0; int y = 0;}; setposition ({2, 3} нүктесі); Тапсырыс беру нүктесі (виджет {}); :

    • Сіз тіпті тип атауын өткізіп жіберіп, Брокетикалық тізімді пайдалана аласыз - ол тек бұйра жақшалармен жұмыс істейді.
    • SETPISITION ({2, 3}); Тапсырыс алушы ({}); ЖЖБИ :: instinister_list.
    • Бірақ егер сіз тек конструкторға қоңырау шалуыңыз керек болса, мен тікелей инициализацияны, яғни, классикалық синтаксисті қолданғанды ​​қалаймын. Көптеген адамдар менімен келіспейтіндігімен түсінемін - Николай бұған бұйра жақшаларды қолдануды жөн көреді деді. Меніңше, жақшалар айқын, сондықтан синтаксис функция шақырылған кезде бірдей және ол бірден анық анықталады, ол шамадан тыс жүктеме рұқсаты орындалады. Барлық ережелер мұнда айқын, ойланбаңыз, мұнда бар немесе жоқ . Менің ойымша, бұл тәсіл қарапайым және түсінікті: Мұндай кодты қараған кезде, ол не істейтінін бірден түсінікті. )
  • Тағы бір рет тізім: и {} = Мән.

  • . Менің ойымша, бұл тәсіл қарапайым және түсінікті: Мұндай кодты қараған кезде, ол не істейтінін бірден түсінікті. Қарапайым түрлер үшін

= {args} . Менің ойымша, бұл тәсіл қарапайым және түсінікті: Мұндай кодты қараған кезде, ол не істейтінін бірден түсінікті. = {} Виджет <int> f1 () {{{3, 0}; // көшірме-тізім} қайтару мәнін іске қосу} VOID F2 (виджет); F2 ({3, 0}); // Көшіру тізімінің аргументінің инициализациясы Жиынтық баптандыру үшін Дизайнерлер үшін. Тікелей мүшені баптандыру үшін (сіз олармен бірге пайдалана алмайсыз)

(ARGS) 

{ARGS}

Vrément объектілерін беру және қайтару үшін 

Құрылысшыларды шақыру үшін Рас, қолданған кезде :

Бізге талғампаз таланады. Бірақ бұл есепте тағы бір кеңес бар. 2013 жылы елтаңба сарайлары 2013 жылы мақаланы жазды, онда жаңа нысанды баптау кезінде әрдайым дерлік пайдалану керек деп айтылған 

. Бұл кеңес маған дұрыс болып көрінеді, өйткені бұл жағдайда барлық айнымалылар әрдайым басталады: сіз жаза алмайсыз

Авто i; 

- Бұл компиляциялық қателікке әкеледі. Егер сіз түрді көрсетуіңіз керек болса, оны өрнектің оң жағында жасауға болады: Виджет <int> f1 () {{{3, 0}; // көшірме-тізім} қайтару мәнін іске қосу} VOID F2 (виджет); F2 ({3, 0}); // Көшіру тізімінің аргументінің инициализациясы Авто виджет = Виджет (2, 3); Виджет <int> f1 () {{{3, 0}; // көшірме-тізім} қайтару мәнін іске қосу} VOID F2 (виджет); F2 ({3, 0}); // Көшіру тізімінің аргументінің инициализациясы Бұл нүкте бірдей, бірақ сондықтан сіз айнымалыны баптауды ешқашан ұмытпайсыз. Сонымен қатар, егер сіз осы ұсынысты ұстанып, өрнектің оң жағына жазсаңыз, вексинг талабының мәселесі туындамайды:

Auto The Swoad = zine ();

Бастапқыда, бұл ереже «әрдайым дерлік автоматты түрде» («Auto», AAA) түрінде тұжырымдалған, өйткені c ++ 11 және c ++ 14-де, мысалы, осындай жазбамен, мысалы, әрдайым жиналмады , жағдайында

ЖЖБИ :: Атомдық <int> Авто санау = ЖЖБИ :: Атомдық <int> (0); // c ++ 11/14: Қате // std :: Атомдық көшірме көшірмесі де, жылжымалы да болмайды Бұл атомды жылжыту және көшіру мүмкін емес. Біздің синтаксисімізде көшіру және жылжу болған жоқ, қарамастан, тиісті дизайнер қолданылып, оған қоңырау шалу әлі де болды, тіпті оған қоңырау шалу мүмкін болмады. C ++ 17-де, бұл проблема шешілді, жаңа мүлік қосылды, оны кепілдендірілген көшірме PASS деп атайды (кепілдендірілген көшірме):

Авто санау = ЖЖБИ :: Атомдық <int> (0); // c ++ 17: Жарайды, кепілдендірілген көшірмені жою 

Сондықтан қазір сізге әрқашан қолдануға кеңес беремін а и с. Жалғыз ерекшелік - тікелей мүше бастауыштар. Сабақ элементтері bХабарлау мүмкін емес.

CTAD (CLAME шаблонының аргументі) C ++ 17-ге қосылды. Бұл меншіктің біртүрлі және инициализация үшін әрдайым айқын әсер етпейді. Бұл тақырып «Бағдарлама» есебінде Николайға әсер етті. Сонымен қатар, өткен жылы мен CPPCon туралы есеппен сөйлестім, толығымен CTAD-ке бөлдім, онда бұдан да көп нәрсе туралы айтылады. Үлкен, C ++ 17-де жағдай C ++ 11 және C ++ 14-тегі, с ++ 14-тегі, ал кейбіреулер ең қолайсыз ақаулардың кейбіреулерінен басқа. Инициализация тізімі қазір өткен нұсқалардан гөрі жақсы жұмыс істейді, бірақ менің ойымша, оны әлі де жақсартуға болады.

Тағайындалған инициализация (c ++ 20)

  • Енді C ++ 20 туралы сөйлесейік, яғни алдағы өзгерістер туралы. Ия, сіз осы жаңа стандартта нысандарды іске қосудың тағы бір тәсілі пайда болды деп болжайсыз:

    Тағайындалған инициализация 

    (Тағайындалған инициализация):

  • Құрылымдық виджет {int a; int b; Int c;}; int main () int main () {виджет виджеті {.a = 3, .c = 7};}; Негізінде бұл басқа синтаксисті инициализациялау. Жиынтық инициализация жағдайында біз элементтердің басында элементтерді көрсетеміз, ал кейбіреулер соңында қабылданбаған болса, олар үшін нөлдік инициализация қолданылады. Сіз элементтердің кез-келген жиынды тағайындалған инициализациямен баптай аласыз, ал нөлдік инициализация басқаларға қолданылады. Жоғарыдағы мысалда мысал іске қосылады. , және нөлге тең. :

    Бұл тәсілдің маңызды артықшылығы мынада, мұнда, инициализация кезінде, біріктірілген айнымалылар болуы мүмкін. Мұндай баптандыру тек жиынтық түрлерімен ғана жұмыс істейді, яғни, бұл агрегатты баптандырудың тағы бір синтаксисі. 
  • Ол С үйлесімділігі үшін жасалды және C99 сияқты жұмыс істейді, олар қандай да бір ерекшеліктермен:

    C-де элементтердің ретін сақтаудың қажеті жоқ, яғни біздің мысалда, сіз алдымен C, содан кейін a инициалай аласыз. C ++ тілінде мұны істеу мүмкін емес, өйткені заттар олар жарияланған ретпен жасалған. : 
  • Виджет виджеті {.c = 7, .a = 3}; // Қате

    Өкінішке орай, бұл дизайнның қолданылуын шектейді. 

C ++ тілінде бұл дизайнды рекурсивті түрде пайдалану мүмкін емес, яғни, жазу мүмкін емес

{.c.e = 7};

Сіз жаза аласыз

{.c {.e = 7}} 

Виджет виджеті {.c.e = 7}; // Қате

C ++ тілінде бір уақытта тағайындалған және тұрақты инициализацияны қолдану мүмкін емес, бірақ мен өзім үшін жағдайды ойластыру қиынға соғады: жаңа Виджет виджеті {.a = 3, 7}; // Қате жаңа :

C ++ тілінде инициализацияның бұл түрін массивтермен пайдалануға болмайды. Бірақ, тағы да, оны мүлдем жасау керек деп ойламаймын. 

Int arr [3] {. [1] = 7}; // Қате

C ++ 20-да түзетулер

C ++ 20-да инициализацияның жаңа түріне қосымша, алдыңғы нұсқалардан кейбір заттар түзеледі, ал осы өзгерістердің кейбірі маған ұсынылды. Біз олардың біреуін талқылаймыз (wg21.link/p1008).

Әдепкі дизайнер c ++ 17-де жойылған кезде, бұл кодтың авторы объектінің даналарын жасауға тыйымғысы келетінін білдіруі мүмкін. Қашықтандырылған түрдегі агрегаттық түрлерде, әдепкі бойынша, әдепкі инициализация қате береді, бірақ жиынтық инициализация жұмыс істейді және бұл бізге сыныптың авторы жасаған дизайнерді айналып өтуге мүмкіндік береді: 

Құрылым виджеті {Widget () = Жою; INT I; int j;}; виджет виджеті1; // қате виджетінің виджеті2 {}; // C ++ 17-де жұмыс істейді, бірақ C ++ 20-да қате болады . Көріп отырғаныңыздай, сәйкессіздік бұл жерде қалады: Тікелей инициализациялау бар и , және инициализацияны көшіру кезінде - Бұл өте біртүрлі мінез, көбінесе ол туралы адамдар білмейді, сондықтан бұл алдын-ала болжанбайтын салдарларға әкеледі. C ++ 20-да ережелер өзгереді. Дизайнерді декларациялау кезінде түрі енді агрегат емес, сондықтан дизайнерлер мен агрегаттарды инициализациялау енді бір-бірімен жанжалға кірмейді. Меніңше, бұл дұрыс шешім. Егер сыныпта дизайнер болмаса, бұл агрегаттық түрі, ал егер мұндай дизайнер болса, бұл агрегат емес. Виджет <int> f1 () {{{3, 0}; // көшірме-тізім} қайтару мәнін іске қосу} VOID F2 (виджет); F2 ({3, 0}); // Көшіру тізімінің аргументінің инициализациясы Мен ұсынған тағы бір өзгеріс енгізілді (wg21.link/p1009). Бронды-init-тізімін өрнектерде қолдануға болады. Сондықтан олар жиі сұрайды: олар қарапайым инициализация сияқты осы өрнектерде жұмыс істейді ма? Әдетте - Иә, бірақ жағымсыз ерекшелік бар: Бронды-тізім өрнектердегі мөлшерді шығармайды .

{] {1, 2, 3}; // okdouble * p = Жаңа екі есе [] {1, 2, 3}; // C ++ 17-де қате, C ++ 20-да табыңыз 

Бұл туралы қарапайым тізім C ++ 11-де жасалған кезде ұмытып кетті. C ++ тілінде ол бекітіледі. Бұл мәселеге көптеген адамдар кездескені екіталай, бірақ оны тілдің бірізділігіне түзету пайдалы.

Жиынтық түрлерін тікелей баптандыру (C ++ 20) 

Соңында, басқа баптандыру әдісі C ++ 20-ге қосылады. Мен қазірдің өзінде инициализация тізіміне ыңғайсыздық туралы айттым, олардың ішінде, атап айтқанда, оны шаблондармен және макростармен пайдалану жағымсыз. C ++ 20-да, бұл түзетіледі: агрегаттық түрлер үшін тікелей инициализацияны қолдануға болады (wg21.link/p0960). инициал_ Құрылымдық виджет {int i; int j;}; виджет виджеті (1, 2); // C ++ 20-да табыңыз

Яғни, сіз инициализация үшін бұйра орнына дөңгелек кронштейндер жаза аласыз. Бұл агрегаттық түрлер үшін қолдануға болатындығын білдіреді Виджет <int> f1 () {{{3, 0}; // көшірме-тізім} қайтару мәнін іске қосу} VOID F2 (виджет); F2 ({3, 0}); // Көшіру тізімінің аргументінің инициализациясы . Бұл кітапханалар жазу кезінде өте маңызды. Мен тағы да есімде: әрқашан қолданыңыз

Яғни, алдыңғы мысал, мен келесідей жазуды ұсынамын:

58.11

Құрылымдық виджет {int i; int j;}; авто виджет = виджет (1, 2);

Сонымен қатар, бұл жаңа мүмкіндік массивтермен жұмыс істейді:

Бұл кезеңде инициализация аяқталды. Бұл жағдайда инициализация дегеніміз не? Бұл кейбіреулерге сәйкес, біртұтас процесс емес, қатты дискінің параметрлерін орнату шаралары жиынтығы.

Int arr [3] (0, 1, 2);

Менің ойымша, бұл өте маңызды: оны біркелкі баптандыру 2.0 деп атайық. Біртектілік тағы бір рет жетеді. Егер агрегатты баптандыруды бұйра және дөңгелек жақшалармен орындауға болады, содан кейін, мәні бойынша дөңгелек және бұйра жақшалар бірдей болады. Ерекшелік - дизайнер

Басып шығару ішкі жүйесі үшін инициализация процесі қай құрылғыны пайдаланатынын және оған сигнал беретіннен кейін, оның мүмкіндіктерін сканерлеу, оның мүмкіндіктерін сканерлеу, соның да, белгілі бір түстерді, қолдау көрсетілетін басып шығару форматтарын қолданады, Максималды ажыратымдылық және т.б.

: Егер сізге қоңырау шалу қажет болса, егер ол болмаса, бұйра жақшаларды қолдану керек. Бұл сізге қажет нәрсені біржақты түрде көрсетуге мүмкіндік береді. Сонымен қатар, бұйра кронштейндер әлі де тоқтатылуды тоқтатпайды, ал айналмалы болады. Бұл конструктордың сын-қатерлерімен біртектілік үшін жасалады.

  1. Сонымен, біз тағы да ұсыныстарымды қайталаймыз. Әрқашан тікелей мүшелерді бастауыштарды қолданыңыз. Әрқашан қолданыңыз
  2. . Дизайнерге қоңырау шалу үшін мен тікелей мүшені бастауыштарды қалаймын - бұл меніңше, бұл кодты анық көрсетеді. Бірақ мен бұл мәселе бойынша көптеген пікірлерді ұстанатынын түсінемін. Сайып келгенде, таңдау сіздікі - бұл сіздердің барлық ережелеріңізді білесіз.
  3. Мен бүгін біз талқылағанның бәрін дастарханнан шығардым. Осы кестедегі жолдар әртүрлі түрлер, ал бағандар инициализация синтациялары болып табылады. Менде бәрі бар, назарларыңызға көп рахмет.

Жақында, қазан айының соңында, Тимур C ++ Russia 2019 PiTity-ге келеді және «C ++ заманындағы жаза» баяндамасымен орындалады. Тимур C ++ 20-да ұсынылған жаңа әдістер туралы айтып береді және оларды қалай қауіпсіз пайдалану керектігін көрсетеді және C ++ тіліндегі «тесіктерді» біледі және олардың қалай жабысып қалуы мүмкін екенін түсіндіреді.

Бұл параметрлер басып шығару ішкі жүйесін орнату үшін қолданылады. Осылайша, бастапқы күйде ұсынылған принтер дұрыс және ақауларсыз жұмыс істейді.

Бағдарламалық өнімдерді құру кезінде барлық қажетті терминологиямен нақты және тиімді жұмыс істеу керек. Мысалы, мысалы, инициализация сияқты осындай сөзді алыңыз. Ол не екенін білесің бе? Мен күмәнданамын, әйтпесе сіз осы мақаланы оқымайсыз. Сондықтан, осы терминнің нені білдіретінін қарастырайық, қандай түрлері бар және біз электрониканы қолданған кезде пайда болуы мүмкін бірнеше мәселелерді талдаймыз.

Инициализация деген не?

Осылайша, жұмысқа дайындық, іске қосу, дайындық процестерін және қолданбаның қатаң және қатесіз жұмыс істеуі үшін қажетті параметрлерді анықтау процестерін шақырыңыз. Бұл кез-келген құрылғыны немесе бағдарламаны оны қолдануға болатын кез-келген құрылғыны немесе бағдарламаны әкелу үшін міндетті қадам. Инициализация әрекетін сыртқы жағынан әсер ету объектісіне қатысты бағыттауға болады. Көп жағдайда, қажетті параметрлерді, сондай-ақ бағдарлама жұмыс істейтін жұмыс ережелерін теңшеу туралы ғана түсініледі.

Мысалдар

Инициализация деген не екенін қарастырайық. Бұл не? Бұл түсінудің ең оңай әдісін түсінеді, бірнеше нақты мысалдарды қолдану:

Мобильді құрылғыларда баптандыру

Винчестердің магниттік дискісін баптандыру оның форматтауын түсінеді. Оны осы жерге басқару ақпаратын жазу (дыбыс тегтері, трек, дескриптор және ұқсас манипуляциялар) жіберілуі мүмкін.

Бағдарламаны іске қосу кезінде бағдарламалық айнымалы мәндер немесе бағдарламалық айнымалы мәндер (есептегіштер, мекен-жайлар, мекен-жайлар, мекен-жайлар, қосқыштар, көрсеткіштер), бағдарламаның өзі орындалмас бұрын. Бәрі бағдарламалық жасақтаманың осы түрі үшін жасалған немесе файлдың өзіндегі нұсқаулар түрінде орнатылғанына сәйкес орнатылады. Мобильді жабдыққа келетін болсақ, инициализациялау жолы көбінесе осы жерде қолданылады, онда мобильді оператор арқылы Интернет қосылымын теңшеу кезінде модем параметрлері тағайындалады.

Басып шығару ішкі жүйесінің деректерін деректер принтеріне көрсету үшін. Бұл анықтаманы анықтайтын анықтама: деректерді қағазға беру және барлық қажетті есепке алу қажет. Сонымен, басып шығару форматын анықтаңыз, ұзартқыш, түсі (бар болса) және басқа параметрлер. Біріншіден, құрылғыға басқару сигналы және принтер конфигурациясын жасау үшін оның мүмкіндіктерін сканерлеу және пайдаланушыға бар әдіс қолдануға болатын нұсқаны ұсынады.

Бірақ қазір қолданбаны іске қосу тәжірибесінде істі қарастырайық. Ойынды бастаған кезде инициализация қатесі бар делік. Sims 3 базасы ретінде таңдалды - сіз оны өзіңізбен бірге басқарғыңыз келетін, оған сенімді өмір сүргіңіз келіп түскен жеткілікті. Мәселенің ең көп таралған нұсқасы - 0 × 0175DCBB. Бұл сан қосымшаның инициализациясын көрсету үшін қолданылады. Бұл негізгі ойын компьютерге орнатылған толықтыруларға, MODS және бейне карточкаларын жүргізушілерге қайшы келетіндіктен туындауы мүмкін. Сонымен қатар, сізде лицензияланған ойын сатып алғанда да сақтанбағаныңыз - егер мәселе болса, лицензия оның автоматты шешіміне әкелмейді. Егер қате 0 × 0175DCBB болса, не істеу керек?

Сонымен, қате пайда болды. Енді оны қалай алып тастауға болатынын анықтаймыз. Біз ойынды қарастырамыз Есіңізде болсын, ең көне проблема - архаикалық бағдарламалық жасақтама компоненттері. Біріншіден, бізді бейне карта драйверлеріне қызықтырады. Оларды біз жасаған өндірушілердің сайттарында жүктей аламыз. Сондай-ақ, Net Framework бағдарламасының соңғы нұсқасын орнату немесе жаңарту қажет, оны жасаушы ресурстарынан, ол Microsoft корпорациясы ұсынған жөн. Енді біз ақаулықтың ең танымал себептерін атап өтеміз: үшінші тарап әзірлеушілері жазған қосымша сән. Мұндай жағдайларда, алас, кеңейтімді алып тастауға тура келеді. Егер сізде ақпарат болса, сіз мұны қаламасаңыз, сіз Mods қалтасының атын өзгерте аласыз. Орнатқаннан кейін қате пайда болған кезде, бағдарламаның өзі жойғыштың көмегімен алып тастауыңыз керек және қайта орнатыңыз. Егер бәрі көмектеспесе (және және ол жиі болады), содан кейін сіз ойынның өзі болған кезде диск зақымдалған деген қорытынды жасай аласыз. Және жалғыз уағыздау шешімі - оны айырбастау (немесе қарақшылық нұсқаны жүктеледі). Қорытынды

Компьютерде не орнату керек, тек сізді шешіңіз. Бірақ қазір, қазір, үшінші тараптар әзірлемес бұрын, тұрақты жұмыс істейтін өнімді жасағанға дейін жақсы ойлау керек және жүктелген қоспалар сапасына маңызды күтім жасау керек. Себебі жаңартуды бастау қатесі болуы мүмкін, ал кері қайтару мүмкіндігі әдетте берілмейді. Содан кейін сіз бүкіл бағдарламаны жою және оны қайтадан орнатуыңыз керек. Егер бұны шешсе, онда жинақталған мәліметтердің қауіпсіздігін қамтамасыз ету қажет болады. Олардың көшірмесі қауіпсіз және оқшауланған жерде, мысалы, жұмыс үстеліндегі немесе флэш-дискіде орналастырылуы керек. Мұның бәрі, біз егжей-тегжейлі инициализацияны қарастырдық. Бұл сіз түсінген нәрсе. Өйткені, біз тек мәтін компонентін ғана емес, сонымен қатар бірнеше нақты мысалдар қарастырылдық.

Компьютерлік техниканы және мобильді гаджеттерді қолданатын пайдаланушылар инициализациямен бірдей мерзімге тап болады. Осы мақалада біз оның қолданылу процесі мен аймағы үшін не екенін егжей-тегжейлі зерделеуге тырысамыз.

Іске қосу дегеніміз не

  • Осы тұжырымдама жұмысқа дайындалу және қатесіз жұмыс істеуге арналған қосымшаларды жою параметрлерін анықтауға арналған. Оның әрекеті қағидаты сыртқы жағынан, басталған нысанға қатысты бағытталған. Біріншіден, бұл процедура Орнатуға жауапты Бағдарламалық жасақтама жасалатын белгілі бір параметрлер мен ережелер.
  • Сондай-ақ, аппараттық құралдарды баптандыру деген тұжырымдама бар. Жеке компьютерді жүктеу мысалында оны қарастырған дұрыс: ДК қуат торына қосылған кезде, ол ешқандай функцияларды жасамаса, контроллерлер мен чиптер кездейсоқ сандық тізбектерден тұрады, ал процессор көрсетілген кодты орындамайды. ДК жүктеу ;
  • Процессор «RESET» пәрменін орындауы керек. Орындалғаннан кейін контроллерлер көрсетілген кодты орындауды бастайды және ол белсенді жадтың арнайы қоймасында жазылады (ROM). ROM-да сақталған деректер BIOS-ге жіберіледі, онда олар компьютерге қосылған сыртқы құрылғыларды басқару үшін пайдаланылады. Аппараттық құралдарды баптандыру жүйеге қосылған құрылғылардың түрлерін анықтауға және олардың жұмысын тексеруге көмектесетін маңызды процедура болып табылады.
  • Инициализация бағыттары Бірнеше бағыт бар:

инициализация

Бағдарламалар мен қосымшалар

барлық түрлері;

Қатты магниттік дискілер Құрылғылар мен ішкі жүйелер Әдетте, енгізілген мән әрқашан бірдей типке ие - AT + CGDCONT = 1, «IP», «Оператордың аты немесе оның Интернет-ресурсы». Бірақ бұл тек қосылған мобильді құрылғы модемі арқылы компьютерде Интернетке кіруі керек болған жағдайларда ғана қолданылады.

Басып шығару;

Өтініштер мен модемдер Мобильді құрылғыларда. Іске қосу қолданылатын жерде

Әрі қарай егжей-тегжейлі талқыланады, бұл процедура қандай жағдайларда қолданылады. Шын мәнінде, мұндай опциялар мен жеке оқиғалар әлдеқайда көп, мысалы, флеш ойнатқышты баптау, мысалы, жазу, сканер қосылған кезде маршрутизатор, драйверді бақылау. Бірақ біз тек негізгі жағдайларды қарастырамыз.

Бағдарламалар Бағдарламаның инициализациясы айнымалылардың бастапқы мәндерін орнатуды немесе осы параметрлерді компьютерде жұмыс істемес бұрын нөлге келтіруді білдіреді. Тиісті орындау үшін параметрлер жиі кездеседі Арнайы конфигурация файлы Инициализация қателері және жою әдістері

Орнатумен бірге.

Қатты диск Қатты дискіні баптандыру үшін оны басқа файлдық жүйенің пішіміне пішімдеуге болады, бөлім немесе дыбыс деңгейі. Айта кету керек, бұл процедура қажет Параметрлер параметрлері Соңында, барлық мысалдарда инициализация қателері пайда болуы мүмкін. Мұндай жағдайда не істеу керек? Алынбалы тасымалдағыштарға арналған қатты дискілер немесе құрылғылар болған кезде, ең оңай шығу жолы аналық платаға қосылыстарды тексереді.

Жаңа қатты диск. Бұл жабдықты өткізгіште көрсетілмеген жағдайларда қажет.

Ішкі жүйе Басып шығару ішкі жүйелеріне инициализациялау пайдаланушының қағазға кез-келген құжаттың басып шығаруы қажет болған жағдайларда қажет. Бұл сыртқы басып шығару құрылғысын - принтерді қажет етеді. Процесс қажет болған жағдайда қажет Бастапқы параметрлерді анықтаңыз

. Жүйе құрылғыға жатады және оның мүмкіндіктерін сканерлеу сигнал береді. Процедураның соңында пайдаланушыға жабдық жасай алатын басып шығару опциясы ұсынылады.

Телефонда

Телефондағы баптандыру, әдетте, SIM картасы параметрлері, SMS хабарламалар мен қосымшалардың анықтамасына байланысты. Әдетте ол мобильді жүйені алғаш бастаған кезде немесе бағдарламаларды орнатқан кезде болады. Егер хабарлама телефонда пайда болса

Күте тұрыңыз, инициализация жүреді «Бұл бағдарламалық жасақтама конфигурацияланғанын білдіреді. Бұл телефонды модемге немесе маршрутизаторға қосқан кезде, желілік параметрлерді анықтау мүмкін. Инициализациялау Ең көп таралған бағдарламалар - бұл 0x0175DCBB коды бар ақаулық (мысалы, Sims 3 ойынында). Мәселе, негізінен, құрылғы драйверлерінің қақтығыстарына, олардың болмауын немесе дұрыс емес орнатуға, жедел жүйенің жұмыссыздығына және т.с.с., кейде бұл проблема жаңартуды орнатқыңыз келетін .NET Framework платформасында болуы мүмкін. Мүмкін сәтсіздік тасымалдаушының зақымдануымен байланысты шығар, мысалы, ойын басталады. Жалпы, сіз не болатынын ешқашан білмейсіз. Бірақ бұл мәселенің шешімі жағдайды бағалау негізінде жасалуы керек және себептердің бұзылғанына себеп болуы керек.

Бұл процедура Интернеттен кез-келген файлды жүктеген кезде, мысалы, Интернет-шолғыш арқылы басталады. Сонымен бірге, жүктеуші файлдары мен жүктелген файлдар орналасқан сервер арасында пакеттер деректері ауыстырылады. Жүктеуден бұрын, шолғыш нысанды іске қосуға мүмкіндік береді және іске қосады, оны жүктеуге мүмкіндік береді. Компьютерден табу, ол

Жүйемен талданған Бастау және орнату үшін параметрлер мен шарттар жасаңыз. Жиі инициализация қателері

Көбінесе, пайдаланушыларда әр түрлі қателер бар. Қатені баптандыру синхрондау немесе тексеру процесі сәтсіздігін ұсынады. Содан кейін әр түрлі құрылғылардың иелері арасында инициализациялаудың негізгі проблемалары егжей-тегжейлі талқыланады.

Қате 0 × 0175DCBB қатесі Бұл сіз басқа ойындарда SIMS 3 ойынын бастағанда пайда болады. Байланысты Үшінші тарап модулдерін орнату арқылы Бағдарламаны баптандыру қалай

графикалық драйвердің дұрыс емес конфигурациясы бар. Шешім - драйверді кеңейтуді және қайта орнатуды жою.

Басып шығару қатесі: ағымдағы принтерді баптандыру қателері Көбінесе пайда болады Жүргізушілерді орнатқан кезде Wi-Fi арқылы принтер. Орнатудың соңында драйверді орнату кезінде «Құрылғыны баптандыру» терезесі пайда болады. Шешім USB драйверін орнату болады. Ошибки 3D

Бетті баптандыру қатесі

Бұл ақаулық Windows Server амалдық жүйесінің пайдаланушыларында кездеседі. Ол жұмыс жинағымен байланысты Қорғалған сақтау қызметі . Түзету жеткілікті, сіз жай ғана қызметті қайта іске қосуыңыз және компьютерді қайта іске қосуыңыз керек, ақаулық жойылады. Проблемы с Хромом

3D көрсетуді бастау сәтсіз аяқталды (3D көрсетуді баптау сәтсіз аяқталды)

Бұл ескерту дұрыс емес жұмыспен байланысты. Жүргізушілер 3. D-үдеткіш Неисправности сим карты

Инициализация - это что такое?. Осы модульді қолданатын қосымшалар оны жай анықтай алмайды. Мәселе жойылды, жай жойылады, құрылғы менеджеріндегі бейне карточканы қайта іске қосыңыз немесе қайта орнатыңыз.

Onnex баптандыру қатесі 0xc0000005

Осыған ұқсас хабарлама, сонымен қатар алдыңғы, сонымен қатар графикалық үдеткішпен байланысты. Іске қосу кезінде өтініш

Жедел жадқа апелляция жасайды

Және бас тартуды алады, өйткені оған қол жеткізілген. Қол жетімділікті амалдық жүйенің өзі және бейне конфигурациясы қатесі ретінде бұғаттауға болады. Бұл ақаулық сақталмаған кезде драйверді қайта орнату немесе жүйені қалпына келтіру керек.

SIM картасын баптандыру қатесі

Бұл сәтсіздік смартфондардың иелерінен табылған. Біраз уақыттан кейін, смартфонды бастағаннан кейін қате пайда болады - іске қосу немесе ұқсас. Бұл телефонның дәлелі

Орнатылған картаны көрмейді

. Бұл бағдарламалық жасақтаманың да, аппараттық құралдарының салдары болуы мүмкін. Мәселені шешу үшін құрылғыны қайта іске қосу немесе карточканы басқа ұяға салу керек.

Инициализация деген не екенін қарастырайық. Бұл не? Бұл түсінудің ең оңай әдісін түсінеді, бірнеше нақты мысалдарды қолдану:

Бағдарламалар құру кезінде сізде компьютер терминологиясының негізгі шарттары болуы керек. Мысалы, инициализация термині. Сіз оның нені білдіретінін білесіз бе? Оның мағынасымен күресу сізге осы мақалаға көмектеседі. Бұл терминнің аясында кәсіпқойлар бойынша, инициализацияның қандай түрлері болып табылады және біз оны осы процеске байланысты ең көп кездесетін мәселелермен анықтаймыз.

Инициализация дегеніміз не?

Бұл термин бүгінде активтендіру, құру, жұмысқа дайындық, қолданбаның сапалы және жетілдірілмейтін жұмысы үшін қажетті параметрлерді анықтайды. Инициализация - бұл кез-келген бағдарламаны немесе құрылғыны пайдалану күйіне келтіруге міндетті қадам. Инициализация процедурасының жұмыс принципі объектінің сыртынан бағытталған. Көбінесе бұл сөз қажетті параметрлерді теңшеу процесі, сонымен қатар осы бағдарлама жұмыс істейтін негізгі жұмыс ережелерінің тапсырмасымен жасалған.

Инициализация: мысалдар

инициализация что такое

Инициализация деген не екенін көрейік. Бұл сұраққа қатысты ең оңай әдіс визуалды мысалдарда болады.

1. Қатты дискіні баптандыру форматтау процесі болып табылады. Сондай-ақ, сонымен қатар, дыбыс деңгейі, трон дескрипторлары және басқа да манипуляциялар сияқты бақылау ақпаратын жазуды қамтуы мүмкін. Бағдарламаны баптандыру қажетті айнымалылардың тапсырмасын және метрлер, мекенжайлар мен қосқыштар сияқты бағдарламалық айнымалы мәндерді, нөлдік мәнге дейін орнатуды қарастырады. Ол барлығы осы типтегі бағдарламалық жасақтама үшін не істеу керек? Орнату нұсқаулары файл файлында болуы мүмкін. Принтерді көрсету үшін басып шығару ішкі жүйесін баптандыру. Бұл жұмыс мыналарды білдіреді: кейбір құрылғыны пайдаланып деректерді қағазға беру керек және барлық қажетті есепке алу керек. Мысалы, ұзартқыш, қағаз түрін және басқа да көптеген параметрлерді анықтау қажет. Біріншіден, арнайы басқару сигналы құрылғыға беріледі, содан кейін оның мүмкіндіктері сканерленеді. Бұл бастапқыда басып шығару құрылғысын конфигурациялау және пайдаланушыға осы технологияның осы түрін жүзеге асыру үшін ұсынылған опциясын ұсынады.

Іс жүзінде қолдануға арналған іс-әрекетте қарастыру. Компьютерлік ойынды бастағанда, инициализация қатесі пайда болады делік. Мысал ретінде ойын SIMS 3. Бұл қосымша танымал. Бұл жағдайда қателіктерді не себептермен бастауы мүмкін? Мұндай проблеманың ең көп таралған нұсқасы - 0x0175DCBB коды бар қате. Бұл сан қолданбаны баптандырумен байланысты қате нөмірін белгілеу үшін қолданылады. Бұл ойын жүргізушілермен, толықтырулармен және режимдермен байланысты болғандықтан жиі кездеседі. Тіпті лицензияланған ойындарды қолданған пайдаланушылар да осы проблемадан өтті.

Лицензия мұндай проблемаларды автоматты түрде шешуге әкелмейді. Инициализация қатесі болған кезде не істеу керек? Осындай қатені қалай жою керектігін анықтаймыз. Бұл жағдайда біз ойынды қарастырамыз, бірақ ұсынылған ұсыныстар өте пайдалы болады және көп қырлы өтініштермен жұмыс жасағанда. Есіңізде болсын, ең көне проблема - бағдарламаның архаикалық компонентін қолдану. Біріншіден, бізді бейне карта жүргізушілері қызықтырады. Оларды өндірушінің ресми сайтынан жүктеуге болады. NetFromems бағдарламасын әлі де соңғы нұсқаға орната аламыз. Бұл компонентті ресми әзірлеуші ​​сайттағы - Microsoft корпорациясынан жүктеген жөн.

  • Бұл проблеманың ең танымал себептерін қарастырыңыз: бұл үшінші тарап әзірлеушілері жазған қосымша режимдер. Бұл жағдайда, өкінішке орай, кеңеюді алып тастау керек. Егер сіз бұл туралы ақпарат болса, сіз мұны қаламасаңыз, сіз MoDs қалтасының атын өзгертуге тырыса аласыз. Егер бұл қате пайда болса, орнатқаннан кейін, бағдарламаны жою арқылы жоюға болады, содан кейін бағдарламаны қайта орнатуға тырысыңыз. Егер бұл шара көмектеспесе, диск зақымдалған, ол ойын жазылады. Бұл жағдайда оны тек ақылға қонымды шешім өзгертеді.
  • Жеке компьютерде не орнату керектігін шешу керек. Бірақ үшінші тарап әзірлеушілері жасаған компьютерге мазмұн қоспас бұрын, жүктелетін толықтырулардың сапасына ерекше күтім жасау ұсынылады. Жаңартуды баптандыру қатесі мүмкін. Әдетте, бұл жағдайда қайта оралу мүмкіндігі берілмейді. Содан кейін сіз осы бағдарламаны жоюыңыз керек және оны қайта орнатыңыз. Егер сіз мұны шешсеңіз, сіз проблемалы ақпараттың қауіпсіздігін бөлек қарауыңыз керек. Деректердің көшірмесі қауіпсіз жерге, мысалы, флэш-дискіде орналастырылуы керек.
  • Компьютер мен мобильді жабдықтардың көптеген пайдаланушылары көбінесе «инициализация» терминімен кездеседі. Инициализация дегеніміз не, көбінесе аз адамдар қатысады. Сондықтан, осы алшақтықты білуге, нақты мысалдар келтірген жөн.
  • Инициализация - жалпы түсінігілер

Инициализация жағдайында көптеген құрметті Интернет-ресурстар ұсынатын, конфигурацияны, жұмыс істеуге, активтендіру процестеріне және т.б. анықтауға негізделген, кейде бұл термин бастама деп аталады, бірақ оның түсіндіруі жаратылыстарға сәйкес келеді , іске қосу немесе не бастау.

Бастапқы, көрсетілген параметрлерді немесе олардың мәндерін анықтау процесі ретінде, бағдарламалық жасақтамаға және компьютерлік жүйенің аппараттық құрамдас бөліктеріне бірдей қолданылуы мүмкін.

Әр нақты жағдайда инициализацияны неғұрлым қарапайым жағдайда, қарапайым бағандарда түсінуге болады. Мысалы, пайдаланушы Винчестерде өзін өзгерту туралы шешім қабылдады, компьютерге орнатылған, және ол жұмыс істемейді. Неге? Иә, жүйе оның жұмыс параметрлерін автоматты түрде анықтамайтындықтан, дөрекі сөйлеу, ол онымен қалай жұмыс істеу керектігін түсінбейді. Мұнда дискіні инициализациялау қажет, сондықтан ОЖ сөйлеу, оның сипаттамаларын қабылдайтын және оған үндеу әдісін анықтауы керек. Бұл егжей-тегжейлі сипатталады.

Инициализацияның негізгі бағыттары

Бастапқы немесе тіпті басым бағыттардың ішінде, көп жағдайда келесі жағдайларда бөлінеді:

  • барлық түрлердің бағдарламалары мен қосымшаларын баптандыру;
  • қатты дискілерді баптандыру;
  • Арнайы тығыздағыштың ішкі жүйесін баптандыру;
  • Мобильді құрылғыларға модемдерді баптандыру.
инициализация диска

Әрине, бұлар тек негізгі түрлері, өйткені егер ол компьютерлік процестердің жабайы процестерінде қазып алу жақсы болса, мұндай бағыттарды көп бөлуге болады. Мысалы, бұл BIOS-тің негізгі I / o жүйесінде процессорлардың немесе жедел жадтың бастапқы сипаттамаларын немесе тіпті операциялық жүйені іске қосу үшін дайындауды да қамтуы мүмкін. Бірақ, кәдімгі пайдаланушы қажет емес, техникалық сипаттаманың күрделілігіне байланысты, бұл мәселе шешілмейді.

Сондықтан, әсіресе процестердің техникалық ерекшеліктеріне кірместен, біз әрбір нақты жағдайға бөлек назар аударамыз.

Бағдарламаны баптандыру қалай

строка инициализации

Өтінімдерді баптау кезінде, басымдық процестер дұрыс бастапқы айнымалылардың міндеті немесе олардың мәндерін нөлге теңестіру міндеті тұр деп саналады. Бұған барлық қосқыштар, есептегіштер, мекенжайлар және т.б. кіреді.

Мысалы, COM және EXE форматтарының орындалатын файлдарында ұсынылған ассемблер бағдарламалары үшін, инициализация процесі төрт негізгі қадамнан тұрады:

Қай сегмент регистрлері белгілі бір сегменттерге сәйкес келуі керек;

Әрі қарай егжей-тегжейлі талқыланады, бұл процедура қандай жағдайларда қолданылады. Шын мәнінде, мұндай опциялар мен жеке оқиғалар әлдеқайда көп, мысалы, флеш ойнатқышты баптау, мысалы, жазу, сканер қосылған кезде маршрутизатор, драйверді бақылау. Бірақ біз тек негізгі жағдайларды қарастырамыз.

Бағдарламаның орындалуын бастаған кезде DS регистр мекенжайын жинақтау;

ошибка инициализации что делать

Нөлдік мекен-жай жинағына жазыңыз;

DS жүктеу Сегмент мекенжайының тізіліміне.

Тиісті деректер массивтерін өңдеу кезінде процесс циклдік сипатқа ие, ал массивтегі мәндер айнымалыдан бастап 0 немесе 1 мәні толығымен циклден басталған кезде және қолданба орындалудан кейін ғана түседі. Және циклдер барлық айнымалылардың құрамында барлық массивті болуы мүмкін.

каким образом происходит инициализация программы

Қатты дискіні баптандыру мәселелері

Шеберлердің инициализациясымен жағдай біршама қарапайым. Кейбір дереккөздер процестің мәні форматтау үшін азаяды деп айтады. Бұл олай емес.

Дискіні бастапқы кезеңде баптау, егер Windows-stills, егер Windows жүйелерін пайдалансаңыз, жүктеу жазбасының төлсипаттарын (MBR немесе GPT) жасау арқылы жаңа бөлімді анықтауға арналған.

Әрі қарай, қарапайым көлемді құру процесі қолданылады, жарамды өлшемді көрсете отырып қолданылады, әріпті (жүйенің »дискісі« DISK »дискісі үшін) және тек тиісті файлдық жүйені таңдаумен пішімдеу (көп жағдайда NTFS).

Добавить комментарий