Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【C++】运算符重载案例 - 字符串类 ④ ( 重载 双等号 == 运算符 | 重载 不等号 != 运算符 | 代码示例 )

【C++】运算符重载案例 - 字符串类 ④ ( 重载 双等号 == 运算符 | 重载 不等号 != 运算符 | 代码示例 )

作者头像
韩曙亮
发布于 2023-10-15 08:03:26
发布于 2023-10-15 08:03:26
34100
代码可运行
举报
运行总次数:0
代码可运行

一、重载 双等号 / 不等号 运算符

1、等于判断 == 运算符重载

使用 成员函数 实现 等于判断 == 运算符重载 :

  • 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
    • 要对 String a , b 对象对比操作 , 使用 == 运算符 , 使用时用法为 a == b ;
    • 函数名是 operate== ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
operate==
  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
    • 要对 String a , b 对象对比操作 , 使用 == 运算符 , 使用时用法为 a == b ;
    • 左操作数 : 其中 左操作数 是 String a , 这里通过 this 指针调用 , 不需要声明在参数中 ;
    • 右操作数 : 右操作数 是 String b ; 该操作数需要声明在参数中 , 注意需要声明 引用类型 ;
    • 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 这里传入引用类型 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
operator==(String & s)
  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
    • 此处返回值是 bool 类型 , 返回 true 或者 false 布尔值即可 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool operator==(String& s)
  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
    • 先对比数组的长度是否相等 ;
    • 然后对比数组中每个元素是否相等 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 重载 双等号 == 运算符
bool String::operator==(String& s)
{
	// 首先判断数组长度是否相等
	if (this->m_len != s.m_len)
	{
		return false;
	}

	for (size_t i = 0; i < this->m_len; i++)
	{
		// 只要有一个元素不相等, 整个数组就不相等
		if (this->m_p[i] != s.m_p[i])
		{
			return false;
		}
	}
	return true;
}

2、重载 不等号 != 运算符

使用 成员函数 实现 重载 不等号 != 运算符 :

  • 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
    • 要对 String a , b 对象对比操作 , 使用 != 运算符 , 使用时用法为 a != b ;
    • 函数名是 operate!= ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
operate!=
  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
    • 要对 String a , b 对象对比操作 , 使用 != 运算符 , 使用时用法为 a != b ;
    • 左操作数 : 其中 左操作数 是 String a , 这里通过 this 指针调用 , 不需要声明在参数中 ;
    • 右操作数 : 右操作数 是 String b ; 该操作数需要声明在参数中 , 注意需要声明 引用类型 ;
    • 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 这里传入引用类型 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
operator!=(String& a)
  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
    • 此处返回值是 bool 类型 , 返回 true 或者 false 布尔值即可 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool operator!=(String& s)
  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
    • 先对比数组的长度是否不相等 ;
    • 然后对比数组中每个元素是否不相等 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 重载 不等号 != 运算符
bool String::operator!=(String& s)
{
	// 首先判断数组长度是否相等
	if (this->m_len != s.m_len)
	{
		return false;
	}

	for (size_t i = 0; i < this->m_len; i++)
	{
		// 只要有一个元素不相等, 整个数组就不相等
		if (this->m_p[i] != s.m_p[i])
		{
			return false;
		}
	}
	return true;
}

三、完整代码示例


1、String.h 类头文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma once

#include "iostream"
using namespace std;

class String
{
public:
	// 默认的无参构造函数
	String();

	// 有参构造函数 , 接收一个 char* 类型字符串指针
	String(const char* p);

	// 有参构造函数 , 接收 int 类型值 , 表示字符串大小
	String(int len);

	// 拷贝构造函数 , 使用 String 对象初始化 对象值
	String(const String& s);

	// 析构函数
	~String();

public:
	// 重载等号 = 操作符 , 右操作数是 String 对象的情况
	String& operator=(const String& s);

	// 重载等号 = 操作符 , 右操作数是 字符串常量值 的情况
	String& operator=(const char* p);

	// 重载 数组下标 [] 操作符
	char& operator[](int i);

	// 重载 双等号 == 运算符
	bool operator==(String& s);

