精华内容
下载资源
问答
  • (2)析构函数与类名相同,仅前面加一个~,一般析构函数无参,且无返回值,析构函数具有唯一性,不可重载 (3)若用户没有自定义析构函数,编译器会默认自动生成一个缺省析构函数,即使用户自定义析构函数,在底层...

    C++析构函数

    (1)对于析构函数:析构函数与构造函数相呼应,从调用构造函数开始到自动执行析构函数二者调用期间即为所创建对象实例的生命周期。

    (2)析构函数与类名相同,仅前面加一个~,一般析构函数无参,且无返回值,析构函数具有唯一性,不可重载

    (3)若用户没有自定义析构函数,编译器会默认自动生成一个缺省析构函数,即使用户自定义析构函数,在底层编译器依然会在自定义析构函数的基础上再次调用默认析构函数

    (4)如果一个类中定义有指针,且在使用的过程中动态申请了内存空间,一般建议在调用析构函数前显式释放内存空间,避免内存泄漏

    (5)含有继承关系的类析构的顺序:派生类析构函数->对象成员析构函数->基类析构函数

    虚析构函数

    一般面试中最容易被问到:析构函数能不能写成虚函数???

    判断一个成员方法/函数能不能实现虚函数,需要满足以下两点:

    1. 对象已存在
    2. 函数得有地址

    析构函数在调用时,对象是已经存在的。对于构造函数,inline成员函数,static成员函数调用时对象还没有被创建,因此这三个函数无法定义为virtual函数

    析构函数在调用时,对象是已经存在的且对象的前4个字节存放虚函数指针,而虚函数指针记录虚函数表地址,通过虚函数表可以找到虚析构函数的地址

    析构函数是不是一定要写成虚函数??什么时候必须写成虚函数??

    当使用基类指针指向new开辟出的派生类对象:

    class Base
    {
    
    };
    class Child:public Base
    {
    
    };
    
    
    Base *ptr=new Child();
    delete ptr;

    当使用delete释放资源时,只会调用基类默认析构函数,而不会调用派生类析构函数,如果派生类中有指针成员且开辟内存空间,如果不显示释放内存空间,通过析构无法释放,此时也无法释放派生类资源,造成资源泄漏

    如果将其声明为虚析构函数,基类指针指向派生类对象,析构时会先调用派生类析构函数再调用基类析构函数完成资源释放

    展开全文
  • 什么是析构函数? 析构函数是一个销毁或...析构函数与常规成员函数的区别? 析构函数以波浪号(~)开头,与类名相同。析构函数不接受任何参数,也不返回任何值。 #include <iostream> using std::cout; cl...

    什么是析构函数?

    析构函数是一个销毁或删除对象的成员函数。

    什么时候调用析构函数?

    当对象超出范围时,将自动调用析构函数:

    1. 函数结束
    2. 程序结束
    3. 包含局部变量的块结束
    4. 调用delete运算符

    析构函数与常规成员函数的区别?

    析构函数以波浪号(~)开头,与类名相同。析构函数不接受任何参数,也不返回任何值。

    #include <iostream>
    using std::cout;
    
    class Point {
    private:
        char *s;
        int size;
    public:
        Point(const char* c); //构造函数
        ~Point(); //析构函数
    };
    Point::Point(const char* c) {
        size = strlen(c);
        s = new char[size + 1];
        strcpy_s(s, size + 1, c);
    }
    Point::~Point() {
        cout << "\n调用析构函数销毁对象!!\n";
        delete[]s; //销毁对象时释放对象中分配的char*内存
    }
    int main()
    {
        Point p1("你好,世界!");
        return 0;
    }
    

    一个类中只能有一个析构函数

    什么时候需要编写自定义的析构函数?

    没写析构函数时,编译器会自动创建一个默认的。
    但我们在类中动态分配了内存或指针,则应该编写一个析构函数以销毁该类实例之前释放内存,必须这样做,以免内存泄漏。

    析构函数可以时虚的吗?

    可以,实际上,在基类中使虚析构函数是个好主意。

    展开全文
  • C++:析构函数

    2019-09-24 23:25:54
    析构函数的特点: 1、析构函数与类名相同,但它前面必须加上波浪号~ 2、析构函数不返回任何值,在定义析构函数时,是不能说明它的类型的,甚至说明void类型也不能 3、析构函数没有参数,因此不能被重载。一个类可以...

    析构函数的特点:
    1、析构函数与类名相同,但它前面必须加上波浪号~
    2、析构函数不返回任何值,在定义析构函数时,是不能说明它的类型的,甚至说明void类型也不能
    3、析构函数没有参数,因此不能被重载。一个类可以有多个构造函数,但是只能有一个析构函数
    4、撤销对象时,编译系统会自动调用析构函数

    //例3.13  含有析构函数和构造函数的Conplex类
     
    #include<iostream>
    #include<cmath>
    using namespace std;
    class Complex{
     public:
           Complex(double r=0.0,double i=0.0); //声明默认参数的构造函数
           ~Complex();      //声明析构函数
           double abscomplex();  //声明abscomplex函数 
     private:
           double real;
           double imag;         
    }; 
    Complex::Complex(double r,double i)  //定义构造函数 
    {
           real = r;
           imag = i;
           cout<<"Constructor called"<<endl;
    }
    Complex::~Complex()   //定义析构函数
    {
           cout<<"Destructor called"<<endl;
    } 
    double Complex::abscomplex() //定义abscomplex函数 
    {
           double t;
           t = real*real+imag*imag;
           return sqrt(t);
    }
    int main()
    {
     Complex A(1.1,2.2);
     cout<<"复数的绝对值是:"<<A.abscomplex()<<endl;
     return 0;
    }

    说明:
    (1)每个类必须有一个析构函数。若没有显式的为一个类定义析构函数,则编译系统
    会自动生成一个默认的析构函数。例如,编译系统为类Complex生成类似如下述形式的默认
    析构函数:Complex::~Complex(){}
    类似于系统自动生成的默认构造函数,这个自动生成的默认析构函数的函数体也是空的,但是
    它能完成释放对象所占的内存空间的任务。
    对于大多数类而言,这个默认析构函数就能满足要求。但是,如果在一个对象撤销之前
    需求完成另外一些处理工作的话,则应该显示地定义析构函数,例如:

    class String_data{
     public:
           String_data(char *s)  //构造函数 
           {
             str = new char[strlen(s)+1]; //用运算符new为字符串str动态的分配一个存储空间 
             strcpy(str,s); 
           }
           ~String_data();  //析构函数
           {
             delete str;    //用delete运算符释放动态分配的存储空间 
           } 
           void get_info(char *);
           void sent_info(char *);
     private:
           char *str;        
    };

    这是构造函数和析构函数常见的用法,即在构造函数中用new运算符为字符串分配存储空间
    ,最后在析构函数中通过delete运算符释放已分配的存储空间。

    (2)除了在主函数结束(或调用exit函数)时,对象被撤销,系统会自动调用析构函数函数
    外,在以下的情况下,析构函数也会被调用:
    a、如果一个对象被定义在函数体内,则当这个函数被调用结束时,该对象将释放,析构
    函数被自动调用。
    b、若一个对象是使用new运算符动态创建的,在使用delete运算符释放它时,delete会
    自动调用析构函数。

    #include<iostream>
    using namespace std;
    class String_data{
     public:
           String_data(char *s)  //构造函数 
           {
             str = new char[strlen(s)+1]; //用运算符new为字符串str动态的分配一个存储空间 
             strcpy(str,s); 
           }
           ~String_data()  //析构函数
           {
                cout<<"Destructor"<<endl;
             delete str;    //用delete运算符释放动态分配的存储空间 
           } 
           void get_info(char *);
     private:
           char *str;        
    };
    void String_data::get_info(char *str1)
    {
           str = str1;
           cout<<str<<endl;
    }
    int main()
    {
     String_data sd("abc");
     sd.get_info("xiayuanquan");
     return 0;
    }                    

     

    转载于:https://www.cnblogs.com/XYQ-208910/p/4912118.html

    展开全文
  • C++ 1.3.3 析构函数

    2021-05-18 17:38:54
    (1)析构函数与类名相同,类名前加~; (2)无参数,但可以是虚函数; (3)无返回类型; (4)不能重载(一个类只能有一个); (5)当删除一个对象时,系统自动调用析构函数; (6)析构函数通常被定义在公有部分...

    1.析构函数
    作用:在撤销对象是做一些内存清理工作。
    特征:
    (1)析构函数与类名相同,类名前加~;
    (2)无参数,但可以是虚函数;
    (3)无返回类型;
    (4)不能重载(一个类只能有一个);
    (5)当删除一个对象时,系统自动调用析构函数;
    (6)析构函数通常被定义在公有部分。

    -若类中未定义析构函数,编译系统将产生一个缺省的析构函数,该析构函数是一个空函数。
    2.析构函数的调用
    (1)隐式调用
    (2)显式调用:作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。

    -构造函数和析构函数的调用顺序相反。

    展开全文
  • 构造函数与析构函数

    2013-08-12 09:24:57
    构造函数和析构函数 一:基础 1.构造函数是用来保证初始化类中的成员变量的初值的,以保证每个对象的数据成员都有合适的初始值,...3.当一个对象被破坏或结束时会调用析构函数,析构函数与类名相同并在名字前面有
  • 析构函数与构造函数

    2021-03-06 21:52:35
    2.构造函数名称与类名相同 3.构造函数可以有参数,因此可以发生重载 4.程序在调用对象的时候会自动调用构造,而且只会调用一次,所以我们无需手动调用 析构函数语法: ~类名(){ 要做的操作 } 1.析构函数没有返回值...
  • C++ 析构函数与变量的生存周期实例详解 这篇介绍了析构函数,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 析构函数(destructor)的名字...
  • 函数名称与类名相同, 可以有参数,可以重载 程序在调用对象时会自动调用构造,无须手动调用,而且只调用一次 构造函数和析构函数放在公共权限下 析构函数 ~类名(){} 1,2点与构造函数相同,但是前面加个~号,不...
  • 析构函数

    2019-09-28 16:59:56
    析构函数(destructor) ... }}(1)析构函数与类名相同,只是在函数名前面加一个波浪符~,析构函数既没有修饰符,也没有参数,例如~stud( ),以区别于构造函数。(2)不能在结构中定义析构函数...
  • 构造函数与析构函数概述 C++中用构造函数和析构函数来初始化和清理对象,这两个函数将会被编译器自动调用。...2.函数名称与类名相同 3.构造函数可以有参数,因此可以发生重载 4.程序在调用对象时候会自动调用
  • 一、构造函数与析构函数  1.构造函数的作用:初始化对象的数据成员。在类对象被创建时,编译系统为对象分配内存空间,并自动调用构造函数,由构造函数完成成员的初始化操作。 构造函数特征: 函数名与类名...
  • C++析构函数

    2021-05-09 15:29:15
    在构造函数的基础上有了析构函数,析构函数与构造函数密切相关的,析构函数的作用主要是执行清理任务,释放分配给对象的内存空间 一、析构函数特点 析构函数(destructor)是成员函数的一种,它的名字与类名相同...
  • 本文章向大家介绍php构造函数与析构函数。 php构造函数 1.是对象创建完成后,“第一个”“自动调用”的方法 2.构造方法的定义,方法名是一个固定的, 在php4中:和类名相同的方法就是构造方法 在php5中:构造方法...
  • 构造函数与析构函数及调用顺序构造函数定义特点析构函数定义特点构造函数与析构函数的执行顺序例题 构造函数 定义 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据...
  • 析构函数(destructor)的名字与类名相同,但是前面要加“~”。析构函数没有参数和返回值,当然也就不能被重载。 何时调用析构函数 析构函数在对象消亡时自动调用,这是都了解的情况,但是实际上这还隐含的说:...
  • 构造函数与类名相同,当创建类对象时会自动调用该函数。如果创建类对象时没有手动创建构造函数,系统会自动创建一个默认的构造函数,这个默认的构造函数函数体是空的,无任何功能。 构造函数是作为类的成...
  • c++的目标之一是为了使用类对象就像使用标准类型一样类构造函数应运而生,他专门用于构造新对象 ,将值赋给他们的数据成员,函数与类名相同。用构造函数创建对象后,程序负责跟踪该对象 ,直到其过期为止,程序...
  • 在对象被创建时,构造函数用来初始化对象,构造函数的名称与类名相同,并且构造函数是可以被重载的,而且它没有返回值。 在对象被销毁时,编译器会自动调用该类的析构函数析构函数没有参数也没有返回值,在一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 543
精华内容 217
关键字:

析构函数与类名相同