关于C++中的拷贝构造和赋值重载的理解

C++中复制构造函数和重载赋值操作符总结 主要介绍了C++中复制构造函数和重载赋值操作符总结,本文对复制构造函数和重载赋值操作符的定义、调用时机、实现要点、细节等做了总结,需要的朋友可以参考下 立即下载

首先考虑C++中的初始化形式:有直接初始化和复制初始化,例如:

  int val(1024); //直接初始化

  int val=1024 ; //复制初始化

此处使用=来初始化,但是C++中初始化和赋值是两种不同的操作,具体参考下面的关于赋值重载的说明。

再回过来看复制构造函数,上面说的复制初始化总是调用复制构造函数。复制初始化首先使用指定的构造函数创建一个临时对象,然后再用复制构造函数将那个临时对象复制到正在创建的对象中。

总之:拷贝构造函数的功能是用一个已存在的对象去构造并初始化另一个新创建的对象。它既要构造一个新的对象,又要把已有的对象内容赋给新对象,其次由于拷贝构造函数要把一个已有的对象的相关内容赋值给新对象,所以需要该类对象的引用做做参数。例如:用一个对象初始化另一个对象的时候:A(const A& a);

下面再看看重载赋值:

需要先了解重载操作符。重载赋值接受单个的形参,且该形参是同一个类类型对象。右操作符一般作为const引用传递。什么时候调用赋值构造?当显式使用 “=”

拷贝函数本质是一个构造函数,只不过他是依据一个已存在的对象(对象内容)来构造另一个对象。这过程中会依次调用父类的构造函数,正如一般构造函数的行为那样。
而赋值运算符,本质是使一个已存在的对象内容与目的对象的内容相同。就是说被赋值的对象已经有内容了。但对于拷贝函数,这时候对象是还没有内容的。

下面是网上的一个例子,我觉得很不错:

C++代码

/*  

language:c++  

author:longsy  

file:rectangle.h  

*/  

namespace longsy {   

    class Rectangle {   

        int width;   

        int height;   

    public:   

                 //带默认实参的默认构造函数   

        Rectangle(int w=0, int h=0);   

            //复制构造函数   

                  Rectangle(const Rectangle & rect);   

                  //赋值操作符   

        Rectangle& operator=(const Rectangle &rect);   

        //析构造函数   

                  ~Rectangle();   

               

        void Draw();   

    };   

}  



/*  

language:c++  

author:longsy  

file:rectangle.cpp  

*/  

#include "rectangle.h"   

using namespace longsy;   

  

#include <iostream>   

  

Rectangle::Rectangle(int w,int h) : width(w),height(h)    

{   

    std::cout << "Rectangle(int w,int h)" << std::endl;   

}   

Rectangle::Rectangle(const Rectangle &rect)    

{   

    this->width = rect.width;   

    this->height = rect.height;   

    std::cout << "Rectangle(const Rectangle &rect)" <<std::endl;   

}   

Rectangle& Rectangle::operator=(const Rectangle &rect)   

{   

    this->width = rect.width;   

    this->height = rect.height;   

    std::cout << "operator=(const Rectangle &rect)" << std::endl;   

    return *this;   

}   

Rectangle::~Rectangle()   

{   

    this->width = 0;   

    this->height = 0;   

    std::cout << "~Rectangle()" << std::endl;      

}   

  

void Rectangle::Draw()   

{   

    std::cout << "Draw the rectangle,width:" << this->width \   

<< ",height:" << height <<std::endl;   

}  


测试文件,test.cpp 
C++代码

/*  

language:c++  

author:longsy  

file:test.cpp  

*/  

#include "rectangle.h"   

using namespace longsy;   

  

int main()   

{   

    Rectangle rect; //调用默认构造函数   

    rect.Draw();   

       

    Rectangle rect1(1,1); //Rectangle(int w,int h)   

    rect1.Draw();   

       

    Rectangle rect2 = rect1;//调用复制构造函数   

    rect2.Draw();   

       

    Rectangle rect3(2,2); //Rectangle(int w,int h)   

    rect3.Draw();   

    rect3 = rect1; //调用赋值操作符   

    rect3.Draw();   

       

    return (0); //调用析构函数   

}   

