C++:重载

2023-11-06

一、重载
重载:重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。

重载的作用:重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。

二、实例
1.构造函数CMatrix的初始化:
第一种初始化方式:在给变量分配空间时赋值,初始化效率较高
第二种初始化方式:在分配空间之后再给变量赋值
注:初始化的顺序必须和定义时变量的顺序一致

CMatrix::CMatrix():m_nRow(0),m_nCol(0),m_pData(NULL)
{

}

//第二种初始化方式:在分配空间之后再给变量赋值
//{
//	m_nRow = 0;
//	m_nCol = 0;
//	m_pData = NULL;
//}

2.CMatrix的一个重载函数:当m_pData的空间不能容纳n_Row*n_Col时 m_pData=NULL

CMatrix::CMatrix(int nRow,int nCol,double * pData)
{
    m_pData = NULL;
    Create(nRow,nCol,pData);
//	m_nRow = nRow;
//	m_nCol = nCol;
//	m_pData = new double[nRow*nCol];
//	if(m_pData != NULL)//当m_pData的空间不能容纳n_Row*n_Col时 m_pData=NULL
//	{
//		if(pData != NULL)
//		{
//			memcpy(m_pData,pData,sizeof(double)*nRow*nCol);
//		}
//
//	}
}

3.析构函数:析构函数与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。

CMatrix::~CMatrix()
{
//	if(m_pData != NULL)
//	{
//		delete []m_pData;
//		m_pData = NULL;//可省略
//	}
//	m_nRow = m_nCol = 0;//可省略
    //代码行60行和62行可省略,写上的好处是当后面想要再次delete时,由于m_pData = NULL导致delete失败
    Release();
}

4.运算符的重载:用friend给函数声明为全局函数,使该函数可以在全局范围内访问变量

friend istream & operator>>(istream& is,CMatrix& m);//friend使得该函数为全局函数,可以在全局范围内访问变量
friend ostream & operator<<(ostream& os,const CMatrix& m);
istream & operator>>(istream& is,CMatrix& m)
{
    is>>m.m_nRow>>m.m_nCol;
    m.Create(m.m_nRow,m.m_nCol);
    for(int i = 0; i < m.m_nRow*m.m_nCol; i++)
    {
        is>>m.m_pData[i];
    }
    return is;
}

ostream & operator<<(ostream& os,const CMatrix& m)
{
    os<<m.m_nRow<<" "<<m.m_nCol;
    double * pData = m.m_pData;
    for(int i = 0; i < m.m_nRow; i++)
    {
        for(int j = 0;j < m.m_nCol; j++)
        {
            os<<*pData++<<" ";
//			os<<m.m_pData[i*m.m_nCol+j]<<" ";
        }
        os<<endl;//"\n"
    }
    return os;
}

5.释放内存函数:当前空间可能不足以存储当前数据,所以需要先释放空间,再重新分配空间。

void CMatrix::Release()
{
    if(m_pData != NULL)
    {
        delete []m_pData;
        m_pData = NULL;
    }
    m_nRow = m_nCol = 0;
}

6.给函数重新分配空间

bool CMatrix::Create(int nRow,int nCol,double *pData)
{
    Release();//创建前可能有空间,所以先清除空间
    m_nRow = nRow;
    m_nCol = nCol;
    m_pData = new double[nRow*nCol];
    if(m_pData != NULL)
    {
        if(pData != NULL)
        {
            memcpy(m_pData,pData,sizeof(double)*nRow*nCol);
        }
        return true;
    }
    else
    {
        return false;	//内存申请失败
    }
}

7.重载函数:this指向该函数对象本身

CMatrix::CMatrix(const char * strPath)
{
    m_pData = NULL;
    ifstream cin(strPath);
    cin>>*this;//本身对象地址
}

8.拷贝:三种方法

//第一种方法
CMatrix::CMatrix(const CMatrix & m)
{
    m_nRow = m.m_nRow;
    m_nCol = m.m_nCol;
    m_pData = NULL;
    Create(m_nRow,m_nCol,m_pData);

}
//第二种方法
CMatrix::CMatrix(const CMatrix & m)//:CMatrix(m.m_nRow,m.m_nCol,m.m_pData)
{
    
}
第三种方法
CMatrix::CMatrix(const CMatrix & m)
{
	m_pData = NULL;
	*this = m;
}

9.内联函数:内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展)。

void Set(int nRow,int nCol,double dVal);
//		void Set(int nRow,int nCol,double dVal)
//		{
//			m_pData[nRow*m_nCol+nCol] = dVal;
//		}//隐含的内联函数:在头文件中直接实现函数调用
//		显式的内联函数写法:写在外部
    inline void CMatrix::Set(int nRow,int nCol,double dVal)
    {
        m_pData[nRow*m_nCol+nCol] = dVal;
    }

