首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

重新分配变量时,不会调用析构函数.(C++)

在C++中,重新分配变量时,会调用对象的拷贝构造函数或移动构造函数,而不是析构函数。析构函数仅在对象的生命周期结束时调用。当你重新分配一个变量时,先前的对象会被销毁,然后使用新的值创建一个新的对象。

例如,如果你有一个类MyClass,它有一个拷贝构造函数和一个析构函数:

代码语言:cpp
复制
class MyClass {
public:
    MyClass() {
        // 构造函数
    }

    MyClass(const MyClass& other) {
        // 拷贝构造函数
    }

    ~MyClass() {
        // 析构函数
    }
};

当你重新分配一个MyClass类型的变量时,拷贝构造函数会被调用,而不是析构函数:

代码语言:cpp
复制
MyClass obj1;
MyClass obj2 = obj1; // 调用拷贝构造函数,而不是析构函数

如果你想避免调用拷贝构造函数,你可以使用C++11中引入的移动构造函数:

代码语言:cpp
复制
class MyClass {
public:
    MyClass() {
        // 构造函数
    }

    MyClass(const MyClass& other) {
        // 拷贝构造函数
    }

    MyClass(MyClass&& other) noexcept {
        // 移动构造函数
    }

    ~MyClass() {
        // 析构函数
    }
};

现在,当你重新分配一个MyClass类型的变量时,移动构造函数会被调用,而不是拷贝构造函数:

代码语言:cpp
复制
MyClass obj1;
MyClass obj2 = std::move(obj1); // 调用移动构造函数,而不是拷贝构造函数

请注意,这个答案与云计算和腾讯云无关,因为它是关于C++编程语言的基本知识。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++】构造函数函数概念简介 ( 构造函数函数引入 | 构造函数定义与调用 | 函数定义与调用 | 代码示例 )

一、构造函数函数引入 在 C++ 语言中 , 创建对象 , 需要进行对象创建的初始化工作 , 如 : 创建集合数组 , 为成员变量设置初始值 ; 在 C++ 头文件中 , 声明类的时候 , 不能对类的成员变量设置初始值..." 构造函数 " 是 C++ 类中的一种特殊的 " 成员函数 " , 该函数不需要用户手动调用 , 而是在 C++ 类 实例对象 创建 , 自动执行的 ; " 函数 " 是 构造函数 的 对应相反的函数...; 函数返回值 : 函数 没有返回值 ; 2、函数调用 函数调用 : 自动调用 : C++ 编译器会 在销毁 C++ 类实例对象 , 自动调用类的 函数 ; 3、代码示例 - 函数定义与调用...函数 函数 在栈内存中定义了 Student s1, s2; 对象变量 , 栈内存的特点是 后进先出 , 创建 , 第一个构造函数调用的是 s1 的构造函数 , 第二个构造函数调用的是 s2...的构造函数 , 销毁变量 , 先销毁 s2 对象 , 调用 s2 对象的 函数 , 然后销毁 s1 , 调用 s1 对象的 函数 ;