/*   

运行结果:  

Rectangle(int w,int h)  

Draw the rectangle,width:0,height:0  

Rectangle(int w,int h)  

Draw the rectangle,width:1,height:1  

Rectangle(const Rectangle &rect)  

Draw the rectangle,width:1,height:1  

Rectangle(int w,int h)  

Draw the rectangle,width:2,height:2  

operator=(const Rectangle &rect)  

Draw the rectangle,width:1,height:1  

~Rectangle()  

~Rectangle()  

~Rectangle()  

~Rectangle()  

*/  


在C++中复制控制是一个比较重要的话题,主要包括复制构造函数、重载赋值操作符、析构函数这三部分,这三个函数是一致的,如果类需要析构函数,则它也需要复制操作符 和 复制构造函数,这个规则被称为 C++的“三法则”。如果需要手动定义了其中了一个,那么另外的两个也需要定义,通常在存在指针或者前期相关操作的情况下,都需要手动的定义。

       复制构造函数与重载赋值操作符实现的大题相同,如果没有手动的实现,那么编译器会自动生成一个,而且这两个函数的参数也是一致的,是不能够改变的。析构函数相比前面的两个存在一个巨大的差别,就是无论我们是否定义这个函数,编译器都会自动生成一个析构函数。析构函数主要是完成对象的释放操作。

      复制构造函数与重载赋值操作符在没有定义的情况下,编译器会为我们生成一个,这说明这两个函数是一个类必不可少的部分。由此可知如果一个类没有定义任何的东西,编译器也会帮助我们生成下面的4个函数:
1、一个构造函数,也就是所谓的类名比如classname(),这是在没有定义构造函数时,编译器会自动生成的。
2、析构函数,
3、复制构造函数。
4、重载赋值操作符。
假设存在一个类Base;
   class Base 
    {
        public:
            Base(); //构造函数
            Base(const Base &);  // 复制构造函数
            Base & operator = (const Base &);   // 赋值操作符
            ~Base();   // 析构函数
        private:
            .......
    };

现在对复制构造函数和赋值操作符做个详细的说明,下面是一个将要使用的例子;

class CExample
{
public :
     CExample(){pBuffer=NULL; nSize=0;}   //构造函数
     ~CExample(){delete pBuffer;}   // 析构函数
    void Init(int n){ pBuffer=new char [n]; nSize=n;}
private :
    char *pBuffer; //类的对象中包含指针,指向动态分配的内存资源
    int nSize;
};
    这个类的主要特点是包含指向其他资源的指针。 pBuffer指向堆中分配的一段内存空间。 
一、拷贝构造函数
int main(int argc, char * argv[])
{
     CExample A;
     A.Init40);
    
     CExample B=A; //把B初始化为A的副本
     ...
}
    B = A ; 此语句的具体过程:首先建立对象theObjtwo,并调用其构造函数,然后成员被拷贝。
    语句"CExample B=A;"  用 A 初始化 B。 其完成方式是内存拷贝,复制所有成员的值。 完成后,A.pBuffer = B.pBuffer,  即它们将指向同样的地方,指针虽然复制了,但所指向的空间并没有复制,而是由两个对象共用了。这样不符合要求,对象之间不独立了,并为空间的删除带来隐患。 所以需要采用必要的手段(拷贝构造函数)来避免此类情况。 

 拷贝构造函数的格式为 : 构造函数名(对象的引用)  提供了拷贝构造函数后的CExample类定义为: 
class CExample
{
public :
     CExample(){pBuffer=NULL; nSize=0;}  //构造函数
     ~CExample(){delete pBuffer;}   // 析构函数
     CExample(const CExample&); //拷贝构造函数
    void Init(int n){ pBuffer=new char [n]; nSize=n;}
private :
    char *pBuffer; //类的对象中包含指针,指向动态分配的内存资源
    int nSize;
};

 //拷贝构造函数的定义
CExample::CExample(const CExample& RightSides)
{
     nSize=RightSides.nSize;    //复制常规成员
     pBuffer=new char [nSize];    //复制指针指向的内容
     memcpy(pBuffer,RightSides.pBuffer,nSize*sizeof (char ));
}
    这样,定义新对象,并用已有对象初始化新对象时,即执行语句“CExample B=A; ” 时,CExample(const CExample& RightSides)将被调用,而已有对象用别名RightSides传给构造函数,以用来作复制。原则上,应该为所有包含动态分配成员的类都提供拷贝构造函数。 

