#cpp #классы
class A { const int x; public: A(const int& x = 0): x(x) {} ... }; class B { int x; public: B(const int& x = 0): x(x) {} ... }; int main() { A a; const B b; } Объекты a и b эквивалентны?
Ответы
Ответ 1
Объекты a и b не являются эквивалентными, так как объект a - это неконстантный объект, а объект b - это константный объект. Объект a вы можете передавать в функции, которые имеют своими параметрами неконстантные ссылки на класс A, в то время как объект b вы можете передавать в качестве аргументов функциям, которые имеют в качестве параметров константные ссылки. Например, следующее объявление будет корректным для объекта a A &ra = a; в то время аналогичное объявление для объекта b B &rb = b; будет некорректным, так как объект b - это константный объект и для него правильно будет записать const B &rb = b; ^^^^^ Или другой пример. #includeclass A { const int x; public: A(const int& x = 0): x(x) {} std::ostream & out( std::ostream &os ) { return os << x; } }; class B { int x; public: B(const int& x = 0): x(x) {} std::ostream & out( std::ostream &os ) { return os << x; } }; int main() { A a; const B b; a.out( std::cout ) << std::endl; b.out( std::cout ) << std::endl; // ошибка компиляции } В этой программе предложение b.out( std::cout ) << std::endl; // ошибка компиляции для объекта b не будет компилироваться, в то время как аналогичное предложение a.out( std::cout ) << std::endl; для объекта a успешно скомпилируется и выполнится. С точки зрения константности члена данных x обоих объектов, то оба эти члена данных для этих объявлений являются константными. Ответ 2
Если речь о множестве действий, которые можно совершить над членом x в том или ином классе, то можно считать эквивалентными: доступ к x имеют только функции-члены соответствующих классов или друзья модификация x запрещена (в a константный член, в b константный весь объект)
Комментариев нет:
Отправить комментарий