	// 重载 不等号 != 运算符
	bool operator!=(String& s);

	// 使用 全局函数 实现 左移运算符 << 重载
	// 将全局函数 声明为 String 的友元函数
	friend ostream& operator<<(ostream& out, String& s);

public:
	// 获取私有成员 char* m_p
	char* str();

	// 获取私有成员 int m_len
	int len();

private:
	// 字符串长度 , 不包括 '\0'
	// 内存占用空间大小 = 字符串长度 + 1
	int m_len;

	// 字符串指针, 指向堆内存中的字符串
	char* m_p;
};

2、String.cpp 类实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 使用 strcpy 函数报错
// error C4996: 'strcpy': This function or variable may be unsafe. 
// Consider using strcpy_s instead. 
// To disable deprecation, use _CRT_SECURE_NO_WARNINGS. 
// See online help for details.
#define _CRT_SECURE_NO_WARNINGS

#include "String.h"

// 默认的无参构造函数
String::String()
{
	// 默认构造一个空字符串 , 字符串长度为 0 
	// 但是 , 字符串指针 指向的内存空间大小是 1 , 内容是 '\0'
	m_len = 0;

	// 使用 new 关键字为 char* m_p; 指针分配内存
	// 对于基础数据类型 new 等同于 malloc
	m_p = new char[m_len + 1];

	// 拷贝空字符串到 m_p 指向的内存中
	strcpy(m_p, "");

	cout << "调用无参构造函数" << endl;
}

// 有参构造函数 , 接收一个 char* 类型字符串指针
String::String(const char* p)
{
	if (p == NULL)
	{
		// 默认构造一个空字符串 , 字符串长度为 0 
		// 但是 , 字符串指针 指向的内存空间大小是 1 , 内容是 '\0'
		this->m_len = 0;

		// 使用 new 关键字为 char* m_p; 指针分配内存
		// 对于基础数据类型 new 等同于 malloc
		this->m_p = new char[this->m_len + 1];

		// 拷贝空字符串到 m_p 指向的内存中
		strcpy(this->m_p, "");
	}
	else
	{
		// 获取传入字符串的长度
		// 但是 , 字符串指针 指向的内存空间大小需要 +1 , 内容是 '\0'
		this->m_len = strlen(p);

		// 使用 new 关键字为 char* m_p; 指针分配内存
		// 对于基础数据类型 new 等同于 malloc
		this->m_p = new char[this->m_len + 1];

		// 拷贝字符串到 m_p 指向的内存中
		strcpy(this->m_p, p);
	}
	cout << "调用有参构造函数" << endl;
}

// 有参构造函数 , 接收 int 类型值 , 表示字符串大小
String::String(int len)
{
	if (len == 0)
	{
		// 默认构造一个空字符串 , 字符串长度为 0 
		// 但是 , 字符串指针 指向的内存空间大小是 1 , 内容是 '\0'
		this->m_len = 0;

		// 使用 new 关键字为 char* m_p; 指针分配内存
		// 对于基础数据类型 new 等同于 malloc
		this->m_p = new char[this->m_len + 1];

		// 拷贝空字符串到 m_p 指向的内存中
		strcpy(this->m_p, "");
	}
	else
	{
		// 获取传入字符串的长度
		// 但是 , 字符串指针 指向的内存空间大小需要 +1 , 内容是 '\0'
		this->m_len = len;

		// 使用 new 关键字为 char* m_p; 指针分配内存
		// 对于基础数据类型 new 等同于 malloc
		this->m_p = new char[this->m_len + 1];

		// 将内存空间设置为 0 内容
		memset(this->m_p, 0, this->m_len);
	}
};

// 拷贝构造函数 , 使用 String 对象初始化 对象值
String::String(const String& s)
{
	// 拷贝字符串长度
	// 注意 : 字符串指针 指向的内存空间大小需要 +1 , 内容是 '\0'
	this->m_len = s.m_len;

	// 使用 new 关键字为 char* m_p; 指针分配内存
	// 对于基础数据类型 new 等同于 malloc
	this->m_p = new char[this->m_len + 1];

	// 拷贝字符串到 m_p 指向的内存中
	strcpy(this->m_p, s.m_p);

	cout << "调用拷贝构造函数" << endl;
}