拷贝函数被调用的情况有:
1,定义新对象,并用已有对象初始化新对象时; 即执行语句“CExample B=A; ” 时(定义对象时使用赋值初始化);
2,当对象直接作为参数传给函数时,函数将建立对象的临时拷贝,这个拷贝过程也将调同拷贝构造函数。 
    例如:
        BOOL testfunc(CExample obj)
        {
             //针对obj的操作实际上是针对复制后的临时拷贝进行的
        }
        testfunc(theObjone); //对象直接作为参数,拷贝函数将被调用;
3,当函数中的局部对象被返回给函数调者时,也将建立此局部对象的一个临时拷贝,拷贝构造函数也将被调用 ;
    例如:
    CTest func()
    {
         CTest   theTest;
         return   theTest
     }  

二、赋值符的重载 
   下面的代码与上例相似
int main(int argc, char * argv[])
{
     CExample A;
     A.Init(40);
    
     CExample C;
     C.Init(60);

     //现在需要一个对象赋值操作,被赋值对象的原内容被清除,并用右边对象的内容填充。
     C = A;
    return 0;
}
    也用到了"="号,但与上面的例子中语句“ CExample B=A;  ” 不同“ CExample B=A;  ”语句中的 "=" 在对象声明语句中,表示初始化。更多时候,这种初始化也可用括号表示。 例如 CExample B(A); 

    而本例子中,"=" 表示赋值操作。将对象 A 的内容复制到对象C;,这其中涉及到对象C 原有内容的丢弃,新内容的复制。 但"="的缺省操作只是将成员变量的值相应复制。旧的值被自然丢弃。 由于对象内包含指针,将造成不良后果:指针的值被丢弃了,但指针指向的内容并未释放。指针的值被复制了,但指针所指内容并未复制。 因此,包含动态分配成员的类除提供拷贝构造函数外,还应该考虑重载"="赋值操作符号。 

类定义变为: 
class CExample
{
public :
     CExample(){pBuffer=NULL; nSize=0;}  //构造函数
     ~CExample(){delete pBuffer;}   // 析构函数
     CExample(const CExample&); //拷贝构造函数
     CExample& operator = (const CExample&); //赋值符重载
    void Init(int n){ pBuffer=new char [n]; nSize=n;}
private :
    char *pBuffer; //类的对象中包含指针,指向动态分配的内存资源
    int nSize;
};
//赋值操作符重载
CExample & CExample::operator = (const CExample& RightSides)
{
     nSize=RightSides.nSize; //复制常规成员
    char *temp=new char [nSize]; //复制指针指向的内容 
     memcpy(temp,RightSides.pBuffer,nSize*sizeof (char ));

    delete []pBuffer; //删除原指针指向内容   (将删除操作放在后面,避免X=X特殊情况下,内容的丢失)
     pBuffer=temp;    //建立新指向
    return *this 
}
三、拷贝构造函数使用赋值运算符重载的代码。 
CExample::CExample(const CExample& RightSides)
{
     pBuffer=NULL;
     *this =RightSides      //调用重载后的"="
}

    为了更好地理解拷贝构造函数   
 1、为什么要有拷贝构造函数,它跟构造函数有什么区别?
       答:拷贝构造函数其实也是构造函数,只不过它的参数是const 的类自身的对象的引用。如果类里面没有指针成员(该指针成员指向动态申请的空间),是没有必要编写拷贝构造函数的 。     我们知道,如果有一个类CObj,它已经产生了一个对象ObjA,现在又用CObj去创建ObjB,如果程序中使用语句ObjB = ObjA; 也就是说直接使用ObjA的数据给ObjB赋值。这对于一般的类,没有任何问题,但是如果CObj里面有个char * pStr的成员,用来存放动态申请的字符串的地址,在ObjA中使用new 方法动态申请了内存并让ObjA.pStr指向该申请的空间,在OjbB = OjbA之后,ObjA.pStr和ObjB.pStr将同时指向那片空间,这样到导致了谁也不知道到底该由谁来负责释放那块空间,很有可能导致同一块内存被释放两次。     使用拷贝构造函数,先申请ObjA.pStr所指向的空间大小的空间,然后将空间内容拷贝过来,这样就不会同时指向同一块内存,各自有各自申请的内存,各自负责释放各自申请的内存,从而解决了刚才的问题。所以这里的“拷贝”拷贝的是动态申请的空间的内容,而不是类本身的数据。另外注意到,拷贝构造函数的参数是对象的引用,而不是对象的指针。至于为什么要用引用,不能够用指针暂时还没有搞明白,等搞明白了再说。    
