1. C++ / Говнокод #18257

    +145

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    #include <cstdio>
    
    class A
    {
    public:
    	void sayHello()
    	{
    		printf("Hello!");
    	}
    };
    
    int main(int argc, char **argv)
    {
    	A *a = 0;
    	a->sayHello();
    	return 0;
    }

    Что выведет этот код?

    Запостил: hdkeeper, 29 Мая 2015

    Комментарии (65) RSS

    • Hello он выведет. nullptr, который в *a сидит передается в sayHello как this, но внутри this нигде не используется.
      Ответить
      • >>Hello он выведет.
        program Project2;
        
        {$APPTYPE CONSOLE}
        
        uses
          SysUtils;
        
        type
          TA=class
          procedure SayHello;
          end;
        
        { TA }
        
        procedure TA.SayHello;
        begin
          writeln('hello');
        end;
        
        var
          a:ta;
        begin
          a.SayHello;
          readln;
        end.

        без краша выводит строку "hello". Когда писал этот код, ожидал увидеть краш, но его не было. Как это возможно? Под объект не выделена память, фактически его нет.
        Ответить
        • См. ссылку ниже, там можно найти объяснение.

          this/self в языках программирования с ООП используется для указания на хранилище полей объекта и на таблицу виртуальных методов, которая содержит (сюрприз!) указатели на виртуальные методы.

          Невиртуальные методы — это костыль. Фактически это самые обычные процедуры/функции с несколькими отличиями:
          1. Для их наименований используется отдельное пространство (TA.SayHello отличается от SayHello, объявленной вне класса).
          2. В них передаётся N+1 аргумент. «Лишний» аргумент — это тот самый указатель this/self.
          3. При объявлении такого метода можно использовать синтаксический сахар типа inherited для вызова метода из родительского класса.

          Если нет доступа к полям объекта, к свойствам (properties) и к виртуальным методам, то инициализировать объект нет необходимости. Но тогда это уже не ООП, а обычное процедурное программирование, только записанное извращённым способом.
          Ответить
          • ОМГ. Мой мир рухнул.
            Кстати. Что посоветуешь почитать о внутреннем строении делфей? Или системное что-нибудь.
            Ответить
            • В твоём примере procedure TA.SayHello трансформируется во что-то типа procedure TA_SayHello(this: pointer) (условно), а вызов a.SayHello трансформируется во что-то типа TA_SayHello(a).

              Поскольку метод TA.SayHello не обращается ни к полям, ни к свойствам, ни к виртуальным методам, то значение переменной a нигде не используется.
              Ответить
              • Я начинаю кое-что понимать. Знаешь, как-то раз я писал менеджер потоков - класс, базирующийся на TThreadlist. Так вот, у меня было желание передать в поток указатель на его менеджер - чтобы потоки могли с ним взаимодействовать. Тогда это показалось мне страшным извращением, я отказался от этой затеи. Теперь оказывается, что это было и не извращение вовсе?
                Ответить
            • Я в своё время читал исходник System.pas и других модулей стандартной библиотеки.

              Даже портировал модули от Bormand Pascal 7.0 на Delphi 1.0 (единственный 16-битный компилятор Делфей), чтобы компилировать программы для DOS'а с использованием новой объектной модели (та, что описывается магическим словом class).

              Самое страшное, что мне удалось портировать с BP 7.0 на Delphi 1.0 модуль Graph для вывода графики (при том, что у него не было исходников). Потом я наткнулся на 32-битные DOS-экстендеры и прикрутил к 32-битным Делфям библиотеку BGI32.DLL (или как там её звали?) от Борманд Си. Но это уже из другой оперы, не относящейся к ООП...

              А ещё однажды пришлось допиливать извращатель OBJ-файлов, чтобы можно было линковать в одну программу OBJ-файлы, сгенерированные разными компиляторами. Что-то я разошёлся...

              Короче, начни с изучения исходников стандартных библиотек. Они же открытые.
              Ответить
              • Класс)) Я листаю исходники, но там иногда очень путанно.
                Ответить
            • Нахуй тебе эти делфи, сборщик мусора наше все.
              Ответить
              • У меня "головной мозг паскаля" (реально), вдобавок я прусь с ООП и визуальщины.
                Ответить
                • >вдобавок я прусь с ООП
                  Любой язык кроме си и асма

                  > и визуальщины.
                  Сишарп/кое-что еще.
                  Ответить
                  • Сишарп - лажа. Плохо уже то, что автор компилятора - Майкирософт.
                    Можно было бы поучить - так, ради интереса, но в качестве постоянного самотыка этот язык непригоден.
                    Ответить
                    • > Плохо уже то, что автор компилятора - Майкирософт.
                      Так какого хрена ты тогда сидишь на винде, автор которой... Майкрософт?
                      Ответить
                      • Лучше уж на винде, чем на этих Ваших линуксах, авторы которых - пингвины.
                        Ответить
                        • Ну так если на винде, то чем тебе майкрософт то не угодил? c# - годный язык, в котором проделали работу над ошибками джавы. Фреймворки сейчас у всех стоят, никуда от них не деться. Express Edition можно бесплатно качнуть.
                          Ответить
                          • Чем он лучше, скажем, бейсика? Тот же самый псевдокод. А коли псевдокод - значит, он для исполнения на виртуалке (отсюда обязательное наличие рантайм-либ)->производительность кода низкая. К тому же наличие "сборщика мусора", на мой взгляд, развращает; где гарантии того, что программист, ранее кодивший на сишке#, не перенесёт свои вредные привычки на другой язык? Да и среда разработки ебанутая, интуитивно в ней не разобраться. Я честно, много раз ставил с# - но потом сносил; не моё это. C# ничем не лучше делфей.
                            Ответить
                            • >> Чем он лучше, скажем, бейсика? Тот же самый псевдокод.

                              Логично. Лучше - хуже - абстрактные понятия. Все решается человеком за клавиатурой. Если человек больше обезьян - любой язык говно

                              >> производительность кода низкая
                              Опять твои влажные фантазии? Грамотный код на шарпе вкусен и скор

                              >> К тому же наличие "сборщика мусора", на мой взгляд, развращает
                              А это да, я на плюсах (точнее на си-с-классами) не могу писать от того, что не приучен к RAII и программы у меня текут

                              >> Да и среда разработки ебанутая, интуитивно в ней не разобраться
                              Ну покажи мне IDE лучше чем VS
                              Ответить
                              • Мне всё в ней неприятно, начиная от убогого дизайна и неинтуитивности и кончая ее тормозностью. Делфи никогда не тормозят так, как VS, да и компонент всяких больше.
                                Ответить
                                • VS тормозит? Нет, не слышал. Долго включается и выключается - да, но тормозов я в ней никогда не замечал
                                  Ответить
                                  • На слабом компе действительно тормозит. Еще и 7 требует.
                                    Ответить
                                    • Это на том, который с помойки?
                                      Ответить
                                      • У меня нет компа с помойки, а у вас страна - помойка. Считается ли купленное в стране-помойке с помойки?

                                        И нет, это не тот, который ты имеешь в виду, там всего 512 памяти.
                                        Ответить
                                        • >У меня нет компа с помойки, а у вас страна - помойка.

                                          А Вами баба командует.
                                          Ответить
                                          • http://ic.pics.livejournal.com/limonada_net/15105879/1042743/1042743_original.jpg
                                            Ответить
                            • > К тому же наличие "сборщика мусора", на мой взгляд, развращает; где гарантии того, что программист, ранее кодивший на сишке#, не перенесёт свои вредные привычки на другой язык?
                              +1
                              Подтверждаю. После разработки бекенда ЭКМАСКРИПТом на C++ было сложно возвращаться. Правда, немецкий сборщик мусора позволяет более просто писать код в функциональном стиле и не думать о последствиях.
                              Ответить
                            • >Чем он лучше, скажем, бейсика?
                              СБОРЩИК МУСОРА. Тебя уже здесь тыкали в твои косяки с освобождением памяти, т.е. несмотря на свою любовь к делфям ты ее кажется так и не осилил. а там это не нужно, ну или гораздо проще.

                              >не перенесёт свои вредные привычки на другой язык?
                              Дак почти все языки с ГЦ.
                              Ответить
                          • Можно VSC бесплатно качнуть - это лучше EE, но только для частников (не более 5 макак в клетке)
                            Ответить
                            • Вот, какая у меня политика: я поставил винду - всё, больше мне от майкрософта ничего не нужно. Пусть засунут свой недософт себе в анус и поставят на это дело патч. У меня нет ни офиса, ни WMP, ни сильверлайта ни прочего дерьма. Я всегда юзаю сторонее ПО.
                              Ответить
                              • Тогда нах тебе винда? Будь как дядя Столлман - ГЕНТУУУУ!

                                В противном случае не строй из себя девственницу.
                                Ответить
                                • Я не люблю линь, об этом говорилось выше.
                                  Ответить
                                • Винда годная. Да и привыкли мы к ней.
                                  Кстати да, немного понимаю Стертора. У меня от M$ только винда, скайп да пара программ. Я не ненавижу их программы, просто MPCHC и Chrome оказались удобнее, а брать пиратский офис или платить за него, когда (1) ты не бухгалтер и (2) есть свободный аналог - верх идиотизма.
                                  Ответить
                                  • Да я как бы не агитирую ставить все от майкрософт. Я призываю не кричать - все проги от Х - говно!
                                    Мне нравиться винда и VS, но остальные проги от MS мне не доставляют
                                    Кстати скайп совсем запаршивел(
                                    Ответить
                                    • > Кстати скайп совсем запаршивел(
                                      Это да, печаль. Айфонные облачка и полуметровые смайлы на весь экран на десктопе. Фу.
                                      Ответить
                                      • Да это фигня. Он виснуть стал и гнать по черному. Часто не могу позвонить на историческую родину Семена - у меня идет вызов - а на той стороне тишина. И наоборот
                                        Ответить
                                        • >>Он виснуть стал и гнать по черному

                                          Узнаю стиль мелкософтовцев.
                                          Ответить
                                        • У меня прошлым летом вис под Windows 7, а сейчас не виснет (Win8.1, Skype6.21.0.104 - безоблачный).

                                          > гнать по черному
                                          А, да. Статусы теперь рандомные какие-то. Статус "отошёл" теперь значит "отошёл", "разбил телефон молотком", "сейчас в Америке", "выключил компьютер две недели назад" или "давно помер, уже год как похоронили".

                                          Но облачка - не фигня. Ни черта не видно же. С бОльшим размером букв можно отобразить больше информации, если нормально подойти к проектированию гуя. Блджад, в соседних программах шрифт в полтора раза больше, и помещается в два раза больше!
                                          То есть я должен напрягать глаза ради того, чтобы прочесть пять комментариев, когда в нормальных программах легко читаю десять. Это победа над логикой.
                                          Ответить
                                          • Я редко в скайпе пишу - в основном звоню. Для письменного общения у меня вк
                                            Ответить
                                            • Жаль, я хотел летом (ближе к июлю) попроситься да поболтать. Впрочем, поболтать голосом тоже можно.
                                              Ответить
                                              • Вк нет что ли? Я могу и письменно в скайпе, не принципиально.
                                                Ответить
                                                • Когда-то давно был, но потом оказалось, что без ВК жить гораздо легче.
                                                  Ответить
                                                  • > без ВК жить гораздо легче
                                                    +1. Я туда раз в полгода захожу зачем-то на пару минут, даже стену не читаю.

                                                    P.S. Надо им предложить, чтобы рисовали на страничках таких юзеров мох и паутину.
                                                    Ответить
                                                    • > мох и паутину.
                                                      Интересная идея. Предложите, может хотя бы на первое апреля сделают.
                                                      Ответить
                                                      • Дык я там новости не читаю - не репостю (ну почти). Я там тупо общаюсь со знакомыми.
                                                        Ответить
                                  • Ой бля, говно ваш офис. Я его пользую только ради плагинов.
                                    Ответить
                    • >> Можно было бы поучить - так, ради интереса, но в качестве постоянного самотыка этот язык непригоден.

                      А пруфы будут, или это твое авторитетное мнение как погромиста?
                      Ответить
                      • > постоянного самотыка
                        Слишком прост и быстро приедается. Вот c++ можно юзать в качестве постоянного самотыка. Каждый день новые ощущения.
                        Ответить
                        • ну да, сексу в нем мало, но я по наивности думал, что это плюс

                          Хотя самотык... Стретор... Делфи...
                          Ответить
                          • Секс с делфи подобен сексу с барышней, закончившей институт благородных девиц и воспитанной в лучших традициях. Никакого легкомыслия и пошлости. С глупостями к такой не сунешься.
                            Ответить
                            • Ага. Полдня уламываешь, полдня залезаешь....

                              А с# - быстро сделал дело - и на боковую
                              Ответить
                              • ... Потом мучает мысль, что переспал со шлюхой. Да и бордейль не всегда найдёшь (runtime frameworks).

                                Иди на хуй, Кегги.
                                Ответить
                • >> визуальщины

                  Черепашка что ли?
                  Ответить
    • >printf
      Ответить
      • Должно быть std::printf, да? :D
        Ответить
        • Должно быть std::cout, иначе где тут C++?
          Ответить
          • >иначе где тут C++?
            класс же
            >Должно быть std::printf,
            хедеры вида <csomething> не убирают глобальные сишные функции, а всего лишь дополнительно вносят их в пространство std. Т.е. в данном случае std::printf и printf одно и то же.
            Ответить
    • Вот тут было веселее: http://govnokod.ru/13410

      Вообще советую погуглить говнокоды, в обсуждении которых встречался термин ТВМ или VMT.
      Ответить
    • В C++ это чистейший Undefined Behaviour. Нельзя разыменовывать нулевые указатели.

      http://stackoverflow.com/questions/2474018/when-does-invoking-a-member-function-on-a-null-instance-result-in-undefined-behav
      Ответить
      • Там много говорят о неоднозначности стандарта, о так называемых “weak interpretation” и “strict interpretation”:
        “However, because E1 is not used in a static member-function call, if we use the weak interpretation the call is well-defined. *(E1) results in an lvalue, the static function is resolved, *(E1) is discarded, and the function is called. There is no lvalue-to-rvalue conversion, so there's no undefined behavior.”

        Так всё же кому верить: адептам weak или адептам strict?
        Ответить
        • Адептам strict. Так на душе спокойней будет.
          Ответить
    • убэ
      Ответить
      • В гэцэцэ работает, а остальные конпеляторы не нужны.
        Ответить
        • Нинужны
          Соблюдайте грамматику говнокода
          Ответить

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