前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从零开始学C++之运算符重载(二):++运算符重载、!运算符重载、赋值运算符重载

从零开始学C++之运算符重载(二):++运算符重载、!运算符重载、赋值运算符重载

作者头像
s1mba
发布于 2017-12-28 09:05:13
发布于 2017-12-28 09:05:13
1.2K00
代码可运行
举报
文章被收录于专栏:开发与安全开发与安全
运行总次数:0
代码可运行

一、++运算符重载

前置++运算符重载

成员函数的方式重载,原型为: 函数类型 & operator++();

友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &);

后置++运算符重载

成员函数的方式重载,原型为: 函数类型  operator++(int);

友元函数的方式重载,原型为: friend 函数类型  operator++(类类型 &, int);

代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
#ifndef _INTEGER_H_
#define _INTEGER_H_

class Integer
{
public:
    Integer(int n);
    ~Integer();

    Integer &operator++();
    //friend Integer& operator++(Integer& i);

    Integer operator++(int n);
    //friend Integer operator++(Integer& i, int n);

    void Display() const;
private:
    int n_;
};

#endif // _INTEGER_H_
代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
#include "Integer.h"
#include <iostream>
using namespace std;

Integer::Integer(int n) : n_(n)
{
}

Integer::~Integer()
{
}

Integer &Integer::operator ++()
{
    //cout<<"Integer& Integer::operator ++()"<<endl;
    ++n_;
    return *this;
}

//Integer& operator++(Integer& i)
//{
//  //cout<<"Integer& operator++(Integer& i)"<<endl;
//  ++i.n_;
//  return i;
//}

Integer Integer::operator++(int n)
{
    //cout<<"Integer& Integer::operator ++()"<<endl;
    //n_++;
    Integer tmp(n_);
    n_++;
    return tmp;
}

//Integer operator++(Integer& i, int n)
//{
//  Integer tmp(i.n_);
//  i.n_++;
//  return tmp;
//}

void Integer::Display() const
{
    cout << n_ << endl;
}
代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
#include "Integer.h"
#include <iostream>
using namespace std;


int main(void)
{
    Integer n(100);
    n.Display();

    Integer n2 = ++n;
    n.Display();
    n2.Display();

    Integer n3 = n++;
    n.Display();
    n3.Display();


    return 0;
}

需要注意的是为了区别于前置++,后置++多了一个int 参数,但实际上是没作用的,设置断点调试的时候可以发现默认赋值为0。

而且此时成员函数不能与友元函数共存,因为调用++运算符时不明确。

二、赋值运算符重载、!运算符重载

代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
#ifndef _STRING_H_
#define _STRING_H_

class String
{
public:
    explicit String(const char *str = "");
    String(const String &other);
    String &operator=(const String &other);
    String &operator=(const char *str);

    bool operator!() const;
    ~String(void);

    void Display() const;

private:
    char *AllocAndCpy(const char *str);
    char *str_;
};

#endif // _STRING_H_
代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
#pragma warning(disable:4996)
#include "String.h"
#include <string.h>
#include <iostream>
using namespace std;

String::String(const char *str)
{
    str_ = AllocAndCpy(str);
}

String::String(const String &other)
{
    str_ = AllocAndCpy(other.str_);
}

String &String::operator=(const String &other)
{
    if (this == &other)
        return *this;

    delete[] str_;
    str_ = AllocAndCpy(other.str_);
    return *this;
}

String &String::operator=(const char *str)
{
    delete[] str_;
    str_ = AllocAndCpy(str);
    return *this;
}

bool String::operator!() const
{
    return strlen(str_) != 0;
}

String::~String()
{
    delete[] str_;
}

char *String::AllocAndCpy(const char *str)
{
    int len = strlen(str) + 1;
    char *newstr = new char[len];
    memset(newstr, 0, len);
    strcpy(newstr, str);

    return newstr;
}

void String::Display() const
{
    cout << str_ << endl;
}
代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
#include "String.h"
#include <iostream>
using namespace std;