2、为什么要对=赋值操作符进行重载?
    答:接上面的例子,用户在使用语句ObjB = ObjA的时候,或许ObjB的pStr已经指向了动态申请的空间,如果直接简单将其指向的地址覆盖,就会导致内存泄露,所以需要对=赋值操作符进行重载,在重载函数中判断pStr如果已经指向了动态申请的空间,就先将其释放。    
3、拷贝构造函数和=赋值操作符重载的关系。
    答:从原文的例子中可以看出,=赋值操作符重载比拷贝构造函数做得要多,它除了完成拷贝构造函数所完成的拷贝动态申请的内存的数据之外,还释放了原本自己申请的内存空间。所以原文最后给出的拷贝构造函数的实现可以使用=赋值操作符的重载来完成。    
4、拷贝构造函数何时被调用?
    a.对象的直接赋值也会调用拷贝构造函数  ;
    b.函数参数传递只要是按值传递也调用拷贝构造函数;
    c.函数返回只要是按值返回也调用拷贝构造函数。 

 四、拷贝构造函数 和 赋值运算符重载 为什么要使用引用? 
    
首先先说下基类 和 派生类的关系:
    例如:
        class Derived:public Base
        {
            public:
              .....
            private:
                .......
        };
 
 不同继承方式的基类和派生类特性

继承方式基类特性派生类特性公有继承publicpublicprotected
privateprotected
不可访问私有继承publicprivateprotected
privateprivate
不可访问保护继承publicprotectedprotected
privateprotected
不可访问
        首先,派生类对象的引用初始化基类引用。多态性的动态绑定中存在两个条件:1,必须是virtual 函数(虚函数);2, 必须是通过基类的引用或基类的指针进行成员函数的调用。
     

    由于派生类中存在基类的成员,也就相当于一个派生类对象中包含了一个基类对象,所以可以采用一个基类引用来绑定一个派生类对象。引用实质上是针对一块内存区域,引用是一个标号,是这块内存区域的一个名字,一个引用与一块内存区域绑定,因为派生对象中存在基类部分,可以认为派生对象的区域中存在基类对象,这时可用基类的引用来表明这块内存区域,即采用一个基类的别名来表示(绑定)这段内存区域,派生对象的地址(这段内存)以及内容都没有发生改变,也没有重现创造出一个新的对象,基类的引用还是指向这个派生对象。对于指针的分析方式相似。因此可以采用基类的引用绑定派生类对象。

   

    但是如何实现派生类对象到基类的转换呢?

    这时候的转换与前面的绑定存在很大的差别,因为这是重新分配一个基类对象,而不再是引用问题,不再是绑定问题,是依据一个派生类对象生成一个新的基类对象。因为派生类对象中存在一个基类对象基本的信息,完全可以生成一个基类对象,完全将此过程看作是一个初始化或者赋值的问题。也就是采用派生类创建一个新的对象或者赋值一个对象。

    从上面的分析我们可以采用下面的形式来实现:
     Base(const Derived &);
     
Base &operator=(const Derived &);

    是在基类函数中采用构造函数基于派生类来重载一系列的构造函数,但是这也存在一个问题,如果存在很多派生类,这时候就要重载很多构造函数,这肯定不是我们需要的。

 

    这时候我们发现对于一个类而言,为什么复制构造函数和重载赋值操作符这么重要了。因为这两个函数都是接受一个基类的引用,根据前面的分析我们知道一个基类引用完全可以绑定一个派生类的对象,而派生类对象中又包含了一个基类对象的基本信息。我们能够实现一个从一个派生对象到基类的构造过程。
    我们用一个基类引用绑定一个派生对象,然后采用基类引用对基类成员进行访问,完成了一个基类对象基本要素的填充操作,相当于完成了基类对象的创建,也就是构造问题。这样也就能完成由派生类对象到基类对象的构造过程。

 

    总结起来说了,因为在复制构造函数中,C++中的基类引用可以绑定一个派生类的对象,如果在允许访问的情况下,采用基类引用可以访问基类的成员以及派生类的其他成员,采用引用可以复制派生类对象中基类成员的值到新创建的基类成员中,完成一个基类成员数据的填充操作,这时候一个完整的基类对象就创建完成了。

 

    重载赋值操作符则是发生在使用一个派生对象来赋值一个基类对象时,这时候也是const基类引用绑定一个派生类对象,然后复制对应的基类成员到基类对象对于的成员中,完成一个基类对象成员的更新操作。

 

    复制构造函数不仅仅实现了同类型之间的初始化操作,同时也完成了采用一个派生类对象初始化一个基类对象的操作,重载赋值操作符实现了同类型之间的赋值操作,也完成了采用派生类对象赋值基类对象的操作。如果没有这两个函数的存在,也就不能完成派生类到基类的赋值和初始化操作。这也是为什么一定会存在这两个函数的原因。


