new创建对象是否调用构造函数和析构函数

探讨了指针在不申请内存时不会调用构造和析构函数的概念,以及使用new为指针分配内存时如何调用这些函数。当通过new为指针开辟空间并用delete释放时,构造和析构函数将被调用。
  • 1.指针不会调用构造和析构函数,只是定义了一个指针,没有申请内存:
    在这里插入图片描述

  • 使用new创建对象时,申请分配内存,调用构造函数:
    在这里插入图片描述

  • 当我们使用new为指针开辟空间,然后用delete释放掉空间会分别调用构造和析构函数:
    在这里插入图片描述

在 C++ 中,构造函数析构函数调用情况如下: ### 构造函数调用场景 - **对象创建时**:当创建一个的对象时,会自动调用构造函数。例如: ```cpp #include <iostream> class Example { public: Example() { std::cout << "Constructor called" << std::endl; } }; int main() { Example obj; // 创建对象调用构造函数 return 0; } ``` - **动态内存分配时**:使用 `new` 运算符动态分配内存创建对象时,会调用构造函数。如: ```cpp #include <iostream> class Example { public: Example() { std::cout << "Constructor called" << std::endl; } }; int main() { Example* ptr = new Example(); // 动态分配内存创建对象调用构造函数 delete ptr; return 0; } ``` - **对象作为函数参数传递时**:如果函数参数是对象型,在传递参数时会调用拷贝构造函数(如果没有自定义拷贝构造函数,会调用默认拷贝构造函数)。例如: ```cpp #include <iostream> class Example { public: Example() { std::cout << "Default Constructor called" << std::endl; } Example(const Example& other) { std::cout << "Copy Constructor called" << std::endl; } }; void func(Example obj) { // 函数体 } int main() { Example obj; func(obj); // 传递对象时调用拷贝构造函数 return 0; } ``` - **函数返回对象时**:函数返回对象时,会调用拷贝构造函数创建返回对象的副本。示例如下: ```cpp #include <iostream> class Example { public: Example() { std::cout << "Default Constructor called" << std::endl; } Example(const Example& other) { std::cout << "Copy Constructor called" << std::endl; } }; Example func() { Example obj; return obj; // 返回对象时调用拷贝构造函数 } int main() { Example result = func(); return 0; } ``` ### 析构函数调用场景 - **对象生命周期结束时**:当对象的作用域结束时,会自动调用析构函数。例如: ```cpp #include <iostream> class Example { public: ~Example() { std::cout << "Destructor called" << std::endl; } }; void func() { Example obj; // 对象在函数结束时作用域结束,调用析构函数 } int main() { func(); return 0; } ``` - **动态内存释放时**:使用 `delete` 运算符释放动态分配的对象内存时,会调用析构函数。如: ```cpp #include <iostream> class Example { public: ~Example() { std::cout << "Destructor called" << std::endl; } }; int main() { Example* ptr = new Example(); delete ptr; // 释放动态内存,调用析构函数 return 0; } ``` - **容器销毁时**:当包含对象的容器(如 `std::vector`)销毁时,容器内的对象会调用析构函数。示例: ```cpp #include <iostream> #include <vector> class Example { public: ~Example() { std::cout << "Destructor called" << std::endl; } }; int main() { std::vector<Example> vec; vec.push_back(Example()); // 当 vec 销毁时,其内部的对象会调用析构函数 return 0; } ``` 需要注意的是,在构造函数析构函数调用虚函数,虽然语法上可行,但可能不会得到预期结果。因为在构造时,派生部分还未完全构造,此时调用虚函数不会发生动态绑定;在析构时,派生部分已经析构,调用虚函数也没有意义,C++ 不会进行动态联编 [^3]。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yhblog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值