类的6个默认成员函数

文章目录

  • 类的6个默认成员函数
    • 一、构造函数
    • 二、析构函数
    • 三、拷贝构造函数
    • 四、运算符重载
    • 五、取地址操作符重载和const修饰的去地址操作符重载

一、构造函数

  • 构造函数:是一个特殊的成员函数,名字与类名相同,创建对象时由编译器自动调用,保证每个成员函数都有一个初值,
  • 注意,构造函数只是给类成员赋了一个初值,并不能称为给类成员进行初始化,因为初始化只能有一次,而构造函数可以进行多次赋值,并且在对象生命周期内只调用一次,没有返回值。
  • 初始化列表:是初始化类中每个变量,如果类成员包含引用类型成员变量、const成员变量、类类型成员变量(改类没有默认构造函数)则这些成员变量必须放在初始化列表位置进行初始化,另外,每个成员变量只能在初始化列表出现一次

注意:

  • 函数名必须和类名相同;
  • 无返回值
  • 构造函数可以重载;
  • 构造函数的作用是初始化对象,并不是开空间创建对象
  • 如果类中没有显式定义构造函数,编译器会自动生成一个默认无参数的构造函数,一旦用户显式定义,编译器就不再生成
  • 无参数的构造函数和全缺省的构造函数都称为默认的构造函数,并且默认的构造函数只能有一个,(我们没有显式定义构造函数,编译器默认生成的构造函数,都可以认为是默认成员函数)

二、析构函数

  • 析构函数:与构造函数功能相反,注意析构函数不是完成对象的销毁,局部对象的销毁是由编译器完成的,而对象在销毁前,会自动调用析构函数,完成一些对象的资源清理工作

注意:

  • 构造函数名是在类名前加~符号
  • 无参数无返回值,就没有函数重载;
  • 一个类有且只有一个析构函数,若未显式定义,编译器会默认生成一个;
  • 在对象生命周期结束时,编译器系统自动调用析构函数

三、拷贝构造函数

  • 拷贝构造函数:用已存在类类型对象创建新对象时由编译器自动调用,只有单个类类型引的型参,且一般用const修饰。(注意深浅拷贝问题,会在后面解决)

注意:

  • 拷贝构造函数是构造函数的重载形式
  • 参数必须使用引用传参,使用按值传参,会引发无穷递归调用进行创建临时对象
  • 最最重要的是:如果未显示定义拷贝构造函数,系统会默认生成按值传参的拷贝构造函数,即浅拷贝或值拷贝

四、运算符重载

  • 运算符重载:是为了加强代码的可读性而引入的,运算符重载是具有特殊函数名的函数,有参数有返回值;
  • 对于赋值运算符重载问题:一个类中一旦涉及资源管理问题,用户必须显式定义赋值运算符重载(注意深浅拷贝问题)。函数原型为:返回值类型 operator 要重载的操作符 (参数)

注意:

  • 不能通过链接其他符号来创建新的操作符,如operator@;
  • 重载操作符必须有一个类类型的或枚举类型的操作数;
  • 并且不能随意更改内置类型的操作符的含义
  • 作为类成员的重载函数时,形参看起来比操作数数目少一个,其实是有一个默认的形参this作为第一个参数
  • 最最最最最重要的是".*"、"sizeof"、"?:"、"."、"::"五个运算符不能重载
  • 还有注意前置++(不带参数)、后置++(带一个参数)和=运算符的重载

五、取地址操作符重载和const修饰的去地址操作符重载

  • 取地址操作符重载和const修饰的取地址操作符重载:一般不用重新定义,编译器会默认生成

简单归纳:

函数 返回值 参数 作用
构造函数 无返回值 有参和无参两种 初始化对象
析构函数 无返回值 无参数 对象生命周期结束时,在对象删除前做清理工作
拷贝构造函数 无返回值 引用类型的参数 用已存在的对象创建新的对像
运算符重载 不定 至少有一个 方便C++中的操作

还有两个默认成员函数一般不用重新定义(取地址操作符重载和const修饰的去地址操作符重载)

注意:

  • 1:const对象可以调用其他的const成员函数,而不能调用非const成员函数。
  • 2.非const对象既可以调用const成员函数也可以调用非const成员函数。
  • 3.const成员函数可以调用其他的const成员函数,而不能调用非const成员函数
  • 4.非const成员函数既可以调用其他的const成员函数,也可以调用非const成员函数。
#include<iostream>
#include<windows.h>
using namespace std;class Date
{public:Date(){_year = 1998;_month = 7;_day = 22;}Date(int year, int month, int day){_year = year;_month = month;_day = day;}~Date(){_year = 1998;_month = 7;_day = 22;}Date(Date& ra){_year = ra._year;_month = ra._month;_day = ra._day;}Date& operator=(Date& ra){_year = ra._year;_month = ra._month;_day = ra._day;return *this;}Date& operator+(int day){_day += day;return *this;}Date& operator-(int day){_day -= day;return *this;}Date& operator++(){_day += 1;return *this;}Date operator++(int)//后置++因为要返回没有加1之前的,所以创建类类型变量(不能是类类型的引用)存储起来,方便返回,注意和前置++返回值及参数的区别{Date temp = *this;_day += 1;return temp;}Date& operator--(){_day -= 1;return *this;}Date operator--(int){Date temp = *this;_day -= 1;return temp;}bool operator>(const Date& ra)const{if (_year > ra._year){return true;}else if(_year==ra._year &&_month>ra._month ){return true;}else if (_year == ra._year &&_month == ra._month&&_day > ra._day){return true;}else{return false;}}bool operator==(const Date& ra)const{if (_year == ra._year &&_month == ra._month&&_day == ra._day){return true;}else{return false;}}bool operator>=(const Date& ra)const{if (this->operator>(ra) || this->operator==(ra)){return true;}else{return false;}}bool operator < (const Date& ra)const{if (this->operator>(ra)){return false;}else{return true;}}bool operator<=(const Date& ra)const{if (this->operator<(ra) || this->operator==(ra)){return true;}else{return false;}}bool operator!=(const Date& ra)const{if (this->operator==(ra)){return false;}else{return true;}}void Show(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{Date a(2019, 10, 20);a.Show();Date b(a);b.Show();Date c(2019, 10, 22);c.Show();//cout << a>b << endl;//cout << a.==b << endl;//cout << a>=c << endl;cout << a!=b << endl;cout << a<=b<< endl;cout << a!=c << endl;cout << a<=c << endl;system("pause");return 0;
}