pytorch多层感知机实现假钞识别(完整项目构建) 目录1 项目构建2 超参数设置 config.py3 数据集预处理 preprocess.py4 数据集类构建 dataset_banknote.py5 模型构建 model.py6 训练trainer.py6.1 查看损失曲线7 在测试集上运行 inference.py 1 项目构建 构建项目文件夹Banknote,以及子文件夹与py文件。 名称 作用 data目录 存放原始数据与预处理后切分为训练集、验证机、测试集的数据 log目录 存放训练过程中保存的指标,如损失、精确度等 阅读详情

相关推荐

python 解析bag文件(不用安装ros系统)

在网上找了很多教程都是安装ros系统之后再通过ros自带的包来解析bag文件,但我并不想安装ros系统,之前我也是通过安装ros系统在来解析bag文件,我觉得不是很方便,主要有两点原因,(1)安装ros需要root用户权限(2)ros系统只支持Python2的接口,一般我都是Python3的conda环境,这样每次调用rosbag时都需要先把当前的conda环境注释掉,不然会报错,然后使用完毕在回到conda环境 ros本身是提供了C++和Python的接口,因为我目前的诉求就只是解析bag文件,我想肯定有

sabrinalx的博客 1万+

c++中的拷贝构造函数和赋值运算符重载

c++拷贝构造函数和运算符重载的使用

qq_51536567的博客 860

从零开始:QNX SDP 8.0开发环境搭建与实战入门

本文详细介绍了如何从零开始搭建QNX SDP 8.0开发环境并进行实战入门。内容涵盖许可证获取、环境安装、命令行与IDE工具使用、BSP构建、系统镜像生成,以及编写、编译和运行第一个QNX程序的全过程。旨在帮助嵌入式开发者,特别是汽车电子和工业控制领域的工程师,快速掌握这一实时操作系统(RTOS)的开发基础。

weixin_29163857的博客 641

C++-----类的构造函数、析构函数、拷贝构造函数以及赋值运算符重载函数

目录 构造函数 析构函数 拷贝构造函数 赋值运算符重载函数 构造函数 我们知道对于C语言,初始化结构体变量,我们可以在结构体外直接对变量进行初始化(变量默认为共有属性);如下所示: struct Complex //定义结构体Complex { int real; int imag; }; Complex com1 = {2,3}; //初始化结构体变...

FDk_LCL的博客 917

置换矩阵、转置矩阵以及向量空间、子空间

置换矩阵、转置矩阵以及向量空间、子空间导读置换矩阵 导读 MIT矩阵分析课程之后的的二篇笔记。

qq_44677482的博客 1673

【NTN 卫星通信】使用地面网络和卫星网络接入的终端应用场景

卫星接入有广覆盖的特点, 可以改善地面接入网覆盖或无线条件差的地区(例如多径干扰)的服务可用性。对于高速移动中需要实时业务的终端,如IMS语音/视频会议,可以通过地面接入和卫星接入同时实现与5G系统的双连接,在地面接入网不可用的情况下获得连续可靠的业务。

weixin_43603524的博客 2558

C++拷贝构造函数与赋值运算符重载函数

作者:奋斗者快乐着 https://www.bilibili.com/read/cv16169735/ 出处:bilibili

shaozheng0503的博客 433

Setup&Hold互卡问题和Useful Skew的影响

setup和hold互卡问题分析

godping的博客 5094

