этот деструктор действителен в c ++? - PullRequest
3 голосов
/ 06 мая 2011
  1. String::~String() { std::cout<<"String()" <<std::endl; }

    Интересно, действительно ли эта реализация деструктора?

  2. И еще один вопрос о квалификаторе функции-члена const, я знаю, что функция const не может изменять переменные в этом классе, она только для чтения. Если нет других странных вопросов по этому поводу, я думаю, что могу это понять, но я видел некоторые вопросы следующим образом:

    • Позволяет вызывать неконстантную функцию-член для объекта, на который указывает этот

    • Это гарантирует, что только изменяемые переменные-члены объекта, на который указывает это, могут быть изменены

    • Гарантирует, что все константы остаются неизменными

    • Предотвращает наследование

    • Позволяет изменять состояние объекта, на который указывает это

Исходя из моего понимания, очень трудно проверить, какой из них правильный, поэтому я думаю, что все они не правы?

Ответы [ 4 ]

4 голосов
/ 06 мая 2011
  1. Технически, деструктор - это просто еще одна функция, синтаксически с этим деструктором мне не кажется ничего плохого, поэтому он кажется действительным

  2. Вот и всеесть константные функции-члены, вы не можете изменять данные.Эти функции автоматически вызываются константным экземпляром класса.Поэтому, если у вас есть две функции с одной и той же сигнатурой, за исключением константности, она выберет версию const для экземпляров const и для неконстантных экземпляров, это будет зависеть от того, как вы ее используете, которая определяет, какая версия вызывается

    а) вы не можете вызывать неконстантные функции-члены внутри константной функции-члена

    b) правильно

    в) правильно

    г) я не уверен, что выимею в виду, предотвращая наследование.Если вы объявляете функцию как виртуальную, const или нет, она наследуется и может быть переопределена подклассами

    e) в функциях-членах const, все данные считаются const, если не объявлены как изменяемые.

3 голосов
/ 06 мая 2011

Да, это действительный деструктор.

const не предотвращает наследование.Это также не приводит к инвариантному поведению в методах класса.

Однако этот вопрос на самом деле состоит из нескольких вопросов.

Рекомендую прочитать C++ FAQS.

3 голосов
/ 06 мая 2011

Интересно, допустима ли эта реализация деструктора?

Нет ничего плохого в деструкторе. Но вопрос: это все, что вы хотите сделать в деструкторе? Деструктор обычно используется для освобождения ресурсов, которые хранятся у объекта, когда он жив; поэтому он должен освободить их, когда умрет, чтобы другие могли их использовать. Если это не освобождает их, эти ресурсы не будут использоваться другими, пока выполняется программа. Такая ситуация обычно называется утечкой ресурса, а если ресурс является памятью, он называется утечкой памяти.

0 голосов
/ 06 мая 2011

Относительно вопроса 2.

Хороший способ думать о квалификаторах cv функции-члена - это думать о них как о квалификаторах в указателе 'this'.

Например, если мы написали несколькоКод C ++ в C:

class A
{
public:
  void f1 ();
  void f2 () const;

private:
  int i;
};

Это то же самое, что и следующий код C:

struct A
{
  int i;
};

void f1 (A * const this);        // Non const member
void f2 (A const * const this);  // Const member

Еще одна важная вещь, которую нужно понять, это то, что когда вы ссылаетесь на элемент не статических данныхк нему неявно добавляется класс (*this).:

void A::f1 ()
{
  i = 0;         // This and the next line have the same meaning
  (*this).i = 0;
}

Когда функция-член имеет значение const, указатель this объявляется как указывающий на объект const:

void A::f2 () const
{
  (*this).i = 0;  // Error '*this' is const, so cannot modify (*this).i
}

Один из выводов, который иногда удивляет людей, заключается в том, что функция-член const все еще может изменять данные, на которые указывает указатель на член.Например:

class A
{
public:
  void f () const
  {
    *i = 0;
  }

private:
  int * i;
};

Это выглядит неправильно, но на самом деле это нормально.(*this).i является константой, поэтому вы не сможете изменить то, на что указывает i, но i все еще является указателем на неконстантный int, поэтому мы можем изменить значение, на которое указывает i.

...