C++: не ини­циа­ли­зи­руй­те объ­ек­ты сим­во­лом “=” ›››

Всё ска­зан­ное здесь не от­но­сит­ся к Visual Studio. В этой си­сте­ме, во­пре­ки стан­дар­там, ини­циа­ли­за­ция ра­вен­ством эк­ви­ва­лент­на ини­циа­ли­за­ции скоб­ка­ми (кро­ме слу­чая explicit-кон­ст­рук­то­ров).

Ча­сто мож­но встре­тить код, в ко­то­ром кон­струи­руе­мый объ­ект ини­циа­ли­зи­ру­ет­ся сим­во­лом «=»:

MyClass x = 10;

Та­кая за­пись на­зы­ва­ет­ся ини­циа­ли­за­ци­ей ко­пии (copy-initialization).

На сай­те govnokod.ru к этой ста­тье от­нес­лись до­ста­точ­но не­га­тив­но (ци­ти­рую: «ав­тор еба­нул­ся»). В оправ­да­ние ска­жу, что с тех пор ста­тья бы­ла силь­но до­ра­бо­та­на.

При­выч­ка ис­поль­зо­вать ини­циа­ли­за­цию ко­пии по­шла, ви­ди­мо, из «сиш­ных» вре­мён, ко­гда клас­сов и кон­ст­рук­то­ров не бы­ло, а ука­зан­ная за­пись бы­ла един­ствен­ным спо­со­бом ини­циа­ли­за­ции. Вме­сто это­го сле­ду­ет, где толь­ко мож­но, ис­поль­зо­вать ва­ри­ант со скоб­ка­ми:

MyClass x(10);

Эта за­пись на­зы­ва­ет­ся пря­мой ини­циа­ли­за­ци­ей (direct-initialization).

Да­вай­те раз­бе­рём­ся со все­ми «за» и «про­тив». Чи­тать даль­ше ›››

Функ­ция — ко­но­пля ›››

На Ха­б­ре по­яви­лась те­ма, упо­ми­наю­щая мою дав­нюю ра­бо­ту — функ­цию, гра­фик ко­то­рой на­по­ми­на­ет лист ко­но­пли. К со­жа­ле­нию, в свя­зи с не­от­вра­ти­мым на­ступ­ле­ни­ем но­во­го го­да я сей­час не мо­гу уде­лить этой про­бле­ме до­ста­точ­но вни­ма­ния, по­это­му про­сто пуб­ли­кую не­ко­то­рые ма­те­ри­а­лы Чи­тать даль­ше ›››

По­че­му я до сих пор про­грам­ми­рую ›››

Не­дав­но Дэни­ел Ли­майр (про­фес­сор Уни­вер­си­те­та Кве­бе­ка в Мон­ре­а­ле) раз­ме­стил в сво­ём бло­ге за­ме­ча­тель­ную ста­тью «Why I still program». Пуб­ли­кую с со­гла­сия ав­то­ра пе­ре­вод ста­тьи на рус­ский язык.

Лю­ди ожи­да­ют, что, как толь­ко ты ста­но­вишь­ся стар­ше, ты бро­са­ешь прак­ти­че­ские за­ня­тия, та­кие, как про­грам­ми­ро­ва­ние, ра­ди бо­лее до­стой­ных ве­щей — управ­ле­ния кол­лек­ти­вом и по­ис­ка фи­нан­си­ро­ва­ния. Это осо­бен­но вер­но в на­уч­ной сре­де, где «на­сто­я­щие учё­ные» не вни­ка­ют в де­та­ли, за­ни­ма­ясь лишь «об­щей кар­ти­ной про­ис­хо­дя­ще­го». Дру­ги­ми сло­ва­ми, ор­га­ни­за­ции на­це­ле­ны на вер­ти­каль­ное со­труд­ни­че­ство — иерар­хи­че­скую ст­рук­ту­ру, в ко­то­рой лю­ди на­вер­ху ру­ко­во­дят дру­ги­ми (бо­лее де­шё­вы­ми) ра­бот­ни­ка­ми. В ис­сле­до­ватель­ской сре­де это озна­ча­ет, что стар­шие на­уч­ные со­труд­ни­ки да­ют идеи, а мо­ло­дые со­труд­ни­ки их реа­ли­зо­вы­ва­ют. Со вре­ме­нем стар­шие со­труд­ни­ки мо­гут ра­зу­чить­ся де­лать то, что де­ла­ют мо­ло­дые, но за­то они ста­но­вят­ся спе­циа­ли­ста­ми в об­ла­сти до­бы­ва­ния де­нег. Мас­штаб та­кой мо­де­ли мо­жет рас­ти: стар­ший учё­ный ру­ко­во­дит учё­ны­ми сред­не­го зве­на, а те, в свою оче­редь, мо­ло­ды­ми со­труд­ни­ка­ми, и так да­лее. Джордж Чем на­звал та­кую мо­дель «про­фес­сор­ской пи­ра­ми­дой», так как она ра­бо­та­ет луч­ше все­го, ко­гда фи­нан­си­ро­ва­ние обиль­ное и по­сто­ян­но воз­рас­та­ет Чи­тать даль­ше ›››