C++赋值运算符重载 &&拷贝构造和赋值运算符重载区别

C++赋值运算符重载 &&拷贝构造和赋值运算符重载区别

Titoko的博客 1519

在Ubuntu 18下安装SIMULIA Abaqus 2020

参考资料: https://github.com/imirzov/Install-Abaqus-2019-on-Ubuntu-18.04-LTS 安装环境: Ubuntu 18.4 LTS 软件版本: SIMULIA for Linux 2020 1 准备 安装光盘及破解文件 解压光盘至一目录,不能挂载,因为要修改文件内容 /home/sunwk/Downloads/abaqus2020 更改文件权限为最大 sudo chmod -R 777 abaqus2020/ * 复制libpng12

oak619的博客 1万+

网络工程师软考通关指南:网络新技术与应用深度解析

网络安全与管理是网络工程师必须掌握的核心技能,华为设备在企业网络中广泛应用。建议考生在理解安全原理的基础上,重点掌握华为特有的命令体系和配置方法,通过模拟实验加深理解。下篇文章将深入讲解"网络优化与QoS"章节,涵盖流量调度、拥塞避免、服务质量等关键技术,敬请期待。

Programming Talk 253

C++课堂笔记0711

1.类的声明和定义 C++中类定义类的声明部分一般分为类声明部分和类的实现部分。类的声明部分用来说明 类中的成员(数据成员,数据函数),告诉使用者干什么。 类实现部分用来定义成员函数,该函数用来对数据成员进行操作,告诉使用者怎么干。 类的定义的一般形式 : class { public:     ; protected:      ; privated:       ;

wangzhencu的博客 468

第三方 API 调用 OpenClaw 出现 LLM request timed out 的解决方案

本文主要介绍了第三方 API 调用 OpenClaw 出现 LLM request timed out 的解决方案,希望能对使用OpenClaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

【C++】走进 ⌈ 类和对象 ⌋ 的核心 - 感受C++的精华 _ 剖析默认成员函数 | 构造函数 | 析构函数 | 拷贝构造函数 | 赋值运算符重载

✨对于内置类型来说:编译器自动生成的构造函数(显示定义一个全缺省的构造函数)和析构函数就已经足够了编译器自动生成的拷贝构造函数和赋值运算符重载会实现浅拷贝对于自定义类型来说:编译器会自动调用其默认成员函数实现相关的初始化、拷贝赋值、析构等操作若自定义类型的成员涉及深拷贝等操作,我们则需要对拷贝构造函数和赋值运算符重载显示实现深拷贝若涉及到内存的释放,析构函数需要显示定义去释放空间。

Dream_Y.ocean的博客 1704

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函数)

本文详细介绍了拷贝构造函数、赋值运算符重载、const成员以及取地址及const取地址操作符重载这几个C++的重要概念,并对它们的作用和用法进行了解释和说明。这些概念在C++编程中具有重要的应用价值,对于理解和设计高效的C++程序至关重要。

Yawesh的博客 1291

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

[C++:类的默认成员——lesson6.拷贝构造函数&&赋值运算符重载]

在我们前面学习的类中,我们会定义成员变量和成员函数,这些我们自己定义的函数都是普通的成员函数,但是如若我们定义的类里什么也没有呢?是真的里面啥也没吗?如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的任何一个类在我们不写的情况下,都会自动生成6个默认成员函数。【默认成员函数概念】用户没有显式实现,编译器会生成的成员函数称为默认成员函数⭐其中上次的博客已经详细的讲解了lesson5.构造函数&&析构函数的使用方法,所以本次博客将继续深度的讲解拷贝构造和赋值运算符的重载问题。⭐。

2401_83386596的博客 1662

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载、Const成员)详细解读

C++类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载、Const成员)详细解读构造函数什么是构造函数?构造函数的特点析构函数析构函数概念析构函数特性拷贝构造函数拷贝构造函数的概念拷贝构造函数的特征赋值运算符重载运算符重载Const成员补充 构造函数 什么是构造函数? 当建立一个对象时,通常最需要立即做的工作是初始化对象,如对数据成员赋初值等 构造函数就是用来在创造对象时初始化对象,为对象数据成员赋初始值 ——初始化对象+申请资源 下面以创建Date对象举例说明: 创建Data对象的同时并给对象设

weixin_44814867的博客 1133

