September 18th, 2006

Зевнуть

i = j * 5;

Отрывок из Джоэля:

... в C, вы, по крайней мере, знаете, что j умножается на пять и результаты сохраняются в i.

Но если вы видите тот же самый отрывок кода в C++, вы не можете сказать о нем ничего. Абсолютно ничего. Единственный способ узнать в C++, что же здесь действительно происходит, состоит в том, чтобы узнать, какие типы у i и j, что-то, что могло быть объявлено где-нибудь в другом месте. Это нужно потому, что в зависимости тип j, может иметь перегруженный operator*, который может сделать что-нибудь ужасно остроумное, когда вы пытаетесь сделать простое умножение. Да и operator= у i тоже может быть перегруженным, типы могут быть несовместимыми, и в результате может быть автоматически вызвана функция приведения типов. И единственным способом разобраться во всем этом является не просто проверка типов, но и поиск кода, который реализующих именно эти типы, и Бог вам в помощь, если где-нибудь есть наследование, потому что теперь вы должны будете тащиться по всей иерархии класса, пытаясь найти, где все-таки на самом деле находится нужный вам код, и если где-нибудь есть полиморфизм, то вы действительно попали в беду, потому что тогда недостаточно знать, с какими типами объявлены i и j, надо точно знать, какие типы у них именно сейчас, и это может повлечь просмотр неизвестного количества кода, и вы никогда полностью не убедитесь в том, что полностью разобрались в какой-то проблеме (фу!).

Вся статья тут:
Link