- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
#include <cstdio>
class A
{
public:
void sayHello()
{
printf("Hello!");
}
};
int main(int argc, char **argv)
{
A *a = 0;
a->sayHello();
return 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+145
#include <cstdio>
class A
{
public:
void sayHello()
{
printf("Hello!");
}
};
int main(int argc, char **argv)
{
A *a = 0;
a->sayHello();
return 0;
}
Что выведет этот код?
без краша выводит строку "hello". Когда писал этот код, ожидал увидеть краш, но его не было. Как это возможно? Под объект не выделена память, фактически его нет.
this/self в языках программирования с ООП используется для указания на хранилище полей объекта и на таблицу виртуальных методов, которая содержит (сюрприз!) указатели на виртуальные методы.
Невиртуальные методы — это костыль. Фактически это самые обычные процедуры/функции с несколькими отличиями:
1. Для их наименований используется отдельное пространство (TA.SayHello отличается от SayHello, объявленной вне класса).
2. В них передаётся N+1 аргумент. «Лишний» аргумент — это тот самый указатель this/self.
3. При объявлении такого метода можно использовать синтаксический сахар типа inherited для вызова метода из родительского класса.
Если нет доступа к полям объекта, к свойствам (properties) и к виртуальным методам, то инициализировать объект нет необходимости. Но тогда это уже не ООП, а обычное процедурное программирование, только записанное извращённым способом.
Кстати. Что посоветуешь почитать о внутреннем строении делфей? Или системное что-нибудь.
Поскольку метод TA.SayHello не обращается ни к полям, ни к свойствам, ни к виртуальным методам, то значение переменной a нигде не используется.
Даже портировал модули от Bormand Pascal 7.0 на Delphi 1.0 (единственный 16-битный компилятор Делфей), чтобы компилировать программы для DOS'а с использованием новой объектной модели (та, что описывается магическим словом class).
Самое страшное, что мне удалось портировать с BP 7.0 на Delphi 1.0 модуль Graph для вывода графики (при том, что у него не было исходников). Потом я наткнулся на 32-битные DOS-экстендеры и прикрутил к 32-битным Делфям библиотеку BGI32.DLL (или как там её звали?) от Борманд Си. Но это уже из другой оперы, не относящейся к ООП...
А ещё однажды пришлось допиливать извращатель OBJ-файлов, чтобы можно было линковать в одну программу OBJ-файлы, сгенерированные разными компиляторами. Что-то я разошёлся...
Короче, начни с изучения исходников стандартных библиотек. Они же открытые.
Любой язык кроме си и асма
> и визуальщины.
Сишарп/кое-что еще.
Можно было бы поучить - так, ради интереса, но в качестве постоянного самотыка этот язык непригоден.
Так какого хрена ты тогда сидишь на винде, автор которой... Майкрософт?
Логично. Лучше - хуже - абстрактные понятия. Все решается человеком за клавиатурой. Если человек больше обезьян - любой язык говно
>> производительность кода низкая
Опять твои влажные фантазии? Грамотный код на шарпе вкусен и скор
>> К тому же наличие "сборщика мусора", на мой взгляд, развращает
А это да, я на плюсах (точнее на си-с-классами) не могу писать от того, что не приучен к RAII и программы у меня текут
>> Да и среда разработки ебанутая, интуитивно в ней не разобраться
Ну покажи мне IDE лучше чем VS
И нет, это не тот, который ты имеешь в виду, там всего 512 памяти.
А Вами баба командует.
+1
Подтверждаю. После разработки бекенда ЭКМАСКРИПТом на C++ было сложно возвращаться. Правда, немецкий сборщик мусора позволяет более просто писать код в функциональном стиле и не думать о последствиях.
СБОРЩИК МУСОРА. Тебя уже здесь тыкали в твои косяки с освобождением памяти, т.е. несмотря на свою любовь к делфям ты ее кажется так и не осилил. а там это не нужно, ну или гораздо проще.
>не перенесёт свои вредные привычки на другой язык?
Дак почти все языки с ГЦ.
В противном случае не строй из себя девственницу.
Кстати да, немного понимаю Стертора. У меня от M$ только винда, скайп да пара программ. Я не ненавижу их программы, просто MPCHC и Chrome оказались удобнее, а брать пиратский офис или платить за него, когда (1) ты не бухгалтер и (2) есть свободный аналог - верх идиотизма.
Мне нравиться винда и VS, но остальные проги от MS мне не доставляют
Кстати скайп совсем запаршивел(
Это да, печаль. Айфонные облачка и полуметровые смайлы на весь экран на десктопе. Фу.
Узнаю стиль мелкософтовцев.
> гнать по черному
А, да. Статусы теперь рандомные какие-то. Статус "отошёл" теперь значит "отошёл", "разбил телефон молотком", "сейчас в Америке", "выключил компьютер две недели назад" или "давно помер, уже год как похоронили".
Но облачка - не фигня. Ни черта не видно же. С бОльшим размером букв можно отобразить больше информации, если нормально подойти к проектированию гуя. Блджад, в соседних программах шрифт в полтора раза больше, и помещается в два раза больше!
То есть я должен напрягать глаза ради того, чтобы прочесть пять комментариев, когда в нормальных программах легко читаю десять. Это победа над логикой.
+1. Я туда раз в полгода захожу зачем-то на пару минут, даже стену не читаю.
P.S. Надо им предложить, чтобы рисовали на страничках таких юзеров мох и паутину.
Интересная идея. Предложите, может хотя бы на первое апреля сделают.
А пруфы будут, или это твое авторитетное мнение как погромиста?
Слишком прост и быстро приедается. Вот c++ можно юзать в качестве постоянного самотыка. Каждый день новые ощущения.
Хотя самотык... Стретор... Делфи...
А с# - быстро сделал дело - и на боковую
Иди на хуй, Кегги.
Черепашка что ли?
класс же
>Должно быть std::printf,
хедеры вида <csomething> не убирают глобальные сишные функции, а всего лишь дополнительно вносят их в пространство std. Т.е. в данном случае std::printf и printf одно и то же.
Вообще советую погуглить говнокоды, в обсуждении которых встречался термин ТВМ или VMT.
http://stackoverflow.com/questions/2474018/when-does-invoking-a-member-function-on-a-null-instance-result-in-undefined-behav
“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?
Соблюдайте грамматику говнокода