String::~String() {
std::cout<<"String()" <<std::endl;
}
我想知道这个析构函数的实现是否有效?
关于const成员函数限定符的另一个问题,我知道const函数不能改变这个类中的变量,它只是只读。如果没有其他奇怪的问题,我想我可以理解,但我看到了一些问题如下:
它允许为此
它保证只能更改此对象指向的可变成员变量
确保所有常量保持不变
它阻止了继承
它允许更改此
根据我的理解,很难检查哪一个是正确的,所以我猜他们都错了?
答案 0 :(得分:4)
析构函数在技术上只是另一个函数,对我来说,这个析构函数在语法上似乎没有任何错误,所以它似乎有效
那就是const成员函数,你无法修改数据。这些函数由类的const实例自动调用。因此,如果除了const-ness之外你有两个具有相同签名的函数,它将为const实例选择const版本,对于非const实例,它将取决于你如何使用它来确定调用哪个版本
a)你不能在const成员函数中调用非const成员函数
b)中正确的
c)正确
d)我不确定你是什么意思通过阻止继承。如果你将一个函数声明为virtual,const或not,它是继承的,可以被子类覆盖e)在const成员函数中,除非声明为可变,否则所有数据都被视为const。
答案 1 :(得分:3)
我想知道这个析构函数的实现是否有效?
析构函数没有任何问题。但问题是:你想要在析构函数中做什么?析构函数通常用于释放资源对象在其存活时保持;因此它应该在它死亡时释放它们,以便其他人可以使用它们。如果它没有释放它们,那么只要程序运行,其他人就不会使用这些资源。这种情况通常被称为资源泄漏,如果资源是内存,则称其为内存泄漏。
答案 2 :(得分:3)
答案 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
指向的值。