关于合成析构函数的几个小问
“不管类是否定义了自己的析构函数,编译器都自动执行类中非static数据成员的析构函数”
“析构函数与复制构造函数或赋值操作符之间的一个重要区别是,即使我们编写了自己的析构函数,合成析构函数仍然运行”
----这是c++primer 4rd的原话
对合成析构函数很不解,问题如下:
1.合成析构函数有必要吗,因为对内置类型的成员,合成析构函数不需要做什么,对类成员,如string成员,没有合成析构函数,超过作用域也会自动调用string析构函数
比如一个函数
void test()
{
string t;
}
test函数结束后,string不也会自动调用析构函数销毁吗,合成析构函数不显得很鸡肋?
2.合成析构函数是什么样的,不会和自己定义的析构函数构成重载吗?规定析构函数是不能重载的啊,或者说合成析构函数不是函数,只是一个运行机制?
3.是不是定义一个类就会合成析构函数,即使是空类
4.合成析构函数会不会被继承?
麻烦高手解答下
[解决办法]
1. 合成析构函数不显得很鸡肋? 不, 它要完成对类及基类的成员析构或调用其析构函数。
2. 不构成重载。
3. 是
4. 会
[解决办法]
建议楼主看看《深度探索C++对象模型》,
[解决办法]
1.这个可以和“浅复制”与“深复制”的情形类比下。
2.和默认构造函数一样吧,只不过它在自定义的析构函数运行完之后还要再运行,目的就是销毁类中其他类,比如有string等的空间;合成析构函数有点自动垃圾处理的感觉。由于对象不能显示调用析构函数,应该不会构成重载。
3.一个空的类在经过c++预处理之后,编译器会自动为你声明一个复制构造或拷贝构造函数(copy constructor)、一个析构函数(destructor)、一个赋值操作符(assignment operator)、和一对取地址运算符(address-of operator)、一个默认构造函数( default constructor )。这些函数都是public和inline类型的。---这是第二版effective c++上的内容;第三版删除了其中的取地址符(不知道为什么)。
4. 不能肯定,感觉既然对每个类都会有合成析构函数,倾向于不被继承,析构的时候各个类按照各自析构的顺序走一遍。
[解决办法]
回20楼
您的代码里注释道
test_B();//函数结束后b的内存被收回,a是b的成员,b的内存被收回,意味着b.a的内存也被收回,调用析构函数;当然调用析构函数是有合成析构函数来完成的,但没有合成析构函数的话,b.a的内存被回收后,它不会调用析构函数吗?
有关于绿色那句,这个真不会!!
如果没有合成析构函数,那么就不会输出"destruct A"……
请类比13楼的故事……
请参阅《Inside the C++ Object Model 》
[解决办法]
这个,得自己查标准。《深度探索C++对象模型》成书比较早,很多说法已经被C++标准修改了。
呼唤那几位还肯动手查标准的吧。
[解决办法]
If a class has no user-declared destructor, a destructor is declared implicitly. An implicitly-declared
destructor is an inline public member of its class. A destructor is trivial if it is an implicitly-declared
destructor and if:
— all of the direct base classes of its class have trivial destructors and
— for all of the non-static data members of its class that are of class type (or array thereof), each such class
has a trivial destructor.
4 Otherwise, the destructor is non-trivial.
5 An implicitly-declared destructor is implicitly defined when it is used to destroy an object of its class type
(3.7). A program is ill-formed if the class for which a destructor is implicitly defined has:
— a non-static data member of class type (or array thereof) with an inaccessible destructor, or
— a base class with an inaccessible destructor.
Before the implicitly-declared destructor for a class is implicitly defined, all the implicitly-declared
destructors for its base classes and its nonstatic data members shall have been implicitly defined. [Note: an implicitly-declared destructor has an exception-specification
[解决办法]
UP~~