// 析构函数
String::~String()
{
	if (this->m_p != NULL)
	{
		// 之前使用 new 分配的内存
		// 释放内存就需要使用 delete 
		// 使用 malloc 分配的内存需要使用 free 释放
		delete[] this->m_p;

		// 设置指针指为空 , 避免出现野指针
		this->m_p = NULL;

		// 设置字符串长度为 0
		this->m_len = 0;
	}
}

// 重载等号 = 操作符 , 右操作数是 String 对象的情况
String& String::operator=(const String& s)
{
	// 先处理本对象已分配的内存
	if (this->m_p != NULL)
	{
		// 之前使用 new 分配的内存
		// 释放内存就需要使用 delete 
		// 使用 malloc 分配的内存需要使用 free 释放
		delete[] this->m_p;

		// 设置指针指为空 , 避免出现野指针
		this->m_p = NULL;

		// 设置字符串长度为 0
		this->m_len = 0;
	}

	// 拷贝字符串长度
	// 注意 : 字符串指针 指向的内存空间大小需要 +1 , 内容是 '\0'
	this->m_len = s.m_len;

	// 使用 new 关键字为 char* m_p; 指针分配内存
	// 对于基础数据类型 new 等同于 malloc
	this->m_p = new char[this->m_len + 1];

	// 拷贝字符串到 m_p 指向的内存中
	strcpy(this->m_p, s.m_p);

	cout << "调用重载 等号 = 操作符函数 String& String::operator=(const String& s)" << endl;

	return *this;
}

// 重载等号 = 操作符 , 右操作数是 字符串常量值 的情况
String& String::operator=(const char* p)
{
	// 先处理本对象已分配的内存
	if (this->m_p != NULL)
	{
		// 之前使用 new 分配的内存
		// 释放内存就需要使用 delete 
		// 使用 malloc 分配的内存需要使用 free 释放
		delete[] this->m_p;

		// 设置指针指为空 , 避免出现野指针
		this->m_p = NULL;

		// 设置字符串长度为 0
		this->m_len = 0;
	}

	// 拷贝字符串长度
	// 注意 : 字符串指针 指向的内存空间大小需要 +1 , 内容是 '\0'
	this->m_len = strlen(p);

	// 使用 new 关键字为 char* m_p; 指针分配内存
	// 对于基础数据类型 new 等同于 malloc
	this->m_p = new char[this->m_len + 1];

	// 拷贝字符串到 m_p 指向的内存中
	strcpy(this->m_p, p);

	cout << "调用重载 等号 = 操作符函数 String& String::operator=(const char* p)" << endl;

	return *this;
}

// 重载 数组下标 [] 操作符
char& String::operator[](int i)
{
	cout << "调用重载 下标 [] 操作符函数 char& String::operator[](int i)" << endl;

	// 直接返回对应 i 索引字符
	return this->m_p[i];
}

// 重载 双等号 == 运算符
bool String::operator==(String& s)
{
	// 首先判断数组长度是否相等
	if (this->m_len != s.m_len)
	{
		return false;
	}

	for (size_t i = 0; i < this->m_len; i++)
	{
		// 只要有一个元素不相等, 整个数组就不相等
		if (this->m_p[i] != s.m_p[i])
		{
			return false;
		}
	}
	return true;
}

// 重载 不等号 != 运算符
bool String::operator!=(String& s)
{
	// 首先判断数组长度是否相等
	if (this->m_len != s.m_len)
	{
		return false;
	}

	for (size_t i = 0; i < this->m_len; i++)
	{
		// 只要有一个元素不相等, 整个数组就不相等
		if (this->m_p[i] != s.m_p[i])
		{
			return false;
		}
	}
	return true;
}

// 获取私有成员 char* m_p
char* String::str()
{
	return this->m_p;
}

// 获取私有成员 int m_len
int String::len()
{
	return this->m_len;
}