C++中类的6个默认成员函数相关推荐

  1. 《C++类基本知识和6个默认成员函数详细剖析》

    面向对象编程–类的认识 之前我们学习了C语言知识,C语言是一种面向过程的程序设计语言,而C++语言呢是基于面向对象的一种程序设计语言,关注的是对象,即将一件事情拆分成不同的对象,靠对象间的交互完成.接 ...

  2. 【C++学习】类和对象(中)一招带你彻底了解六大默认成员函数

    前言:在之前,我们对类和对象的上篇进行了讲解,今天我们我将给大家带来的是类和对象中篇的学习,继续深入探讨[C++]中类和对象的相关知识!!! 目录 1. 类的6个默认成员函数 2. 构造函数 2.1概 ...

  3. 继承和多态 2.0 -- 继承的六个默认成员函数

    本文重要介绍普通继承中如何写派生类的六个默认成员函数,主要是针对在派生类中,如何调用基类的六个默认成员函数 需要说明的一点就是,如果子类中没有调用父类的函数时,系统会自动生成一个. 构造函数 子类中有 ...

  4. c 类别构造函数需要包含所有成员吗_C++默认成员函数解析

    1.什么是面向对象? 概念:(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法. 对象指的是类的实例,将对象作为程序的基本单元,将程 ...

  5. 类的6个默认成员函数:构造函数、析构函数、拷贝构造函数、重载运算符、三/五法则

    文章目录 6个默认成员函数 构造函数 概念 默认构造函数的类型 默认实参 概念 默认实参的使用 默认实参声明 全局变量作为默认实参 某些类不能依赖于编译器合成的默认构造函数 第一个原因 第二个原因 第 ...

  6. 3-3:类与对象中篇——默认成员函数之构造函数和析构函数

    文章目录 一:类的默认6个成员函数 二:构造函数 (1)构造函数的概念 (2)构造函数注意事项 三:析构函数 (1)析构函数的概念 (2)析构函数注意事项 一:类的默认6个成员函数 如果一个类里面什么 ...

  7. 3-9:C++默认成员函数练习-日期类实现

    文章目录 一:前言 二:准备 (1)实现文件 (2)基本布局 三:具体实现 (1)默认成员函数实现 A:全缺省构造函数 B:拷贝构造 C:析构函数 (2)赋值运算符重载 A:日期+=天数 B:日期+天 ...

  8. 一文带你入门C++,类与对象、6个默认成员函数、this指针以及static关键字。

    C++98关键字:63个 一.命名空间规则(namespace) 1.命名空间可以解决函数.全局变量名重复的问题,包在不同的命名空间里的重复函数,实际就是两个完全无关的函数. 2.命名空间允许续嵌套: ...

  9. 【C++】默认成员函数

    前言 一.什么是默认成员函数 二.构造函数 三.析构函数 四.拷贝构造 五.赋值运算符重载 六.const成员 七.&运算符重载(了解) 总结: 前言 这一节主要讲四个默认成员函数.运算符重载 ...

最新文章

  1. hdu 2602 Bone Collector
  2. 巴西队被打成了蜂窝煤
  3. 如何从ERP将Material的Batch信息下载到CRM
  4. NodeJS入门04-Express路由和中间件 - 小之 - 博客园
  5. 消息推送生命周期_一套完整的APP推送体系方案|附思维导图
  6. 【BZOJ3152】组合子逻辑,贪心+堆
  7. VS2017环境下动态链接库编写及调用
  8. esp8266 at接收数据中断时间_利用ESP8266获取网络同步时间(北京时间)
  9. 功不唐捐,每日一道LeetCode,玉汝于成,终获offer满满!
  10. ==与===的区别 与类型转换
  11. 解读SOA平台---概念分析
  12. 席位、交易单元、交易网关是什么
  13. NVIDIA显卡驱动程序更新失败解决记录
  14. mysql 二级什么意思_二级数据库是什么意思
  15. 使用主题背景编辑器设计应用主题背景
  16. 如何在大学里成为IT技术大神?
  17. Android 系统生成 releasekey
  18. python数据分析优势-用Python做数据分析有哪些优势?
  19. 如何把js里var值赋值到input里去
  20. Gem5的FS(全系统)模拟

热门文章

  1. 在 JavaFX 中,如何计算文本所占像素的宽度
  2. 基于matlab 读取文件夹 保存文件夹
  3. egg(87)--egg之redis的安装使用
  4. JS map和set
  5. GraphQL入门2
  6. 安装jrebel热部署插件,并激活
  7. linux ifconfig route ip 网络相关命令
  8. 跟着《架构探险》学轻量级微服务架构 (一)
  9. 【208天】黑马程序员27天视频学习笔记【Day21-中】
  10. ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)G GCD Guessing Game