Следующий фрагмент заставляет меня чувствовать себя озадаченным.
Почему der._x ++ правильный?
Так как это временная локальная переменная, скопированная из аргумента Derived.
Он должен иметь доступ только для публичных членов.
закомментированный оператор bs._x ++ не может пройти, что должно быть правильным.
Пожалуйста, дайте мне знать, где я неправильно понимаю! Заранее спасибо!
Спасибо за ваши добрые ответы. Но я сомневаюсь, что der — это объект Derived, скопированный из аргумента, иными словами, его следует рассматривать как клиента, использующего инициализированный объект Derived. Это не * этот экземпляр, а другой временный экземпляр, который получается из конструктора копирования.
class Base
{
public:
Base(int x, int y) :_x(x), _y(y){}
protected:
int _x, _y;
};
class Derived :public Base
{
public:
Derived(int x, int y,int z) :Base(x,y), _z(z){}
void mem1(Base bs, Derived der) //copy constructor called. Derived::Derived(const Derived &)
{
der._x++;
//bs._x++;
_x++;
}
private:
int _z;
};
int main()
{
Derived der(6,4,3), der1(5,3,2);
Base bs(-5,-4);
der1.mem1(bs, der);
return 0;
}
der._x++
является доступной так как _der
является объект того же Derived
учебный класс и вы получаете доступ _x
изнутри Derived
учебный класс.
Пока вы находитесь внутри класса, вы можете получить доступ к его членам (с или без ссылки на объект). Иначе (*this)._x
будет запрещено, что не 🙂
Но вы не можете сделать то же самое для любого другого класса, который имеет место для bs._x++
следовательно, это не разрешено.
Friends
в значительной степени полагаться на эту особенность языка для их реализации. Также не забыть Singleton
нельзя реализовать без него (как вы называете его private constructor
изнутри класса).
Других решений пока нет …