// 全局函数 中实现 String 左移运算符重载
// 返回 ostream& 引用类型 , 是为了支持链式调用 cout << s1 << endl;
ostream& operator<<(ostream& out, String& s)
{
	cout << "调用重载 左移 << 操作符函数 ostream& operator<<(ostream& out, String& s)" << endl;

	// 在函数体中将 String 对象的 m_p 指针指向的数据输出到 out 输出流中
	out << s.m_p  << endl;

	// 该返回值还需要当左值使用
	return out;
}

3、Test.cpp 测试类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "iostream"
using namespace std;

// 导入自定义的 String 类
#include "String.h"

int main() {

	// 调用无参构造函数
	String s1;

	// 调用有参构造函数
	String s2("Tom");

	// 调用拷贝构造函数
	String s3 = s2;

	// 调用重载的等号运算符函数, 右操作数是 String 对象
	s1 = s2;

	// 调用重载的等号运算符函数, 右操作数是 字符串常量值 , char* 指针类型
	s3 = "Jerry";

	// 调用重载的下标运算符函数
	char c = s3[3];

	// 调用 重载的 左移运算符 函数
	cout << s3 << endl;

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++】运算符重载案例 - 字符串类 ① ( Visual Studio 中创建 String 类 | 构造函数与析构函数 | 完整代码示例 )
右键点击 " 解决方案资源管理器 " 中的 解决方案 名称 , 在弹出菜单中 , 选择 " 添加 / 类 " 选项 ;
韩曙亮
2023/10/15
2650
【C++】运算符重载案例 - 字符串类 ① ( Visual Studio 中创建 String 类 | 构造函数与析构函数 | 完整代码示例 )
【C++】运算符重载 ⑨ ( 等号 = 运算符重载 | 调用默认浅拷贝构造函数的情况分析 | 等号 = 运算符重载 与 拷贝构造函数 各自使用场景 | 等号 = 操作符重载步骤 )
C++ 编译器 为 类 提供的 默认的 拷贝操作 , 是对 成员变量 的简单拷贝 , 是 浅拷贝 ;
韩曙亮
2023/10/15
3050
【C++】运算符重载 ⑨ ( 等号 = 运算符重载 | 调用默认浅拷贝构造函数的情况分析 | 等号 = 运算符重载 与 拷贝构造函数 各自使用场景 | 等号 = 操作符重载步骤 )
【C++】运算符重载 ⑪ ( 数组类 中 等号 = 运算符重载 | 函数原型 Array& operator=(Array& a) | 完整代码示例 )
如果 想要 使用 一个已存在的数组类对象 为 另外一个已存在的数组类对象 赋值 ,
韩曙亮
2023/10/15
1750
【C++】运算符重载 ⑪ ( 数组类 中 等号 = 运算符重载 | 函数原型 Array& operator=(Array& a) | 完整代码示例 )
【C++】运算符重载案例 - 字符串类 ② ( 重载 等号 = 运算符 | 重载 数组下标 [] 操作符 | 完整代码示例 )
个对象 Student s1, s2 之间进行 等号运算 , 使用一个现有对象 为 另外一个现有对象赋值 ;
韩曙亮
2023/10/15
4090
【C++】运算符重载案例 - 字符串类 ② ( 重载 等号 = 运算符 | 重载 数组下标 [] 操作符 | 完整代码示例 )
【C++】定义自己的String类
这个实现的string类是比较简单的,C++标准模板库里面的string类的方法是非常多的,而且非常复杂。 在这里仅仅给大家演示string内部大概的实现方法
谙忆
2021/01/21
5010
【C++】定义自己的String类
C++之运算符重载(三)
https://blog.csdn.net/zy010101/article/details/105245007
zy010101
2020/04/08
3460
C++之运算符重载(三)
【C++】泛型编程 ⑮ ( 类模板示例 - 数组类模板 | 自定义类中持有指针成员变量 )
在上一篇博客 中 , 定义了 可拷贝 与 可打印 的 自定义类 Student , 可以被存放到 数组类模板 中 ;
韩曙亮
2023/11/25
1940
【C++】泛型编程 ⑮ ( 类模板示例 - 数组类模板 | 自定义类中持有指针成员变量 )
【C++】运算符重载 ⑩ ( 下标 [] 运算符重载 | 函数原型 int& operator[](int i) | 完整代码示例 )
在之前的博客 【C++】面向对象示例 - 数组类 ( 示例需求 | 创建封装类 | 数组类头文件 Array.h | 数组类实现 Array.cpp | 测试类 Test.cpp - 主函数入口 ) 中 , 实现了一个数组类 , 在一个类中 , 封装了一个 int 类型的指针 , 该指针指向堆内存的 内存空间 , 用于存放一个数组 ;
韩曙亮
2023/10/15
2170
【C++】运算符重载 ⑩ ( 下标 [] 运算符重载 | 函数原型 int& operator[](int i) | 完整代码示例 )
C++学习之路——函数重载和运算符重载
C++允许在同一作用域中的某个函数和运算符指定多个定义,分 别称为函数重载和运算符重载
全栈程序员站长
2022/09/23
4290
C++学习之路——函数重载和运算符重载
【C++】运算符重载 ⑭ ( 逻辑与 && 运算符重载 | 逻辑或 || 运算符重载 | 完整代码示例 )
逻辑与 && 和 逻辑或 || 运算符 是 可以重载的 , 这两个操作符是 特殊操作符 ;
韩曙亮
2023/10/15
1910
【C++】运算符重载 ⑭ ( 逻辑与 && 运算符重载 | 逻辑或 || 运算符重载 | 完整代码示例 )
C++运算符重载详解
C++语言的一个很有意思的特性就是除了支持函数重载外还支持运算符重载,原因就是在C++看来运算符也算是一种函数。比如一个 a + b 的加法表达式也可以用函数的形式:operator + (a, b)来表达。这里的operator +代表的就是加法函数。高级语言中的表达式和数学表达式非常相似,在一定的程度上通过运算符来描述表达式会比通过函数来描述表达式更加利于理解和阅读。一般情况下在重载某个运算符的实现时最好要和运算符本身的数学表示意义相似,当然你也可以完全实现一个和运算符本身意义无关的功能或者相反的功能(比如对某个+运算符实现为相减)。运算符函数和类的成员函数以及普通函数一样,同样可分为类运算符和普通运算符。要定义一个运算符函数总是按如下的格式来定义和申明:
欧阳大哥2013
2018/08/22
1.5K0
C++运算符重载(五)之关系运算符重载
正常情况下如果想比较两个日期大小是无法实现的,这是因为运算符默认都是给内置类型用的。
CtrlX
2022/09/21
7250
【C++】运算符重载案例 - 字符串类 ⑤ ( 重载 大于 > 运算符 | 重载 小于 < 运算符 | 重载 右移 >> 运算符 - 使用全局函数重载 | 代码示例 )
左移 << 操作符 cout << s << endl , 是将 s 对象输出到 cout 标准输出流中 ;
韩曙亮
2023/10/15
5640
【C++】运算符重载案例 - 字符串类 ③ ( 重载 左移 << 运算符 | 自定义类使用技巧 | 直接访问类的私有指针成员 | 为指针分配指定大小内存并初始化 0 )
左移运算符重载 , 可参考 【C++】运算符重载 ⑧ ( 左移运算符重载 | 友元函数 / 成员函数 实现运算符重载 | 类对象 使用 左移运算符 ) 博客 ;
韩曙亮
2023/10/15
2990
运算符重载
流操作符>>,<<一般使用非成员函数实现,也就是友元函数实现,这样可以符合程序员的惯性思维
DeROy
2020/05/11
9620
从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载
该文介绍了如何在C++中实现字符串的基本操作和内存管理,包括字符串的赋值、字符串的拼接、字符串的复制等操作。同时介绍了如何实现字符串的运算符重载,以及如何使用string类实现基本的字符串操作。
s1mba
2017/12/28
9980
从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载
【C++】运算符重载 ⑬ ( 括号 () 运算符重载 | 完整代码示例 )
上述写法 , 与函数调用很像 , 只是 s 不是函数名 , 而是一个 对象的 名称 ;
韩曙亮
2023/10/15
4280
【C++】运算符重载 ⑬ ( 括号 () 运算符重载 | 完整代码示例 )
【C++】泛型编程 ⑭ ( 类模板示例 - 数组类模板 | 容器思想 | 自定义类可拷贝 - 深拷贝与浅拷贝 | 自定义类可打印 - 左移运算符重载 )
上一篇博客 【C++】泛型编程 ⑬ ( 类模板示例 - 数组类模板 | 构造函数和析构函数 的 声明与实现 | 普通成员函数 的 声明与实现 | 外部友元函数 的 声明与实现 ) 中 , 实现了一个 数组 类模板 , 数组 中的 数据元素 是 泛型类型 , 可以是任意类型 ;
韩曙亮
2023/11/24
2200
【C++】泛型编程 ⑭ ( 类模板示例 - 数组类模板 | 容器思想 | 自定义类可拷贝 - 深拷贝与浅拷贝 | 自定义类可打印 - 左移运算符重载 )
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
前言:在C++中,string是一个极其重要且常用的类,它为我们提供了丰富的字符串操作功能。然而,了解其背后的实现原理,不仅可以帮助我们更好地使用它,还能让我们对C++的内存管理、模板编程等有更深入的理解。本文将带你走进C++字符串的世界,通过模拟实现一个简单的string类,来探索其内部机制
Eternity._
2024/06/14
1900
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
从零开始:C++ String类的模拟实现
在C++编程中,字符串操作是非常常见且重要的任务。标准库中的std::string类提供了丰富且强大的功能,使得字符串处理变得相对简单。然而,对于学习C++的开发者来说,深入理解std::string的内部实现原理是非常有益的。通过亲手实现一个类似的String类,不仅可以帮助我们掌握面向对象编程的基本概念,还能增强我们对内存管理和字符串操作的理解。
用户11305458
2024/10/09
860
从零开始:C++ String类的模拟实现
推荐阅读
【C++】运算符重载案例 - 字符串类 ① ( Visual Studio 中创建 String 类 | 构造函数与析构函数 | 完整代码示例 )
2650
【C++】运算符重载 ⑨ ( 等号 = 运算符重载 | 调用默认浅拷贝构造函数的情况分析 | 等号 = 运算符重载 与 拷贝构造函数 各自使用场景 | 等号 = 操作符重载步骤 )
3050
【C++】运算符重载 ⑪ ( 数组类 中 等号 = 运算符重载 | 函数原型 Array& operator=(Array& a) | 完整代码示例 )
1750
【C++】运算符重载案例 - 字符串类 ② ( 重载 等号 = 运算符 | 重载 数组下标 [] 操作符 | 完整代码示例 )
4090
【C++】定义自己的String类
5010
C++之运算符重载(三)
3460
【C++】泛型编程 ⑮ ( 类模板示例 - 数组类模板 | 自定义类中持有指针成员变量 )
1940
【C++】运算符重载 ⑩ ( 下标 [] 运算符重载 | 函数原型 int& operator[](int i) | 完整代码示例 )
2170
C++学习之路——函数重载和运算符重载
4290
【C++】运算符重载 ⑭ ( 逻辑与 && 运算符重载 | 逻辑或 || 运算符重载 | 完整代码示例 )
1910
C++运算符重载详解
1.5K0
C++运算符重载(五)之关系运算符重载
7250
【C++】运算符重载案例 - 字符串类 ⑤ ( 重载 大于 > 运算符 | 重载 小于 < 运算符 | 重载 右移 >> 运算符 - 使用全局函数重载 | 代码示例 )
5640
【C++】运算符重载案例 - 字符串类 ③ ( 重载 左移 << 运算符 | 自定义类使用技巧 | 直接访问类的私有指针成员 | 为指针分配指定大小内存并初始化 0 )
2990
运算符重载
9620
从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载
9980
【C++】运算符重载 ⑬ ( 括号 () 运算符重载 | 完整代码示例 )
4280
【C++】泛型编程 ⑭ ( 类模板示例 - 数组类模板 | 容器思想 | 自定义类可拷贝 - 深拷贝与浅拷贝 | 自定义类可打印 - 左移运算符重载 )
2200
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
1900
从零开始:C++ String类的模拟实现
860
相关推荐
【C++】运算符重载案例 - 字符串类 ① ( Visual Studio 中创建 String 类 | 构造函数与析构函数 | 完整代码示例 )
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文