Как пре­по­да­вать Си? ›››

Ко­гда па­ру лет на­зад пе­ре­до мной ста­ла за­да­ча на­учить пер­во­курс­ни­ков МФТИ про­грам­ми­ро­вать на Си, я столк­нул­ся со сле­дую­щей труд­но­стью: как по­до­брать та­кую по­сле­до­ва­тель­ность по­да­чи ма­те­ри­а­ла, что­бы каж­дая но­вая те­ма опи­ра­лась на преды­ду­щие те­мы, и при этом не тре­бо­ва­ла ис­поль­зо­ва­ния ещё не изу­чен­но­го ма­те­ри­а­ла?

В этом пла­не хо­ро­ши Пас­каль и Пи­тон: в них ввод-вы­вод осу­ществ­ля­ет­ся опе­ра­то­ра­ми язы­ков (не функ­ци­я­ми), а для на­пи­са­ния про­стей­ших про­грамм не нуж­но со­зда­вать функ­ции и ис­поль­зо­вать ука­за­те­ли.

Язык Си как буд­то спе­ци­аль­но со­здан так, что­бы иметь за­ви­си­мость сво­их кон­цеп­ций друг от дру­га. Хо­ти­те на­пи­сать про­грам­му, вы­во­дя­щую «Hello, world»? Будь­те до­бры, вклю­чи­те за­го­ло­воч­ный файл stdio.h (ис­поль­зу­ет­ся пре­про­цес­сор), со­здай­те функ­цию main (для это­го нуж­но знать функ­ции), со­здай­те стро­ко­вый ли­те­рал "Hello, world" (ука­затель на стро­ку сим­во­лов, окан­чи­ва­ю­щу­ю­ся ну­лём), вы­зо­ви­те функ­цию printf, и так да­лее (ри­су­нок 1).

Чи­тать даль­ше ›››

Ре­ше­ния за­дач по про­грам­ми­ро­ва­нию ›››

Не­дав­но я опуб­ли­ко­вал не­слож­ные за­да­чи по про­грам­ми­ро­ва­нию и по­лу­чил не­сколь­ко просьб при­ве­сти так­же ре­ше­ния. Что-ж, по­жа­луй­ста. Нач­ну с про­стых за­дач; до­пол­ни­тель­ные за­да­чи тре­бу­ют по­дроб­но­го опи­са­ния, по­это­му я рас­смот­рю их в сле­дую­щий раз.

Смот­реть ре­ше­ния ›››

Кон­т­роль­ная ра­бо­та по про­грам­ми­ро­ва­нию ›››

Се­год­ня про­вёл у сво­их обол­ту­сов (ма­ги­стран­ты, 5-й курс ТТИ ЮФУ) кон­т­роль­ную ра­бо­ту по про­грам­ми­ро­ва­нию. Пра­ви­ла иг­ры бы­ли сле­дую­щие:

  1. Каж­дый сту­дент тя­нет би­лет с за­да­чей. Ес­ли би­лет ему не нра­вит­ся, он мо­жет ре­шить од­ну из до­пол­ни­тель­ных за­дач, на своё усмот­ре­ние.

  2. Ос­нов­ные за­да­чи оце­ни­ва­ют­ся в 10 бал­лов каж­дая. За не­опти­маль­ное ре­ше­ние за­да­чи преду­смот­ре­но сни­же­ние оцен­ки; это ого­во­ре­но в усло­вии каж­дой за­да­чи.

  3. До­пол­ни­тель­ные за­да­чи оце­ни­ва­ют­ся в 11 бал­лов каж­дая. Они в пол­то­ра ра­за слож­нее ос­нов­ных, но оце­ни­ва­ют­ся все­го на бал до­ро­же, так как сту­дент мо­жет вы­брать се­бе до­пол­ни­тель­ную за­да­чу по вку­су.

В об­щем, до­пол­ни­тель­ные за­да­чи так ни­кто и не ре­шил. Ос­нов­ные за­да­чи бы­ли ре­ше­ны, но очень ту­го. Год на­зад я да­вал по­доб­ные за­да­чи пер­во­курс­ни­кам МФТИ, там всё это шло влёт.

