Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Константные объекты

#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; ^^^^^ Или другой пример. #include class 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 константный весь объект)

Комментариев нет:

Отправить комментарий