10.测试1
主函数:

int main(int argc, char *argv[])
{
    CMatrix m;
        double data[10] = {1,2,3,4,5,6};
        CMatrix m1(2,5,data);
        {
            CMatrix m2(2,5);//m2的生命周期在反大括号截止
            //当对象的生命周期结束,对象所在函数已调用完毕时,系统自动调用析构函数
        }

        CMatrix m3(m1);//拷贝m1到m3
        CMatrix ms[3] = {CMatrix(),CMatrix(2,5,data),"d://1.txt"};

        CMatrix m4;
        m4 = m1;//m1和m4输出相同,因为他们的地址空间是相同的
        m1.Set(0,1,20);//内联函数执行时不是采用函数调用方式,而是直接拷贝函数内的代码段使用,可提高效率
        //	当函数内代码超过十行以上或代码为循环、递归等不建议使用内联函数
        cout<<"m1=\n"<<m1;
        cout<<"m4=\n"<<m4;
        return 0;
}

测试结果:m4与m1的输出相同;
请添加图片描述

11.测试2
主函数:

int main(int argc, char *argv[])
{
    CMatrix m;
        double data[10] = {1,2,3,4,5,6};
        CMatrix m1(2,5,data);
        {
            CMatrix m2(2,5);//m2的生命周期在反大括号截止
            //当对象的生命周期结束,对象所在函数已调用完毕时,系统自动调用析构函数
        }

        CMatrix m3(m1);//拷贝m1到m3
        CMatrix ms[3] = {CMatrix(),CMatrix(2,5,data),"d://1.txt"};

        CMatrix m4;
        m4 = m1;//m1和m4输出相同,因为他们的地址空间是相同的
        m1.Set(0,1,20);//内联函数执行时不是采用函数调用方式,而是直接拷贝函数内的代码段使用,可提高效率
        //	当函数内代码超过十行以上或代码为循环、递归等不建议使用内联函数
        cout<<"m1=\n"<<m1;
        cout<<"m4=\n"<<m4;
		m4 = m4;
		cout<<"after= m4=\n"<<m4;
		//cout<<"m4[1]"<<m4[1];
		return 0;
}

测试结果:输出如图
请添加图片描述

12.操作运算符

CMatrix & CMatrix::operator=(const CMatrix& m)
{
    if(this==&m)
    {
        return *this;
    }
    Create(m.m_nRow,m.m_nCol,m_pData);
    return *this;
}

CMatrix & CMatrix::operator+=(const CMatrix& m)
{
    return *this;
}

CMatrix operator+(const CMatrix& m1,const CMatrix & m2)
{
    CMatrix m(m1);//拷贝构造函数
    m+=m2;
    return m;
}

13.强制类型转换