Смот­реть усло­вия за­дач ›››

Опе­ра­ция за­пя­тая в C++ ›››

Как ни стран­но, про­грам­ми­сты ред­ко уде­ля­ют вни­ма­ние изу­че­нию и ис­поль­зо­ва­нию опе­ра­ции за­пя­тая (comma operator) в язы­ке C++. Я опуб­ли­ко­вал на сай­те ста­тью с по­дроб­ным опи­са­ни­ем то­го, что я знаю о за­пя­тых. Чи­тай­те.

Кон­т­роль диа­па­зо­на це­ло­го чис­ла (С++) ›››

Ча­сто в за­да­чах об­ра­бот­ки изоб­ра­же­ний тре­бу­ет­ся опре­де­лить, не вы­хо­дит ли це­лое чис­ло за пре­де­лы не­ко­то­ро­го диа­па­зо­на; при­чём ле­вой гра­ни­цей диа­па­зо­на яв­ля­ет­ся чис­ло 0. На­при­мер, вы хо­ти­те про­ве­рить, по­па­да­ет ли пик­сель с це­ло­чис­лен­ны­ми ко­ор­ди­на­та­ми int x, int y в изоб­ра­же­ние раз­ме­ра­ми sX × sY.

Обыч­но для это­го ис­поль­зу­ет­ся усло­вие ви­да:

if(x>=0 && x<sx && y>=0 && y<sy ) какое_либо_действие();

Вез­де да­лее для со­кра­ще­ния за­пи­си бу­дем про­ве­рять лишь од­ну ко­ор­ди­на­ту:

if(x>=0 && x<sx ) какое_либо_действие();

В при­ве­дён­ном ко­де для пик­се­лей, по­па­даю­щих в изоб­ра­же­ние (та­ких у вас на­вер­ня­ка бу­дет боль­шин­ство) вы­пол­ня­ют­ся обе про­вер­ки, реа­ли­зуе­мые при по­мо­щи услов­ных пе­ре­хо­дов. Услов­ный пе­ре­ход яв­ля­ет­ся тя­жё­лой опе­ра­ци­ей для со­вре­мен­но­го про­цес­со­ра, так как он (в слу­чае не­удач­но­го пред­ска­за­ния пе­ре­хо­да) мо­жет при­ве­сти к сбро­су кон­вейе­ра, и по­те­ре де­сят­ков так­тов.

Од­на­ко, изу­чая ис­ход­ный код биб­лио­те­ки OpenCV, я об­на­ру­жил бо­лее эф­фек­тив­ное ре­ше­ние дан­ной за­да­чи Чи­тать даль­ше ›››

Уко­ро­ти­те­ли ссылок ›››

Сей­час на­бра­ли по­пу­ляр­ность сай­ты, предо­став­ляю­щие сер­вис по уко­ра­чи­ва­нию ссылок. Идея их ра­бо­ты про­ста: они до­бав­ля­ют ад­рес в свою ба­зу дан­ных (ес­ли это­го ад­ре­са там ещё нет), при­сваи­ва­ют ему иден­тифи­ка­тор, и да­ют поль­зо­ва­те­лю ко­рот­кую ссыл­ку на свой сер­вер, до­пол­нен­ную иден­тифи­ка­то­ром. При по­се­ще­нии та­кой ссыл­ки по­се­ти­тель пе­ре­на­прав­ля­ет­ся на це­ле­вой (длин­ный) ад­рес. Чи­тать даль­ше ›››

Пи­тон, де­вуш­ки, и объ­ект­но-ори­ен­ти­ро­ван­ное про­грам­ми­ро­ва­ние ›››

Бу­ра­ти­но (о по­ли­мор­физ­ме):
— Те­бя как зо­вут?
— Маль­ви­на!
— Мы не в сау­не! В жиз­ни те­бя как зо­вут?!
— Ма­ри­на...

Ду­маю, все мы так или ина­че слы­ша­ли об объ­ект­но-ори­ен­ти­ро­ван­ном про­грам­ми­ро­ва­нии. Эта за­мет­ка для тех, кто за 15 ми­нут хо­чет по­нять, что это та­кое. На про­стом при­ме­ре я про­де­мон­стри­рую по­ня­тия класс, объ­ект, кон­ст­рук­тор, де­ст­рук­тор, ин­кап­су­ля­ция, и да­же ска­жу па­ру слов про та­кие слож­ные ве­щи, как на­сле­до­ва­ние и по­ли­мор­физм. Чи­тать даль­ше ›››