这个析构函数在c ++中有效吗?

时间:2011-05-06 17:55:41

标签: c++ const destructor

  1. String::~String() { std::cout<<"String()" <<std::endl; }

    我想知道这个析构函数的实现是否有效?

  2. 关于const成员函数限定符的另一个问题,我知道const函数不能改变这个类中的变量,它只是只读。如果没有其他奇怪的问题,我想我可以理解,但我看到了一些问题如下:

    • 它允许为此

    • 指向的对象调用非const成员函数
    • 它保证只能更改此对象指向的可变成员变量

    • 确保所有常量保持不变

    • 它阻止了继承

    • 它允许更改此

    • 指向的对象的状态
  3. 根据我的理解,很难检查哪一个是正确的,所以我猜他们都错了?

4 个答案:

答案 0 :(得分:4)

  1. 析构函数在技术上只是另一个函数,对我来说,这个析构函数在语法上似乎没有任何错误,所以它似乎有效

  2. 那就是const成员函数,你无法修改数据。这些函数由类的const实例自动调用。因此,如果除了const-ness之外你有两个具有相同签名的函数,它将为const实例选择const版本,对于非const实例,它将取决于你如何使用它来确定调用哪个版本

    a)你不能在const成员函数中调用非const成员函数

    b)中正确的

    c)正确

    d)我不确定你是什么意思通过阻止继承。如果你将一个函数声明为virtual,const或not,它是继承的,可以被子类覆盖

    e)在const成员函数中,除非声明为可变,否则所有数据都被视为const。

答案 1 :(得分:3)

  

我想知道这个析构函数的实现是否有效?

析构函数没有任何问题。但问题是:你想要在析构函数中做什么?析构函数通常用于释放资源对象在其存活时保持;因此它应该在它死亡时释放它们,以便其他人可以使用它们。如果它没有释放它们,那么只要程序运行,其他人就不会使用这些资源。这种情况通常被称为资源泄漏,如果资源是内存,则称其为内存泄漏。

答案 2 :(得分:3)

是的,这是一个有效的析构函数。

const不会阻止继承。它也不会在类的方法中带来不变行为。

但这个问题实际上是多个问题。

我建议阅读C++ FAQS

答案 3 :(得分:0)

关于问题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是const,因此您无法更改i指向的内容,但i仍然是指向非const int的指针,因此我们可以修改i指向的值。