31320
  • 11.7 C++函数

    C++函数概述 C++函数是一个特殊的成员函数,作用与构造函数相反,它的名字是类名的前面加一个~符号,函数是与构造函数作用相反的函数,当对象的生命期结束,会自动执行函数。...C++执行函数的情况 如果在一个函数中定义了一个对象,当这个函数调用结束,对象应该释放,在对象释放前自动执行函数。...static局部对象在函数调用结束对象并不释放,因此也不调用函数,只在main函数结束调用exitt函数结束程序时,才调用static局部对象的函数。...如果定义了一个全局对象,则在程序的流程离开其作用域调用该全局对象的函数。 如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象,先调用该对象的函数。 ...如果没有定义函数C++编译系统会自动生成一个函数,但它只是徒有函数的名称和形式,实际上什么都不执行,要想让函数执行,必须在定义的函数中指定。

    3K01

    C++构造函数

    构造函数初始化列表 当类的成员变量中存在类时候,同时成员类没有无参或默认构造函数,在创建该类的对象时候会出错。这是需要使用初始化列表。将需要的成员变量进行初始化。...初始化列表的初始化顺序是按成员变量的定义顺序进行初始化,最后执行到构造函数内部。 函数的执行顺序与构造时候相反。...一个对象赋值给另一个对象 Point p2 = p1; 构造函数中作为参数传入 Point p3(p1); 函数调用时,存在类作为参数,实参到形参。...(编译器会做优化,可能不会调用)。...值拷贝成员变量的值。当成员变量中存在指针时候,释放内存空间,会出现野指针问题。 这时候需要重写copy构造函数

    70640

    C++学习笔记 -- 虚函数与纯虚函数

    开始学C++了,所以又重拾以前学习过的相关概念… 函数是当一个对象的生命周期结束,会自动执行函数。...派生类继承自基类,那么基类就只会存在于派生类中,直到派生类调用函数后。...所以这就矛盾了,所以派生类的函数会先被调用,基类的函数再被调用。...… B::f() A::ff() //定义指向基类对象的指针a,当调用f()方法,因为f为虚函数,所以调用了派生类的f(),输出B::f(); 参考: 详解C++中的纯虚函数(虚函数区别)&多态性以及实例应用...C++函数、构造函数、虚函数关系 C++中虚函数工作原理和(虚)继承类的内存占用大小计算

    1.6K40

    C++】构造函数函数

    函数 函数与构造函数功能相反,函数是完成对对象本身的销毁,比如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会自动调用函数,完成对象中资源的清理释放工作...(这里跟构造类似,也不需要加void) 一个类只能有一个函数。若未显式定义,系统会自动生成默认的函数。 对象生命周期结束,系统会自动调用函数。...还需要注意的是我们显示写函数,对于自定义类型成员也会调用他的,也就是说自定义类型成员无论什么情况都会自动调用函数。...如果类中没有申请资源函数可以不写,直接使用编译器生成的默认函数,如Date;但是有资源申请,一定要自己写,否则会造成资源泄漏,如Stack。...对比一下用C++和C实现的Stack解决之前括号匹配问题isValid,我们发现有了构造函数函数确实方便了很多,不会再忘记调用Init和Destory函数了,也方便了不少。

    10110

    C++不要在构造函数函数调用函数

    2.不要在函数调用函数的原因 同样的,在函数调用函数函数的入口地址也是在编译静态决定的。也就是说,实现的是实调用而非虚调用。 考察如下例子。...会先调用类B的函数,然后调用类A的函数,在函数~A()中,调用了虚函数show()。...从输出结果来看,类A的函数对show()调用并没有发生虚调用。...从概念上说,函数是用来销毁一个对象的,在销毁一个对象,先调用该对象所属类的函数,然后再调用其基类的函数,所以,在调用基类的函数,派生类对象的“善后”工作已经完成了,这个时候再调用在派生类中定义的函数版本已经没有意义了...因此,一般情况下,应该避免在构造函数函数调用函数,如果一定要这样做,程序猿必须清楚,这是对虚函数调用其实是实调用

    3.6K30

    C++函数解析

    当派生类对象从内存中撤销一般先运行派生类的函数,然后再调用基类的函数。...如果用new运算符建立的派生类的临时对象,对指向基类的指针指向这个临时对象当用delete运算符撤销对象,系统执行的是基类的函数,而不是派生类的函数,不能彻底的“清理现场”。...解决的方法是将基类及派生类的函数设为虚函数,这时无论基类指针指向哪个派生类对象,系统会采用动态关联,调用相应的函数对对象进行清理。...这样就达到我们的目的了,基类,派生类都调用函数,另外需要注意的是 在基类的函数声明为虚函数,由该基类派生的函数也自动成为虚函数,即使派生类的函数与基类的函数名字不相同。  ...对象cl在函数fc结束执行Circle的函数,撤销局部变量c1.p所指向的对象的地址通过函数返回值赋予q,q所指向的对象在执行delete执行函数

    96270

    C++ 构造函数函数

    那么输出就变成了: p1 age:20 p2 age:50 p3 age:50 4、函数 用构造函数创建对象后,程序负责跟踪该对象,知道其过期为止。当对象过期,程序自动调用函数完成清理工作。...与构造函数一样,C++默认提供了一个空的函数,定义为:~类名( )。...由于开辟在栈区的变量程序会自动释放,因此不需要函数执行清理工作,但是当程序员在堆区开辟空间,需要手动执行清理工作,这时候需要函数来释放堆区内存。...比如: ~person() { // 在函数内写入需要执行的代码 cout << "调用函数" << endl; } person p1(20); person p2(10); // 在生命周期结束后自动调用函数执行清理工作...输出为: 调用函数 调用函数

    96600

    C++】构造函数函数

    本篇文章来讲解C++中构造函数函数的一些比较重要的知识,主要包括下面几个: 1.构造函数函数,没有返回值。2.如果实现多态的话,函数需要是虚函数。3.构造函数不能是虚函数。...4.构造函数函数不能调用virtual函数。 1.构造函数函数没有返回值?...既然我们希望用基类的指针去表示继承类,这种情况下如果函数不是虚函数,就有可能出问题,基类指针函数调用时,不会去释放继承类自己部分的那一部分数据,会导致这部分数据释放不掉。...4.为什么构造函数函数不能调用virtual函数?...函数在继承类的函数调用的时候,对象内的类变量被认为是未定义的值,所以也就没有办法找对对应的虚函数列表,当然也就没有办法找对虚函数列表中的对应函数地址。

    1K21

    C++:构造函数函数

    注意:若一个类中有某些数据成员是另一个类的对象,那么在调用这个类的构造函数,该构造函数会先调用另一个类的构造函数将这些对象初始化后后再执行自己的函数体对该对象进行初始化。...函数 说简单点就是和构造函数有着相反的作用,函数用于初始化而函数用于在对象销毁前将构造函数申请的资源释放。...可以理解为用 new 申请堆内存后需要使用 delete 对其进行释放,函数的作用相当于 delete。...char[20]; } ~instance(){ delete[] name;//释放申请的堆空间 name = nullptr; } 函数在对象生命周期时会依次调用,且调用顺序与构造函数相反...默认构造函数 C++ 规定每一个类都必须有一个构造函数,如果没有定义构造函数,系统将调用默认的构造函数(等价于定义一个空的构造函数)。

    55420

    C++】构造函数函数用途 ( 代码示例 - 构造函数函数用途 )

    一、构造函数函数C++ 语言中 , " 构造函数 " 和 " 函数 " 都是 C++ 类中的 特殊函数 , 分别用于 初始化对象 销毁对象 ; C++ 类 在创建 实例对象 自动调用...; C++ 类 在 销毁 实例对象 自动调用 函数 这个特殊函数 , 其主要作用是 销毁释放对象的成员变量 , 如果需要 可以 执行其他必要的操作 ; 函数 的名称 是 ~ 加上 类的名称...; 函数 没有返回类型 ; 函数 不带参数 ; 二、代码示例 - 构造函数函数用途 在下面的代码中 : C++ 类 Student 类 有 2 个 public 共有成员变量 , public...= NULL) { free(name); } cout << "调用函数" << endl; } public: int age; char* name; }; int... , Student s1 自动调用 Student 类构造函数 , main 函数执行完毕退出程序时 , 自动调用 Student 函数 , 销毁对象 ; 调用构造函数 name : Tom

    17220

    C++C++构造函数函数

    C++提供构造函数来处理对象的初始化。 构造函数是一种特殊的成员函数,不需要用户来调用,定义对象被自动执行。 构造函数名字与类名相同,无返回类型(void也不能有哦)。...函数 也是C++中的一个成员函数函数的作用和构造函数相反。 命名规则与类名相同,但是需要在类名前加上”~”符号。 ~在C++中是取反运算符。...也就是最先被定义的对象,最后被执行函数! 用 new 分配内存时会调用构造函数,用 delete 释放内存时会调用函数。构造函数函数对于类来说是不可或缺的!...在函数内部创建的对象是局部对象,它和局部变量类似,位于栈区,函数执行结束时会调用这些对象的函数。...new 创建的对象位于堆区,通过 delete 删除才会调用函数;如果没有 delete,函数不会被执行。

    61310

    C++ 构造函数函数调用函数的注意事项

    同样的,在函数调用函数函数的入口地址也是在编译静态决定的。也就是说,实现的是实调用而非虚调用。 考察如下例子。...会先调用类B的函数,然后调用类A的函数,在函数~A()中,调用了虚函数show()。...从输出结果来看,类A的函数对show()调用并没有发生虚调用。...从概念上说,函数是用来销毁一个对象的,在销毁一个对象,先调用该对象所属类的函数,然后再调用其基类的函数,所以,在调用基类的函数,派生类对象的“善后”工作已经完成了,这个时候再调用在派生类中定义的函数版本已经没有意义了...因此,一般情况下,应该避免在构造函数函数调用函数,如果一定要这样做,程序猿必须清楚,对虚函数调用其实是实调用

    93410

    C++构造函数函数详解

    无返回值 对象实例化时编译器自动调用对应的构造函数 构造函数可以重载 如果类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显示定义编译器将不再生成。...,默认生成构造函数,但是不会自己初始化。...而对象在销毁时会自动调用函数,完成对象中资源的清理工作。 2、特性 函数名是在类名前加上字符~ 无参数无返回值类型 一个类只能有一个函数。若未显示定义,系统会自动生成默认的函数。...注意函数不能重载 对象生命周期结束C++编译系统自动调用函数。...我们如果不写函数,那系统自动默认生成的函数不会把开辟的指针处理 默认生成函数,行为跟构造类似,内置类型成员不做处理,自定义类型成员会去调用他的 注意构造函数函数都是可以显示调用

    7410

    C++】构造函数函数详解

    而对象在销毁时会自动调用函数,完成对象中资源的清理工作。 函数是类的一种特殊的成员函数,它会在每次删除所创建的对象执行。...注意:函数不能重载 对象生命周期结束C++编译系统系统自动调用函数。...,所以在d销毁,要将其内部包含的Time类的_t对象销毁,所以要调用Time类的函数。...但是main函数中不能直接调用Time类的函数,实际要释放的是Date类对象,所以编译器会调用Date类的函数,而Date没有显式提供,则编译器会给Date类生成一个默认的函数,目的是在其内部调用...Time类的函数,即当Date对象销毁,要保证其内部每个自定义对象都可以正确销毁 main函数中并没有直接调用Time类函数,而是显式调用编译器为Date类生成的默认函数 注意:创建哪个类的对象则调用该类的函数

    22510

    C++ 函数不要抛出异常

    原因在《More Effective C++》中提到两个: (1)如果函数抛出异常,则异常点之后的程序不会执行,如果函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题...(2)通常异常发生c++的异常处理机制在异常的传播过程中会进行栈展开(stack-unwinding),因发生异常而逐步退出复合语句和函数定义的过程,被称为栈展开。...2.解决办法 如果函数必须执行一个动作,而该动作可能会在失败抛出异常,该怎么办?...如果他们不认为这个机会有用(或许他们坚信不会有错误发生),可能忽略它,依赖DBConn函数调用close。...在函数中面对异常,请记住: (1)假如函数中抛出了异常,那么你的系统将变得非常危险,也许很长时间什么错误也不会发生;但也许你的系统有时就会莫名奇妙地崩溃而退出了,而且什么迹象也没有,不利于系统的错误排查

    1.3K40
    领券