【c++初阶】类与对象(中)

构造函数是一种特殊的方法,主要用于在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。构造函数的名称应与类的名称完全相同,它不具有任何类型,也没有返回值。构造函数的主要目的是在创建对象时执行一些初始化操作,确保对象在创建时处于正确的状态。构造函数是一个特殊的成员函数,需要注意的是构造函数虽然名称叫构造,但是构造函数的主要任务并不是看空间创建对象,而是初始化对象。析构函数是C++中的一个特殊成员函数,它在对象的生命周期结束时自动被调用。

weixin_74967884的博客 2084

c++中拷贝构造函数与赋值运算符重载有哪些区别

在C++中,拷贝构造函数和赋值运算符重载(assignment operator overload)都是用于处理对象之间的复制操作,但它们之间存在一些重要的区别。这个运算符通常用于将一个对象的值赋给另一个已经存在的对象。它返回一个对调用对象的引用,这允许连续赋值操作。拷贝构造函数是一种特殊的构造函数,它用于创建一个新的对象作为现有对象的副本。是对现有对象的引用。可以被重载以定义自定义类型的对象赋值操作。

m0_75032658的博客 606

C++类与对象 — 中(对构造、析构、拷贝构造、运算符重载的理解)

C++类与对象 — 中一、类的6个默认成员函数二、 构造函数2.1 、概念2.2、特性三、析构函数3.1 概念3.2 特性 一、类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。 二、 构造函数 2.1 、概念 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。 2.2、特性 构造函数是特殊的成员函数

weixin_64181464的博客 488

Learning C++ No.5【类和对象No.4】

一文带你搞定什么是运算符重载、拷贝构造函数和赋值重载函数

狂小伍的博客 1524

c++第三篇 类和对象(中) 构造函数 析构函数 拷贝构造 赋值重载

内置类型就是语言提供的原生数据类型,如:int/char/double/指针等,自定义类型就是我们使用class/struct等关键字自己定义的类型。

Mike的博客 1061

【C++】类和对象(中)

本文介绍了C++中类的默认成员函数,重点讲解了构造函数、析构函数和拷贝构造函数的核心概念与使用要点。主要内容包括: 构造函数:用于对象初始化,特点包括与类同名、无返回值、可重载等。编译器会默认生成无参构造函数,但内置类型成员初始化不确定,自定义类型会调用其默认构造。 析构函数:用于资源清理,特点包括~类名形式、无参无返回值。内置类型成员不处理,自定义类型会调用其析构函数。有资源申请时必须显式实现。 拷贝构造:特殊的构造函数,第一个参数必须是类类型引用,否则会无限递归。默认生成的拷贝构造对内置类型浅拷贝,自定

yuuki233233的博客 1351

c++ 面试整理

1. 继承方式 public      父类的访问级别不变 protected    父类的public成员在派生类编程protected,其余的不变 private        父类的所有成员变成private #include &lt;iostream&gt; using namespace std; class base { public: ...

weixin_34351321的博客 140

C++中的类与对象(中)

在C++类中,有几个自带的函数,这些函数不需要我们自己去写,编译器会帮我们默认生成,别看它们是编译器默认生成的,其实作用还不小呢,接下来就让我们学习一下这几个默认函数吧。在这节我们介绍了类中自动默认生成的6个函数,但是其主要还是前面四个函数,这四个函数对于后面还有着许多用处,希望我们能够好好理解,至于后面两个函数我们要知道有,并且它是什么样子,怎么用就可以了。学路漫漫,加油啊~

H2X7_的博客 1159

C++默认成员函数

C++基础概念(三) 文章目录C++基础概念(三)前言一、构造函数二、析构函数三、拷贝构造函数和运算符重载四、赋值运算符重载 前言 `本文主要介绍类的几个默认成员函数,有默认构造函数,析构函数,拷贝构造和运算符重载,以日期类为例说明 一、构造函数 什么是构造函数,有什么价值,使用需要注意哪些事项? 首先构造函数是一个特殊的成员函数,名字与类相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象生命周期内只调用一次。 默认构造函数有三种 无参的 全缺省或半缺省的构造函

qq_26566377的博客 680
上一篇: 正则表达式
下一篇: error"Cannot declare member function ...to have static linkage"
岚尘
博客等级 码龄18年 0粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值