【C++笔记5】类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载)

发布时间:2026/5/27 4:31:26

【C++笔记5】类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载) C学习笔记一、类的6个默认成员函数二、构造函数1.概念2.特性3.自动生成一个无参的默认构造函数4.基本代码三、析构函数1.概念2.特性3.基本代码四、拷贝构造函数1.概念2.特性3.基本代码4.拷贝构造函数典型调用场景五、赋值运算符重载1.运算符重载1.1基本概念1.2注意要点2.赋值运算符重载2.1赋值运算符重载格式2.2注意要点3.前置和后置重载所有运行结果均在编译器VS2022Debug,x86的环境下得出。一、类的6个默认成员函数如果一个类中什么成员都没有简称为空类。空类中真的什么都没有吗并不是任何类在什么都不写时编译器会自动生成以下6个默认成员函数。默认成员函数用户没有显式实现编译器会生成的成员函数称为默认成员函数。class Date {};二、构造函数1.概念构造函数是一个特殊的成员函数名字与类名相同,创建类类型对象时由编译器自动调用以保证每个数据成员都有 一个合适的初始值并且在对象整个生命周期内只调用一次。2.特性构造函数是特殊的成员函数需要注意的是构造函数虽然名称叫构造但是构造函数的主要任务并不是开空间创建对象而是初始化对象。函数名与类名相同。无返回值。对象实例化时编译器自动调用对应的构造函数。构造函数可以重载。内置类型成员变量在类中声明时可以给默认值。无参的构造函数和全缺省的构造函数都称为默认构造函数。默认构造函数只能有一个。注意无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数都可以认为是默认构造函数。3.自动生成一个无参的默认构造函数如果类中没有显式定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦用户显式定义编译器将不再生成。classStack{public:Stack(){_a(int*)malloc(sizeof(int)*4);if(_anullptr){perror(malloc error);return;}_capacity4;_top0;}private:int*_a;int_capacity;int_top;};classDate{public:private:int_year;int_month;int_day;Stack st;};intmain(){Date d1;return0;}4.基本代码#includeiostreamusingnamespacestd;classDate{public:Date()//无参的构造函数{_year1;_month1;_day1;}Date(intyear,intmonth,intday)//带参的构造函数{_yearyear;_monthmonth;_dayday;}private:int_year;int_month;int_day;};intmain(){Date d1;Dated2(2026,1,31);return0;}通过调试可以发现不论是使用无参的构造函数还是使用带参的构造函数都能使两个日期类对象初始化为我们想要的值。三、析构函数1.概念与构造函数功能相反析构函数不是完成对对象本身的销毁局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数完成对象中资源的清理工作。2.特性析构函数名是在类名前加上字符 ~。无参数无返回值类型。一个类只能有一个析构函数。若未显式定义系统会自动生成默认的析构函数。析构函数不能重载。对象生命周期结束时C编译系统系统自动调用析构函数。3.基本代码classStack{public:Stack(){_a(int*)malloc(sizeof(int)*4);if(_anullptr){perror(malloc error);return;}_capacity4;_top0;}~Stack(){free(_a);_anullptr;_capacity_top0;}private:int*_a;int_capacity;int_top;};四、拷贝构造函数1.概念只有单个形参该形参是对本类类型对象的引用(一般常用const修饰)在用已存在的类类型对象创建新对象时由编译器自动调用。2.特性拷贝构造函数是构造函数的一个重载形式。拷贝构造函数的参数只有一个且必须是类类型对象的引用使用传值方式编译器直接报错因为会引发无穷递归调用。若未显式定义编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝这种拷贝叫做浅拷贝或者值拷贝。3.基本代码classDate{public:Date(intyear1,intmonth1,intday1){_yearyear;_monthmonth;_dayday;}Date(constDated){_yeard._year;_monthd._month;_dayd._day;}private:int_year;int_month;int_day;};intmain(){Date d1;Dated2(d1);//这里被编译器转化为Date(d2,d1),this指针接收d2的地址this指针指向d2return0;}4.拷贝构造函数典型调用场景使用已存在对象创建新对象函数参数类型为类类型对象函数返回值类型为类类型对象五、赋值运算符重载1.运算符重载1.1基本概念C为了增强代码的可读性引入了运算符重载运算符重载是具有特殊函数名的函数也具有其返回值类型函数名字以及参数列表其返回值类型与参数列表与普通的函数类似。函数名字为关键字operator后面接需要重载的运算符符号。函数原型返回值类型 operator操作符(参数列表)1.2注意要点不能通过连接其他符号来创建新的操作符比如operator重载操作符必须有一个类类型参数。用于内置类型的运算符其含义不能改变例如内置的整型不能改变其含义。作为类成员函数重载时其形参看起来比操作数数目少1因为成员函数的第一个参数为隐藏的this。.* :: sizeof ?: . 注意以上5个运算符不能重载。2.赋值运算符重载2.1赋值运算符重载格式参数类型const T传递引用可以提高传参效率。返回值类型T返回引用可以提高返回的效率有返回值目的是为了支持连续赋值。检测是否自己给自己赋值。返回*this 要复合连续赋值的含义。2.2注意要点赋值运算符只能重载成类的成员函数不能重载成全局函数。用户没有显式实现时编译器会生成一个默认赋值运算符重载以值的方式逐字节拷贝。如果类中未涉及到资源管理赋值运算符是否实现都可以一旦涉及到资源管理则必须要实现。3.前置和后置重载规定关于前置函数名使用operator进行运算符重载。后置函数名同样使用operator进行运算符重载为了和前置进行区分后置的参数列表额外加入int与前置构成函数重载。同理前置- -和后置- -重载也是相同的道理。返回值类型operator();返回值类型operator(int);返回值类型operator--();返回值类型operator--(int);(本篇完

相关新闻