iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言运算符的重载实例分析
  • 645
分享到

C语言运算符的重载实例分析

2023-06-26 07:06:19 645人浏览 薄情痞子
摘要

本篇内容介绍了“C语言运算符的重载实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写一个Add函数我们先讨论下面代码,并复习前面的内容

本篇内容介绍了“C语言运算符的重载实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

写一个Add函数

我们先讨论下面代码,并复习前面的内容

class Complex{private:double Real, Image;public:Complex() :Real(0), Image(0) {}Complex(double r, double i) :Real(r), Image(i) {}~Complex() {}//Complex Add(const Complex* const this,const Complex &c)Complex Add(const Complex& x)const{Complex y;y.Real = Real + x.Real;y.Image = Image + x.Image;return y;//return Complex(this->Real + x.Real, this->Image + x.Image);}void Print(){cout << Real << "+" << Image << "i" << endl;}};int main(){Complex c1(12, 23);Complex c2(4.5, 5.6);Complex c3;c3 = c1.Add(c2);c3.Print();return 0;}

C语言运算符的重载实例分析

直接return可以使用无名函数直接代替将亡值对象,相比可以省一次对象的构建

我们再分析如果我们使用引用返回Add函数

const Complex& Add(const Complex& x)const{Complex y;y.Real = Real + x.Real;y.Image = Image + x.Image;return y;//return Complex(this->Real + x.Real, this->Image + x.Image);}

C语言运算符的重载实例分析

若我们以引用返回,将亡值对象会创建在Add函数的栈帧中,然后返回将亡值地址,函数return结束该空间会被释放、

若没有引用,构建无名对象也就是将亡值对象会构建在主函数的空间中,这里使用将亡值对象值给到c3是没有问题的

我们查看对象的构造与析构

class Complex{private:double Real, Image;public:Complex() :Real(0), Image(0) {}Complex(double r, double i) :Real(r), Image(i) { cout << "Create:" << this << endl; }Complex(const Complex& x):Real(x.Real),Image(x.Image){cout << "Copy Create:" << this << endl;}~Complex(){cout << "~Complex:" << this << endl;}//Complex Add(const Complex* const this,const Complex &c)Complex Add(const Complex& x)const{return Complex(this->Real + x.Real, this->Image + x.Image);}void Print(){cout << Real << "+" << Image << "i" << endl;}};int main(){Complex c1(12, 23);Complex c2(4.5, 5.6);Complex c3;c3 = c1.Add(c2);c3.Print();return 0;}

C语言运算符的重载实例分析

首先我们使用引用返回需要加上const修饰,这是因为我们返回将亡值在临时空间具有常性,所以普通引用是不能进行返回的,需要使用常引用返回

const Complex& Add(const Complex& x)const{return Complex(this->Real + x.Real, this->Image + x.Image);}

我们发现对临时对象的构建后马上就进行析构,那么是怎么将数据拿出给到c3的?这个在最后我们进行分析

为什么不用加号作为函数名

//Complex operator+(const Complex* const this,const Complex &c)Complex operator+(const Complex &c) const{return Complex(this->Real + x.Real, this->Image + x.Image);}

这里是不可以的,加号是一个操作符,不能使用操作放作为有效的函数名称;但是在c++中为了使这些操作符号能够当作函数名,那么我们需要在前面加上一个关键字operator

//Complex operator+(const Complex* const this,const Complex &c)Complex operator+(const Complex &c) const{return Complex(this->Real + x.Real, this->Image + x.Image);}
也就是告诉编译器,加号是一个有效的函数名,这就叫做运算符的重载;随后我们之间使用 c3 = c1 + c2 就是可以的
int main(){Complex c1(12, 23);Complex c2(4.5, 5.6);Complex c3;c3 = c1 + c2;//编译器编译会是下面的情况//c3 = c1.operator+(c2);//c3 = operator+(&c1,c2); 加上this指针}

运算符的重载

一个对象,编译器会给它有6个缺省函数

C语言运算符的重载实例分析

我们再来看下面这个问题

//我们写一个赋值运算符重载void operator=(const Object& obj){this->value = obj.value;}//返回类型为void,这样不可以就不可以连等//obja = objb = objc;//obja = objb.operator=(objc);//obja = operator=(&objb,objc); 返回的无类型,不能给obja赋值

且赋值函数不可以定义为const修饰

Object& operator=(const Object& obj){this->value = obj.value;return *this;}
obja = objb = objc;//改写obja = objb.operator=(objc);obja = operator=(&objb,objc);obja.operator=(operator=(&objb,objc));operator=(&obja,operator=(&objb,objc));

通过返回对象,就可以实现连等;并且我们可以通过引用返回,因为此对象的生存期并不受函数的影响,不会产生一个临时对象作为一个过度

防止自赋值
若是我们将obja给obja赋值,也就是自赋值

obja = objaoperator=(&obja,obja);

我们就需要进行一步判断

Object& operator=(const Object& obj){if(this != &obj)//防止自赋值{this->value = obj.value;}return *this;}

上面问题解决

我们通过这段代码来看,与上面问题相同

Object& operator=(const Object& obj){if (this != &obj){this->value = obj.value;}return *this;}};Object& fun(const Object& obj){int val = obj.Value() + 10;Object obja(val);return obja;}int main(){Object objx(0);Object objy(0);objy = fun(objx);cout << objy.Value() << endl;return 0;}

我们在这里希望通过引用返回,这里return的临时对象会构建在fun函数的栈帧中,并且在函数结束栈帧释放,随后调用赋值运算符重载,但是数值依旧是正确的

C语言运算符的重载实例分析

我们跟踪这个被析构对象的地址,首先我们定位在fun函数的return obja;,随后进入析构函数将我们的obja进行析构

C语言运算符的重载实例分析

接着运行到回到主函数进行赋值,接着进入赋值运算符重载,可以看到,这里的obj地址与已被析构的obja地址相同

C语言运算符的重载实例分析

C语言运算符的重载实例分析

可以看到这个值依旧存在,依旧可以打印给出,这是因为vs2019的特殊性质造成的;我们每次运行程序会发现每次的对象地址都在变化,逻辑地址会随机改变,被析构对象的栈帧不会被接下来的赋值运算符重载扰乱地址空间,所以即使我们引用返回的对象已经死亡依旧可以将数值正确返回

但是在vc中,我们得到的值会是随机值,这是因为vc中每次运行程序地址都不会改变,当我们从fun函数退出进入赋值语句中,就会将原本存储数据的地址扰乱,继而变成了随机值

尽管我们引用返回能够将数据正确打印,但是该对象已经死亡,这是不安全的,所以我们一定不要以引用返回对象

C语言运算符的重载实例分析

VS2019具有一个特点:当我们调用函数,若函数中没有定义局部变量或局部对象时,该函数基本不对栈帧进行清扫

“C语言运算符的重载实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C语言运算符的重载实例分析

本文链接: https://www.lsjlt.com/news/307392.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言运算符的重载实例分析
    本篇内容介绍了“C语言运算符的重载实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写一个Add函数我们先讨论下面代码,并复习前面的内容...
    99+
    2023-06-26
  • C++重载运算符是实例分析
    本篇内容介绍了“C++重载运算符是实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!运算符实际上是一个函数,所以运算符的重载实际上是函数...
    99+
    2023-06-29
  • Python运算符重载实例分析
    这篇文章主要讲解了“Python运算符重载实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python运算符重载实例分析”吧!一、运算符重载(一)概述运算符重载是通过实现特定的方法使类...
    99+
    2023-06-29
  • C语言运算符的重载详解
    目录运算符重载的规则 1. 运算符重载为成员函数2. 运算符重载为非成员函数        ...
    99+
    2022-11-13
  • c语言重载运算符怎么实现
    C语言不支持重载运算符,只能通过函数来实现类似的功能。例如,可以通过定义一个函数来代替重载的加法运算符: #include ty...
    99+
    2023-10-25
    c语言
  • C语言运算符与表达式实例分析
    本篇内容主要讲解“C语言运算符与表达式实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言运算符与表达式实例分析”吧!表达式函 数 概 述表达式是C语言的主体。在C语言中,表达式由操作符...
    99+
    2023-07-02
  • c语言中移位运算符的示例分析
    这篇文章主要介绍c语言中移位运算符的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、处理低级存储...
    99+
    2023-06-15
  • C语言指针运算实例分析
    这篇文章主要介绍“C语言指针运算实例分析”,在日常操作中,相信很多人在C语言指针运算实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言指针运算实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-30
  • C#运算符重载的实例介绍
    本篇内容介绍了“C#运算符重载的实例介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#运算符重载实例是掌握C#运算符重载的有效方法,那么...
    99+
    2023-06-18
  • C#算术运算符使用实例分析
    这篇文章主要介绍了 C#算术运算符使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇 C#算术运算符使用实例分析文章都会有所收获,下面我们一起来看看吧。实例using System;names...
    99+
    2023-06-17
  • C++实现重载矩阵的部分运算符
    目录前言正文运行结果前言 博主本人为C++菜鸟一只,本篇博客也是第一次写,主要目的用于自己mark,如有错误欢迎指出 本博客代码为我做C++实验时的代码,由于自己是菜鸟,所以代码内容...
    99+
    2022-11-13
    C++ 重载矩阵运算符 C++ 重载运算符 C++ 矩阵运算符
  • Go语言中如何实现运算符重载?
    如何在Go语言中实现运算符重载?Go语言是一种现代化的编程语言,因其简洁的语法和高效的性能而备受开发者青睐。然而,Go语言并没有提供像C++或Python等语言中的运算符重载功能。运算符重载是指在不同数据类型之间重定义或扩展运算符的行为,使...
    99+
    2023-12-23
    Go语言 实现 运算符重载
  • Swift 重构重载运算符示例解析
    目录一、思路来源二、基础类型 String 为例重载乘法运算符源码实现:三、对象类型 UIEdgeInsets 为例重载加法运算符将源码实现:四、总结一、思路来源 研究自定义运算符...
    99+
    2023-03-13
    Swift 重构重载运算符 Swift  重构重载
  • C语言字符串实例分析
    本篇内容主要讲解“C语言字符串实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言字符串实例分析”吧!看下面这个我们熟知的也是最先学习的代码"Hello world!"...
    99+
    2023-06-29
  • C#的运算符优先级实例分析
    这篇文章主要介绍了C#的运算符优先级实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#的运算符优先级实例分析文章都会有所收获,下面我们一起来看看吧。实例using System;namespa...
    99+
    2023-06-17
  • Go语言实现运算符重载的方法详解
    目录前言使用实现总结前言 先带来日常的 GScript 更新:新增了可变参数的特性,语法如下: int add(string s, int ...num){ p...
    99+
    2022-11-11
  • Go语言中的运算符重载技巧与实践
    Go语言中的运算符重载技巧与实践引言:运算符重载(operator overloading)是指在编程语言中,通过改变运算符的行为,使其能够操作不同类型的数据。虽然Go语言没有内置的运算符重载功能,但是我们可以通过一些技巧来实现类似的效果。...
    99+
    2023-12-23
    技巧 Go语言 运算符重载
  • C#怎么实现运算符重载
    本篇内容介绍了“C#怎么实现运算符重载”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!运算符重载的实现下面的程序演示了完整的实现:using&...
    99+
    2023-06-17
  • C++11运算符重载和向量类重载实例详解(<<,>>,+,-,*等)
    目录1. C++运算符重载介绍1.1 单目运算符与双目运算符1.2 友元运算符2. 实例讲解2.1 头文件定义2.2 实现运算符重载总结1. C++运算符重载介绍 C ++ 中预定义...
    99+
    2022-11-12
  • C++重载运算符实现分数加减乘除
    本文实例为大家分享了C++重载运算符实现分数加减乘除的具体代码,供大家参考,具体内容如下 实现结果如下图所示: 代码如下所示: #include <iostream>...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作