析构函数

C++ 类(构造函数和析构函数)

≡放荡痞女 提交于 2019-12-07 08:25:58
文章概述 构造函数和析构函数的由来? 构造函数和析构函数的基本语法 C++编译器构造析构方案 PK 对象显示初始化方案 构造函数的分类以及调用 默认的构造函数 构造函数调用规则 构造函数和析构函数的总结 构造函数和析构函数的由来 类的数据成员不能在类的声明时候初始化,为了解决这个问题? 使用构造函数处理对对象的初始化。构造函数是一种特殊的成员函数,与其他函数不同,不需要用户调用它,而是创建对象的时候自动调用。析构函数是对象不再使用的时候,需要清理资源的时候调用。 构造函数和析构函数的基本语法 a. 构造函数: C++中的类需要定义与类名相同的特殊成员函数时,这种与类名相同的成员函数叫做构造函数; 构造函数可以在定义的时候有参数; 构造函数没有任何返回类型。 构造函数的调用: 一般情况下,C++编译器会自动的调用构造函数。特殊情况下,需要手工的调用构造函数。 class Test { public : //构造函数 Test() { } } b. 析构函数: C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的函数是析构函数; 析构函数没有参数和没有任何返回类型; 析构函数在对象销毁的时候自动调用; 析构函数调用机制: C++编译器自动调用。 class Test { ~ Test () { } } C++编译器构造析构方案 PK 对象显示初始化方案 class Test {

c++ 析构函数调用时机

 ̄綄美尐妖づ 提交于 2019-12-07 08:25:49
析构函数在下边3种情况时被调用: 1. 对象生命周期结束被销毁时 2. delete指向对象的指针时,或者delete指向对象的基类类型的指针,而基类析构函数是虚函数 3. 对象A是对象B的成员,B的析构函数被调用时,对象A的析构函数也会被调用 类声明如下: demo.h class A { protected : int age; public : virtual void print (); A( int ); ~A(); }; class B : public A { public : void print (); B( int ); ~B(); }; class C { private : A a; public : C (A temp); ~C(); }; 类定义如下: demo.cpp A:: A (int t):age(t) { cout << "constructor A!" << endl ; } void A:: print() { cout << "print A!" << endl ; } A:: ~ A () { cout << "destructor A!" << endl ; } B:: B(int t): A (t) { cout << "constructor B!" << endl ; } void B:: print() { cout <<

析构函数(C++学习笔记 19)

别说谁变了你拦得住时间么 提交于 2019-12-07 08:25:30
一、什么是析构函数? 析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于执行一些清理任务,如释放分配给对象的内存空间等。 二、析构函数的特点是什么? 1、析构函数名与类名相同,但它前面必须加一个波浪号(~)。 2、析构函数不返回任何值。在定义析构函数时,是不能说明它的类型的,甚至说明为void类型也不行。 3、析构函数没有参数,因此它不能被重载。一个类可以有多个构造函数,但是只能有一个析构函数。 4、撤销对象时,编译系统会自动地调用析构函数。 三、例子:既含有构造函数,又含有析构函数。 # include <iostream> # include <cmath> using namespace std ; class Complex { public : Complex ( double r = 0.0 , double i = 0.0 ) ; //声明构造函数 ~ Complex ( ) ; double abscomplex ( ) ; private : double real ; double imag ; } ; Complex :: Complex ( double r , double i ) { real = r ; imag = i ; cout << "Constructor called." << endl ; } Complex :: ~

深度剖析C++析构函数

馋奶兔 提交于 2019-12-07 08:25:12
构造函数和析构函数在C 中意味着生命周期的开始和结束,它们的实现原理相同。由于析构函数往往还设置成虚函数,所以这里我重点介绍下C 析构函数的原理和各种场景。 一、析构函数的作用 当对象的生命周期结束时,会自动调用析构函数,以清理一些资源,比如释放内存、关闭文件、关闭数据库连接等等。 二、析构函数调用的时机 (1)基类析构 我们反汇编下查看上面代码: 从反汇编中可以看出,在对象离开它的作用域时,编译器自动给我们添加了一个析构函数调用的语句。 那我们使用new产生的对象会什么时候调用析构函数呢,这里我们把fun1里对象改成动态生成。 void fun1() { Base *base = new Base(); cout<<“fun1 over”<<endl; } 当我们不使用delete释放内存时,看反汇编的情况 此时,没有任何地方调用Base的析构函数 当我们使用delete释放对象时, void fun1() { Base *base = new Base(); delete base; cout<<“fun1 over”<<endl; } 我们反汇编结果: 这里我们看到析构函数调用了,这是因为当我们使用delete删除对象时,编译器会自动在后面添加一条调用析构函数的语句; 从这里我们也可以看书,C

对于虚析构函数的理解

余生颓废 提交于 2019-12-07 08:24:53
首先,对于虚析构函数,那就得说下构造函数和析构函数了。 构造函数:进行初始化成员变量的函数。 析构函数:在对象生命周期结束的时候,完成资源的回收和清理。 如果我们在设计一个类的时候,没有显示声明定义构造函数,析构函数,则编译器会自动生成。 虚析构函数:只有当一个类被定义为基类的时候,才会把析构函数写成虚析构函数。 如果我们不需要使用基类对派生类的对象操作时,我们也不必去定义虚析构函数,这样会增加系统的内存开销,当类里面有虚析构函数时,系统会为当前类分配一个虚函数表,里面存放虚函数指针,这样就会增加类的存储空间。关于虚函数表的一些知识,可以访问:http://blog.csdn.net/haoel/article/details/1948051/ 。 对于虚析构,就是在析构函数前加virtual关键字,那么到底有什么作用呢? 防止内存泄露,定义一个基类的指针p,在delete p时,如果基类的析构函数是虚函数,这时只会看p所赋值的对象,如果p赋值的对象是派生类的对象,就会调用派生类的析构函数(毫无疑问,在这之前也会先调用基类的构造函数,在调用派生类的构造函数,然后调用派生类的析构函数,基类的析构函数,所谓先构造的后释放);如果p赋值的对象是基类的对象,就会调用基类的析构函数,这样就不会造成内存泄露。 如果基类的析构函数不是虚函数,在delete p时,调用析构函数时

析构函数的一些特点

巧了我就是萌 提交于 2019-12-07 08:24:37
完成的工作:   类似构造函数有一个初始化部分和一个函数体部分,析构函数也有一个函数体和一个析构部分。构造函数中,先进行成员的初始化,再执行函数体;而在析构函数中,是先执行函数体,后销毁成员。成员按初始化顺序的 逆序 销毁。 调用析构函数的时机: 无论何时一个对象被销毁,就会自动调用其析构函数。 变量在离开其作用域时被销毁 当一个对象被销毁时,其成员被销毁 容器被销毁时,其元素被销毁 对于动态分配的对象,当对指向它的指针应用delete运算符时被销毁 合成析构函数:   类似构造函数,当一个类未定义自己的析构函数时,编译器会为它定义一个合成的析构函数。 例如,下面的代码片段等价于Sales_data的合成析构函数: class Sales_data { public : //成员会被自动销毁,除此之外不需要做其他事情 ~Sales_data(){} //其他成员的定义 注:在空析构函数体执行完毕后,成员会被自动销毁。认识到析构函数体自身并不直接销毁成员是非常重要的。成员是在析构函数体之后隐含的析构阶段中被销毁的。在整个对象销毁过程中,析构函数体是作为成员销毁步骤之外的另一部分进行的。 参考:《C++ Primer》 来源: CSDN 作者: capecape 链接: https://blog.csdn.net/capecape/article/details/78277265

析构函数的定义

孤街浪徒 提交于 2019-12-07 08:24:07
首先来到一个问题,什么是析构函数,在《C++语言程序设计》(清华大学出版社,以后的博客关于C++的概念部分大多借鉴于此版教材)中,析构函数与构造函数对应,构造函数是始,析构函数是终,比如借了邻居的东西(内存),是要还的(释放),析构函数是做收尾工作的。 他与构造函数的作用几乎正好相反,用来完成对象呗删除前的一些清理工作,是在对象的生存期即将结束的时刻被自动调用的(有特殊情况是可以主动调用析构函数的,后面的博客会讲到),析构函数调用完,也就是说对象彻底凉了,对象用掉的内存空间也要给人家释放回来。一般是个公有函数成员,命名方式是:~类名(){} 和构造函数不同的是析构函数不接受任何的参数,也就是说上述命名方式中,小括号里面不可以有任何东西。如果希望程序在对象被删除之前的时刻自动完成某些事(比如说delete掉new出来的内存),就可以把你想完成的事件写进析构函数中。此外,析构函数的调用执行顺序与构造函数刚好相反,这也是显而易见的。 class Clock{ public: Clock(); ---------->构造函数 void setTime(int newh,int newm,int news);--------->属性 void showTime();------------->行为 ~Clock(){}---------------->析构 private: int hour

析构函数与虚析构函数的用法,构造函数与析构函数调用情况

[亡魂溺海] 提交于 2019-12-07 08:23:37
析构函数的作用: 在对象撤销前做必要的“清理现场”的工作,当派生类的对象从内存中撤销时,一般先调用派生类的析构函数,再调用基类的析构函数,但是如果, 用new运算符动态生成一个派生类的堆对象,并让基类指针指向该派生类对象 ,当程序用delete运算符通过基类指针撤销派生类对象时, 系统只会执行基类的析构函数,而不执行派生类的析构函数 基类中有非虚构函数时的执行情况: #include<iostream> using namespace std; class point { public: point(){cout<<"point constructor"<<endl;} ~point(){ cout<<"executing point destructor"<<endl;} }; class circle:public point { public: circle(double r):radius(r){cout<<"circle constructor"<<endl;} ~circle(){ cout<<"executing circle destructor"<<endl;} private: double radius; }; int main() { point *p=new circle(2.0); delete p; system("pause"); } 执行结果:

第二十节 C++- 析构函数的使用及调用

让人想犯罪 __ 提交于 2019-12-07 08:22:13
析构函数是类的一种特殊函数,只有在对象被销毁时才被调用,在析构函数内,可以对堆内存进行释放,如new(构造函数),delete(析构函数)。 构造函数可以有多个(重载),而析构函数只有一个(不能对析构函数进行重载)。 如果忘记实现析构函数,编译器会自动生成一个伪析构函数(空函数),从下面代码,可以看出析构函数的使用及调用顺序。 /*Human.h*/ #include <string> class Human { private: std::string* name;//为了演示析构函数的作用 /*public类外可访问*/ public: void getPersonName(); Human(std::string input); ~Human(); }; #include <iostream> #include <string> #include "Human.h" /*构造函数(创建对象时被调用)*/ Human::Human(std::string input) { std::cout << "1 call Human()" << std::endl; name = new std::string(input); //在构造函数中用new在堆上创建变量,在析构函数中释放 } /*析构函数(对象被销毁时被调用,类只有一个析构函数*/ Human::~Human() {

java中的析构函数

こ雲淡風輕ζ 提交于 2019-12-07 08:21:54
乍一看,java里面怎么还有这样的词语。其实: 析构函数(destructor) 与 构造函数 相反,当对象结束其 生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。 java中有析构函数,但我们一般用不到它,因为java有自动内存回收机制,无需程序员来释放,也就不要担心内存泄露,只不过java中析构函数所采用的方式不是C++中的那样前加~号,在java中 对象析构时会调用void finalize()方法,因此你如果确实需要析构的话就可以为你写的类添加一个void finalize(){}方法,来完成你所需要的工作 来源: CSDN 作者: 疯狂1024 链接: https://blog.csdn.net/qq_28081081/article/details/80627715