CMatrix::operator double()
{
    double dSum = 0;
    for(int i = 0; i < m_nRow*m_nCol; i++)
    {
        dSum += m_pData[i];
    }
    return dSum;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:重载 的相关文章

随机推荐

  • SpringBoot 2.2.5 使用@ID 避坑指南

    1 如果你的数据库中没有主键 在你指定 ID的时候这个指必须是唯一的而且不能为null 如果不唯一 你数据库有6个数据 选为主键的字段 distinc一下有2个 那么就会3 3的重复 如果为null 则映射出来的bean中有null
  • FastDFS-02-JavaAPI

    我是码赛客1024 本节我们来使用java调用FastDFS进行文件上传等操作 一 介绍 在上一章节 咱们搭建好了fastdfs服务器 并实现了基于命令的上传测试和web访问 本节 咱们使用Java来调用API实现上传文件到FastDFS
  • linux命令&和&&,

    在linux中 和 和 介绍如下 表示任务在后台执行 如要在后台运行redis server 则有 redis server 表示前一条命令执行成功时 才执行后一条命令 如 echo 1 echo 2 表示管道 上一条命令的输出 作为下一条
  • 全网唯一最全彻底删除VS及VS注册表!

    当我们不再需要vs或者vs ide出现问题 并且你的专业课老师不教的情况下 怎么样独自且快速的情况下卸载干净 需要重装时 发现总是卸载不干净 卸载重装后该存在的问题还是存在 没有因重装而解决 那么如何彻底的卸载vs不留残留 设备 HPZHA
  • android集成flutter No implementation found for method getDatabasesPath on channel com.tekartik.sqflite

    项目场景 原有android项目集成flutter 环境 flutter sdk 1 17 4 android studio 3 6 3 android sdk 29 问题描述 运行报错 Unhandled Exception Missin
  • 模板和容器

    1 什么是模板 模板定义 模板就是实现代码重用机制的一种工具 它可以实现类型参数化 即把类型定义为参数 从而实现了真正的代码可重用性 我们知道 C 是一种 强类型 的语言 也就是说一个变量 编译器必须确切的知道它的类型 而模板就是构建在这个
  • 爬虫实战学习----基础

    今天在学习爬虫入门的过程中 遇到了百度的反爬 发送请求无法得到内容 出现 网络不给力 稍后重试 或者 百度安全验证 写一下当时的解决方案 最基础的导入 发送请求和打印数据如下 导入模块 import requests 发送get请求 res
  • tf好朋友之matplotlib的使用——连续图像部分plt.plot

    tf好朋友之matplotlib的使用 连续图像部分plt plot 连续图像常用函数及其作用 plt plot plt figure plot 应用示例 学了这么多机器学习 好像还不知道这么去展示我的学习成果 一想到matlab里面有这么
  • 树莓派上手第一课:系统烧录,树莓派的配置,获取ip,ssh,远程桌面...

    最近树莓派涨价挺高的 卖了我的3b 小赚了几百块钱 借了朋友的3b来写篇关于树莓派的入门博客吧 主要包括系统烧录 树莓派的配置 ssh 远程桌面 系统烧录 准备一个树莓派 8g及8g以上的tf卡 键盘 鼠标 HDMI输出的显示屏 去官网下载
  • 大数据、云计算、区块链、人工智能!你选择哪个?

    日前 在以 突破 为主题的t112018暨talkingdata数值智能峰会上 数千名相干行业从业者研讨以数值驱动冲破发展的新模式 新路径 目前计算机相干领域的就业情况还是比较不错的 随着大数据 物联网 区块链 人工智能等技术的快速进展 这
  • 基于单片机智能温室大棚控制系统

    功能介绍 以51单片机作为主控系统 DS18B20温度采集模块检测温度 光敏电阻和ADC0832组成的光照检测模块 土壤湿度检测模块检测土壤湿度 CO2检测模块检测CO2浓度 LCD1602显示模块显示测量值 若温度小于温度最小值 声光报警
  • Operator方式下的Prometheus监控二进制方式部署的kubernetes组件

    Operator方式下的Prometheus默认监控的是以静态pod形式部署的kubernetes组件 kubectl kube controller manager kube scheduler 如果需要监控以rpm包或者二进制包方式部署
  • 关于router-link和router-view

    router link和router view在同一个vue文件 A vue 里面 router link设置路由跳转 router view根据路由显示组件 在同一个页面中 A vue组件是全局的页面 B vue组件和C vue组件是A页
  • 最强的表格组件—AG Grid使用以及License Key Crack

    PS 想要官方 License Key翻到最后面 Ag Grid简介 Ag Grid 是一个高级数据网格 适用于JavaScript TypeScript应用程序 可以使用React Angular和Vue等流行框架进行集成 它是一种功能强
  • 系统地址和服务器地址不一致,服务器和ip地址不一致t3

    服务器和ip地址不一致t3 内容精选 换一换 输入AK SK后 已经确认AK SK内容准确 但仍然认证失败 界面报错关键信息如下 查看 root MindStudioMS 2 3 system log idea log 有如下日志报错 从日
  • 有符号数的四舍五入(round)(verilog实现)

    有符号数的表达方式见上篇 有符号小数的表示 扩展和计算 weixin 42330305的博客 CSDN博客 对于有符号数 正数和负数的四舍五入有些许不同 需要区别对待 一 正数 对于正数来说 如果被截掉的数的最高位为1 则结果为保留的数 1
  • 【分析方法】A/B test

    A B测试是什么 怎么做 有什么作用呢 本篇文章为大家分享了几种应用场景及案例 告诉大家如何在团队中有效推进A B测试 一 A B测试 为了检测某些用户到底属于哪一类别 我们定制了A类用户喜欢的产品和B类用户喜欢的产品 统计并对比了不同方案
  • 给jupyter添加多个python版本的kernel

    两种方法 1 想添加的python版本已存在 1 通过ipykernel为jupyter添加python环境 activate env name python m ipykernel install name env name 2 关闭py
  • Windows安装Anaconda,创建pytorch环境,pycharm配置环境

    目录 1 简介 2 安装Anaconda 3 创建一个独立的环境 4 安装依赖的库 5 安装pytorch 6 pycharm中使用conda环境 7 到这里安装就结束了 希望对您有所帮助 如有什么错误请指正 1 简介 安装Anaconda
  • C++:重载

    一 重载 重载 重载函数是函数的一种特殊情况 为方便使用 C 允许在同一范围中声明几个功能类似的同名函数 但是这些同名函数的形式参数 指参数的个数 类型或者顺序 必须不同 也就是说用同一个函数完成不同的功能 重载函数常用来实现功能类似而所处