int main(void)
{
    String s1("abc");
    String s2(s1);

    String s3;
    s3 = s1;
    s3.Display();

    s3 = "xxxx";
    s3.Display();

    String s4;
    bool notempty;
    notempty = !s4;
    cout << notempty << endl;

    s4 = "aaaa";
    notempty = !s4;
    cout << notempty << endl;

    return 0;
}

需要注意的是我们将构造函数声明为explicit,故s3 = "xxxx"; 不能将"xxxx" 先隐式转换成临时String再调用 String &operator=(const String &other);,

可以再重载一个 String& operator=(const char* str); 函数。!运算符这里指当字符串不为空时为真。

参考:

C++ primer 第四版 Effective C++ 3rd C++编程规范

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-07-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++之运算符重载(三)
https://blog.csdn.net/zy010101/article/details/105245007
zy010101
2020/04/08
3490
C++之运算符重载(三)
从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载
该文介绍了如何在C++中实现字符串的基本操作和内存管理,包括字符串的赋值、字符串的拼接、字符串的复制等操作。同时介绍了如何实现字符串的运算符重载,以及如何使用string类实现基本的字符串操作。
s1mba
2017/12/28
1K0
从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载
【C++指南】运算符重载详解
运算符重载是指为类(或结构体)的特定运算符提供自定义实现,使其能够作用于类的对象。重载的运算符可以保持其原有的语义,也可以定义新的语义。
倔强的石头
2024/12/06
3150
运算符重载(看完这篇彻底掌握重载问题)
运算符重载:用同一个运算符完成不同的运算功能。 C++运算符重载的相关规定如下:
海盗船长
2020/08/27
9.8K1
从零开始学C++之运算符重载(四):类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete
该文摘要总结
s1mba
2017/12/28
6960
从零开始学C++之运算符重载(四):类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete
【C++】类和对象之赋值运算符重载
在前面的博客中提到了拷贝构造: 【C++】类和对象之拷贝构造函数篇,和 运算符重载【C++】类和对象之常引用与运算符重载,接下来继续来看赋值运算符重载中的赋值运算符重载。
zxctscl
2024/02/29
1590
【C++】类和对象之赋值运算符重载
C++面向对象学习之运算符重载(1)
运算符重载(函数重载)是C++多态的重要实现手段之一。通过运算符重载对运算符功能进行特殊定制,使其支持特定类型对象的运算,执行特定的功能,增强C++的扩展功能。
glm233
2020/09/28
8790
C++(运算符重载+赋值拷贝函数+日期类的书写)
由于赋值操作我们改变的是调用这个函数的对象,所以我们在参数中可以加上cosnt修饰,传值和传引用,我们选择传引用,最后返回也返回引用,这样可以避免调用拷贝构造函数
用户11305458
2024/10/09
1070
C++(运算符重载+赋值拷贝函数+日期类的书写)
C/C++ 关于运算符重载笔记
加号运算符重载: 重载加号运算符,让 p3 = p1 + p2 改成 p3.mage = p1.mage + p2.mage 实现两个数据成员的相加。
王瑞MVP
2022/12/28
2030
C++运算符重载的形式
重载单目运算符“++”,如果重载的是前置运算符“++”,则++a1的调用相当于调用函数a1.operator++()。如果重载的是后置运算符“++”,则运算符重载函数需要带一个整型参数,即“operator++(int)”,参数int仅仅表示后置运算,用于和前置运算区分,并无其他意义。为了加深读者的理解,下面通过案例演示前置运算符“++”与后置运算符“++”的重载,如例所示。
BrianLee
2023/04/04
8390
C++运算符重载的形式
C++运算符重载(三)之递增运算符重载
先++,后输出是指先运行成员函数前置递增运算符重载,再运行函数左移运算符重载。所以先++完成后再传入左移运算符重载函数中,要么是引用传递,要么是拷贝传递,上图使用的是拷贝传递,都可。
CtrlX
2022/09/21
7470
C++第五弹 -- 类与对象中篇下(赋值运算符重载函数 const成员函数 取地址操作符重载函数)
本文将深入探讨C++中的运算符重载,重点讲解赋值运算符、前置/后置++运算符、取地址运算符的重载方法,以及const成员函数的定义和使用方法。通过日期类的实现示例,展示运算符重载和const成员函数在实际应用中的具体代码实现,帮助读者更好地理解和运用这些C++特性。
用户11317877
2024/10/16
710
C++第五弹 -- 类与对象中篇下(赋值运算符重载函数 const成员函数 取地址操作符重载函数)
C++从入门到精通——类的6个默认成员函数之赋值运算符重载
空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。
鲜于言悠
2024/04/17
1710
C++从入门到精通——类的6个默认成员函数之赋值运算符重载
C++之运算符重载(二)
https://blog.csdn.net/zy010101/article/details/105240318
zy010101
2020/04/08
4240
C++之运算符重载(二)
[C++] 类和对象:运算符重载
在C++中,运算符重载是一种强大的特性,它允许我们重新定义已有的运算符,以便用于用户自定义的数据类型。通过运算符重载,我们可以使得我们自定义的类对象像内置类型一样进行运算,这为编写清晰、简洁且易于理解的代码提供了便利。
DevKevin
2024/05/12
1580
[C++] 类和对象:运算符重载
运算符重载
流操作符>>,<<一般使用非成员函数实现,也就是友元函数实现,这样可以符合程序员的惯性思维
DeROy
2020/05/11
9840
【C++】运算符重载案例 - 字符串类 ⑤ ( 重载 大于 > 运算符 | 重载 小于 < 运算符 | 重载 右移 >> 运算符 - 使用全局函数重载 | 代码示例 )
左移 << 操作符 cout << s << endl , 是将 s 对象输出到 cout 标准输出流中 ;
韩曙亮
2023/10/15
6060
【C++】运算符重载案例 - 字符串类 ③ ( 重载 左移 << 运算符 | 自定义类使用技巧 | 直接访问类的私有指针成员 | 为指针分配指定大小内存并初始化 0 )
左移运算符重载 , 可参考 【C++】运算符重载 ⑧ ( 左移运算符重载 | 友元函数 / 成员函数 实现运算符重载 | 类对象 使用 左移运算符 ) 博客 ;
韩曙亮
2023/10/15
3390
C++新旅程:详细介绍运算符重载函数,清晰明了
https://cloud.tencent.com/developer/article/2466055?shareByChannel=link
池央
2024/11/24
1560
C++新旅程:详细介绍运算符重载函数,清晰明了
【c++】拷贝构造和赋值运算符重载
用户11328191
2024/10/23
1560
推荐阅读
C++之运算符重载(三)
3490
从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载
1K0
【C++指南】运算符重载详解
3150
运算符重载(看完这篇彻底掌握重载问题)
9.8K1
从零开始学C++之运算符重载(四):类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete
6960
【C++】类和对象之赋值运算符重载
1590
C++面向对象学习之运算符重载(1)
8790
C++(运算符重载+赋值拷贝函数+日期类的书写)
1070
C/C++ 关于运算符重载笔记
2030
C++运算符重载的形式
8390
C++运算符重载(三)之递增运算符重载
7470
C++第五弹 -- 类与对象中篇下(赋值运算符重载函数 const成员函数 取地址操作符重载函数)
710
C++从入门到精通——类的6个默认成员函数之赋值运算符重载
1710
C++之运算符重载(二)
4240
[C++] 类和对象:运算符重载
1580
运算符重载
9840
【C++】运算符重载案例 - 字符串类 ⑤ ( 重载 大于 > 运算符 | 重载 小于 < 运算符 | 重载 右移 >> 运算符 - 使用全局函数重载 | 代码示例 )
6060
【C++】运算符重载案例 - 字符串类 ③ ( 重载 左移 << 运算符 | 自定义类使用技巧 | 直接访问类的私有指针成员 | 为指针分配指定大小内存并初始化 0 )
3390
C++新旅程:详细介绍运算符重载函数,清晰明了
1560
【c++】拷贝构造和赋值运算符重载
1560
相关推荐
C++之运算符重载(三)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验