首页 > 其他分享 >[Lang] 构造与析构

[Lang] 构造与析构

时间:2024-08-13 23:08:18浏览次数:7  
标签:Lang 与析构 构造 复制 析构 拷贝 构造函数

[Lang] 构造和析构

1. 深拷贝与浅拷贝

  • 浅拷贝是在复制对象时,仅复制对象的成员变量的值,而不考虑这些成员变量是否指向了动态分配的内存或其他资源。也就是说,浅拷贝只复制指针的值,不复制指针所指向的内容。编译器默认提供的拷贝构造函数是浅拷贝。
  • 深拷贝是在复制对象时,不仅复制对象的成员变量的值,而且会复制指针所指向的内存或资源。这意味着每个对象拥有自己的独立副本,不会共享内存或资源。

当类涉及动态内存分配时,必须使用深拷贝,避免悬空指针问题。

#include<iostream>
#include<cstring>
using namespace std;

class MyString
{
private:
    char *str;
public:
    // 无参构造
    MyString()
    {
        str = nullptr;
        cout << "无参构造" << endl;
    }

    // 有参构造
    MyString(const char *s)
    {
        str = new char[strlen(s) + 1];
        strcpy(str, s);
        cout << "有参构造" << endl;
    }

    // 拷贝构造
    MyString(const MyString &s)
    {
        str = new char[strlen(s.str) + 1];
        strcpy(str, s.str);
        cout << "拷贝构造" << endl;
    }

    // 析构函数
    ~MyString()
    {
        if (str != nullptr) delete[] str;
        cout << "析构函数" << endl;
    }

    void set(const char *s)
    {
        if (str != nullptr) delete[] str;
        str = new char[strlen(s) + 1];
        strcpy(str, s);
    }

    void print()
    {
        cout << str << endl;
    }
};

int main()
{
    MyString s1;
    MyString s2("hello, world!");
    MyString s3(s2);
    s1.set("Hello, World!");
    s1.print();
    s2.print();
    s3.print();
    return 0;
}
[Running] cd "d:\CppDev\Lang\constructor\" && g++ test1.cpp -o test1 && "d:\CppDev\Lang\constructor\"test1
无参构造
有参构造
拷贝构造
Hello, World!
hello, world!
hello, world!
析构函数
析构函数
析构函数

[Done] exited with code=0 in 1.121 seconds

2. 构造与析构的顺序

  • 构造:当创建一个对象时,首先调用构造函数。对于基类和派生类,基类的构造函数先被调用,然后是派生类的构造函数。
  • 析构:当对象被销毁时,首先调用派生类的析构函数,然后是基类的析构函数。这保证了派生类中使用的资源可以先被正确释放。
#include<iostream>
using namespace std;

class ParentClass
{
public:
    ParentClass()
    {
        cout<<"父类构造函数"<<endl; 
    }
    ~ParentClass()
    {
        cout<<"父类析构函数"<<endl; 
    }
};

class ChildClass : public ParentClass
{
public:
    ChildClass()
    {
        cout<<"子类构造函数"<<endl; 
    }
    ~ChildClass()
    {
        cout<<"子类析构函数"<<endl;
    }    
};

int main()
{
    ChildClass obj;
    return 0;
}
[Running] cd "d:\CppDev\Lang\constructor\" && g++ test2.cpp -o test2 && "d:\CppDev\Lang\constructor\"test2
父类构造函数
子类构造函数
子类析构函数
父类析构函数

[Done] exited with code=0 in 0.917 seconds

标签:Lang,与析构,构造,复制,析构,拷贝,构造函数
From: https://www.cnblogs.com/yaoguyuan/p/18357887

相关文章

  • [Lang] 智能指针
    [Lang]智能指针智能指针能够有效简化内存管理,避免内存泄漏和悬挂指针等问题。1.std::unique_ptr独占所有权:一个std::unique_ptr对象拥有其管理的对象的唯一所有权。不允许复制:不能进行复制操作,尝试复制会导致编译错误。允许移动:可以将std::unique_ptr对象移动到另一个......
  • M3KE: A Massive Multi-Level Multi-Subject Knowledge Evaluation Benchmark for Chi
    文章目录题目摘要简介相关工作M3KE实验结论题目M3KE:面向中文大型语言模型的海量多层次多学科知识评估基准论文地址:https://arxiv.org/abs/2305.10263项目地址:https://github.com/tjunlp-lab/M3KE摘要    大型语言模型最近在跨任务泛化、指令跟随等多个......
  • Golang - goto语句
    用途可以无条件地转移到过程中指定的行。该语句通常与条件语句配合使用,可用来实现条件转移,构成循环,跳出循环体等功能,但在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。语法gotolabel;...label:statement;注意:作用域......
  • golang 管道channel相关问题
    一funcmain(){ c1:=make(chanany) <-c1}上面代码运行肯定会报deadlock的死锁错误,但是下面这样,如果有一个协程一直在运行,则不会报错,大致就是因为协程还在运行,所属主协程main不确定是否会往管道c1中写数据,所以就会一直阻塞在这里,上面的代码块或者没有一直执行的协程......
  • 第18 章探讨 C++新标准 移动构造函数解析,强制移动
    第18章探讨C++新标准移动构造函数解析,强制移动第18章探讨C++新标准移动构造函数解析,强制移动文章目录第18章探讨C++新标准移动构造函数解析,强制移动18.2.5强制移动程序清单18.3stdmove.cpp18.2.5强制移动移动构造函数和移动赋值运算符使用右值。如果......
  • Langton's Ant
    Avirtualantlivesonaninfiniteboard,dividedintosquarecells.Each cellcanbeeitherblackorwhite.Forstarters,wecanconsideranempty(all-white)boardwithanantresidinginitsarbitrarylocation.Theantoperates accordingtothefollowi......
  • C++——构造函数和析构函数
    一、初识构造函数和析构函数简单来说,有对象生成必然会调用构造函数,有对象销毁必然会调用析构函数。构造函数的作用是初始化成员变量,是由编译器去调用的,而析构函数同理也是由编译器调用,不过他的作用则是清理。可以由下面的代码体验两个函数的使用。注意:相同点:两个函数都没有......
  • [Lang] 类成员修饰符
    [Lang]类成员修饰符1.访问public成员可以被任何代码访问,包括类的外部和派生类。protected成员不能被类的外部直接访问,但可以被该类的派生类访问。private成员只能在类内部访问,不能被类的外部或派生类直接访问。2.继承public继承:基类public,protected,private在派生类......
  • 使用 langchain 框架,构建一个简单的 LLM 应用程序
    介绍使用langchain框架,构建一个简单的LLM应用程序本文中出现的每段代码都是可以完整执行的注意大语言模型和各类框架迭代飞快,再看本文时,部分代码可能已经过时了本文所用到的python包版本dashscope1.20.3langchain0.2.12langchain-community0.2.11......
  • 构造用于线性回归分析使用的波动上升随机数据并绘制散点图
    一、简介进行线性数据回归分析经常需要用到波动上升的随机数据,本文给出了使用python构建的由线性数据+随机数据+正弦数据的波动上升数据并绘制散点图的代码和效果展示。该数据共5段100个可用于进行线性回归数据分析。二、代码#-*-coding:utf-8-*-#导入第三方库import......