Это обсуждается в "Эффективном C ++" Скоттом Мейером. Причина этого двусмысленна в том, что они хотели убедиться, что простое изменение видимости члена не изменит значения уже существующего кода в другом месте.
В противном случае, предположим, что ваш класс C был где-то в заголовке. Если у вас есть частный член C (int), код, который вы предоставляете, будет называться C (float). Если по какой-то причине член C (int) был открыт, старый код неожиданно вызвал бы этот член, даже если ни старый код , ни вызываемая им функция не изменились .
РЕДАКТИРОВАТЬ: Больше причин:
Еще хуже, предположим, что у вас были следующие 2 функции:
C A::foo()
{
return C(1.0);
}
C B::bar()
{
return C(1.0);
}
Эти две функции могут вызывать разные функции в зависимости от того, был ли foo или bar объявлен другом C, или A или B наследуется от него. Наличие идентичного кода для вызова различных функций пугает.
(Вероятно, это не так хорошо, как обсуждение Скотта Мейера, но это идея.)