Python позволяет вам многое делать с функциями (включая лямбды), для которых в C ++ 03 или Java вам нужен класс (хотя в Java есть анонимные внутренние классы, поэтому вложенный класс не всегда выглядит как ваш пример).Слушатели, посетители, такие вещи.Понимание списка - это своего рода посетитель:
Python:
(foo(x) if x.f == target else bar(x) for x in bazes)
C ++:
struct FooBar {
Sommat operator()(const Baz &x) const {
return (x.f == val) ? foo(x) : bar(x);
}
FooBar(int val) : val(val) {}
int val;
};
vector<Sommat> v(bazes.size());
std::transform(bazes.begin(), bazes.end(), v.begin(), FooBar(target));
Вопрос, который затем задают себе программисты на C ++ и Java:«этот маленький класс, который я пишу: должен ли он появляться в той же области видимости, что и большой класс, которому нужно его использовать, или я должен ограничить его областью действия только того класса, который его использует?» [*]
Поскольку вы не хотите публиковать эту вещь или позволять кому-либо полагаться на нее, часто ответом в этих случаях является вложенный класс.В Java могут использоваться частные классы, а в C ++ вы можете ограничить классы TU, и в этом случае вам больше не нужно заботиться о том, в какой области имен происходит имя, поэтому вложенные классы фактически не требуются.Это просто стиль, плюс Java предоставляет некоторый синтаксический сахар.
Как сказал кто-то еще, другой случай - итераторы в C ++.Python может поддерживать итерацию без класса итератора, но если вы пишете структуру данных на C ++ или Java, то вам нужно где-то поместить ошибки.Чтобы следовать стандартному интерфейсу контейнера библиотеки, вы будете иметь вложенную typedef, независимо от того, является ли класс вложенным или нет, поэтому вполне естественно думать, «вложенный класс».
[*] Они также спрашивают себя,«Должен ли я просто написать цикл for?», но давайте предположим случай, когда ответом на него будет нет ...