C++中的数组操作符重载
1,本文讲述数组操作符重载,上篇博文的字符串类 string 确实强大,但 string 类 对象还具备 C 方式字符串的灵活性吗?还能直接访问单个字符吗?
1,C 方式字符串灵活性是指能够通过数组访问操作符方便的访问字符串中的单个字符;
2,字符串类的兼容性:
1,string 类最大限度的考虑了 C 字符串的兼容性;
2,可以按照使用 C 字符串的方式使用 string 对象;
3,代码示例:
string s = "a1b2c3d4e";
int n = ; for(int i=; i<s.length(); i++)
{
if( isdigit(s[i]) )
{
n++;
}
}
3,用 C 方式使用 string 类编程实验:
1,main.cpp 文件:
#include <iostream>
#include <string> using namespace std; int main()
{
string s = "a1b2c3d4e";
int n = ; for(int i = ; i<s.length(); i++)
{
if( isdigit(s[i]) )
{
n++;
}
} cout << n << endl; return ;
}
2,输出结果:
4
3,在任意的 C++ 编译器中都支持数组访问的方式来使用字符串对象;
4,问题:
1,类的对象怎么支持数组的下标访问?
1,C++ 编译器并不支持将数组访问操作符和任意的类对象一起使用;
5,重载数组访问操作符:
1,数组访问符是 C/C++ 中的内置操作符;
1,数组访问操作符地位和 “+”、“-”、“*”、“/”、“==”、“=” 等内置操作符地位一致;
2,是操作符、地位同上,意味着可以重载;
2,数组访问符的原生意义是数组访问和指针运算;
1,a[n] <==> *(a + n) <==> *(n + a) <==> n[a];
1,指针和最终偏移地址相加,然后取元素;
2,加法交换律;
2,访问数组中的元素深层次的意义就是指针运算,算偏移量;
6,指针与数组的复习实例分析:
1,main.cpp 文件:
#include <iostream>
#include <string> using namespace std; int main()
{
int a[] = {}; for(int i=; i<; i++)
{
a[i] = i;
} for(int i=; i<; i++)
{
cout << *(a + i) << endl; // ==> cout << a[i] << endl;
} cout << endl; for(int i=; i<; i++)
{
i[a] = i + ; // ==> a[i] = i + 10;
} for(int i=; i<; i++)
{
cout << *(i + a) << endl; // cout << a[i] << endl;
} return ;
}
2,输出结果:
2,结论:
1,数组访问操作符原生语义是访问数组中的某个元素,深层次的意义是算地址的偏移量;
7,重载数组访问操作符:
1,数组访问操作符([]):
1,只能通过类的成员函数重载;
2,重载函数能且仅能使用一个参数;
1,参数可以是不同的类型;
3,可以定义不同参数的多个重载函数;
8,重载数组访问操作符编程实验:
1,main.cpp 文件:
#include <iostream>
#include <string> using namespace std; class Test
{
int a[]; // 被模拟的数组;
public:
int& operator [] (int i) // 能且仅能重载一个参数;引用是为了可以当做左值,因为不引用则直接是函数调用的返回值,它是不能当做左值使用的;
{
return a[i]; // 这里返回的不是局部变量,所以可以返回引用,且引用能够返回位置;
} /* 通过字符串来访问数组 */
int& operator [] (const string& s) // 定义多个重载函数;引用是为了可以当做左值;
{
if( s == "1st" )
{
return a[];
}
else if( s == "2nd" )
{
return a[];
}
else if( s == "3rd" )
{
return a[];
}
else if( s == "4th" )
{
return a[];
}
else if( s == "5th" )
{
return a[];
} return a[];
} int length()
{
return ;
}
}; int main()
{
Test t; for(int i=; i<t.length(); i++)
{
t[i] = i;
} for(int i=; i<t.length(); i++)
{
cout << t[i] << endl;
} cout << t["5th"] << endl; // 通过字符串作为下标来访问数组;
cout << t["4th"] << endl;
cout << t["3rd"] << endl;
cout << t["2nd"] << endl;
cout << t["1st"] << endl; return ;
}
2,结论:
1,在以后工作中要学习 C++ 后续语言如 C#、D 等语言时,会发现确实可 以将字符串作为下标来访问一个数组,它就是应用了操作符重载来实现的;
9,数组类的完善编程实验:
1,IntArray.h 文件:
#ifndef _INTARRAY_H_
#define _INTARRAY_H_ class IntArray
{
private:
int m_length;
int* m_pointer; IntArray(int len);
IntArray(const IntArray& obj);
bool construct();
public:
static IntArray* NewInstance(int length);
int length();
bool get(int index, int& value);
bool set(int index ,int value);
int& operator [] (int index); // 数组访问操作符重载;
IntArray& self(); // 返回自身,为了不使用指针;
~IntArray();
}; #endif
2,IntArray.cpp 文件:
#include "IntArray.h" IntArray::IntArray(int len)
{
m_length = len;
} bool IntArray::construct()
{
bool ret = true; m_pointer = new int[m_length]; if( m_pointer )
{
for(int i=; i<m_length; i++)
{
m_pointer[i] = ;
}
}
else
{
ret = false;
} return ret;
} IntArray* IntArray::NewInstance(int length)
{
IntArray* ret = new IntArray(length); if( !(ret && ret->construct()) )
{
delete ret;
ret = ;
} return ret;
} int IntArray::length()
{
return m_length;
} bool IntArray::get(int index, int& value)
{
bool ret = ( <= index) && (index < length()); if( ret )
{
value = m_pointer[index];
} return ret;
} bool IntArray::set(int index, int value)
{
bool ret = ( <= index) && (index < length()); if( ret )
{
m_pointer[index] = value;
} return ret;
} int& IntArray::operator [] (int index) // 数组访问操作符重载实现;
{
return m_pointer[index];
} IntArray& IntArray::self() // 返回数组指针的引用;
{
return *this;
} IntArray::~IntArray()
{
delete[]m_pointer;
}
3,main.cpp 文件:
#include <iostream>
#include <string>
#include "IntArray.h" using namespace std; int main()
{
IntArray* a = IntArray::NewInstance(); // 通过智能指针对象代替这里的指针; if( a != NULL )
{
IntArray& array = a->self();//堆空间创建的对象,没有别名, 这里给它起一个别名; cout << "array.length() = " << array.length() << endl; array[] = ; for(int i=; i<array.length(); i++)
{
cout << array[i] << endl;
}
} delete a; return ;
}
10,小结:
1,string 类最大程度的兼容了 C 字符串的用法;
2,数组访问符的重载能够使得对象模拟数组的行为;
3,只能通过类的成员函数重载数组访问操作符;
4,重载函数能且仅能使用一个参数;
C++中的数组操作符重载的更多相关文章
- C#中如何利用操作符重载和转换操作符
操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...
- C#中如何利用操作符重载和转换操作符 (转载)
操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...
- C++ 数组操作符重载、函数对象分析、赋值操作符
string类型访问单个字符 #include <iostream> #include <string> #include <sstream> using name ...
- C++中的赋值操作符重载和拷贝构造函数
1,关于赋值的疑问: 1,什么时候需要重载赋值操作符? 2,编译器是否提供默认的赋值操作符? 2,关于赋值的疑问: 1,编译器为每个类默认重载了赋值操作符: 1,意味着同类型的类对象可以相互赋值: 2 ...
- c/c++ 重载 数组 操作符[] operator[ is ambiguous, as 0 also mean a null pointer of const char* type.
// Note: //int x = a[0].GetInt(); // Error: operator[ is ambiguous, as 0 also mean a null pointer of ...
- C++基础学习笔记----第十三课(操作符重载-下)
本节主要讲使用成员函数重载操作符,包括[],=,(),->四种操作符的重载以及&&和||的问题. 类的成员函数进行操作符重载 基本概念 类的成员函数也可以进行操作符的重载.类的普 ...
- 5.7 C++函数调用操作符重载
参考:http://www.weixueyuan.net/view/6385.html 总结: 需要以类成员函数的形式对函数调用操作符“()”进行重载. 只有常成员函数才能处理常对象,故我们依然在类中 ...
- (二) operator、explicit与implicit 操作符重载
有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成把两个整 ...
- Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)
作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样, ...
随机推荐
- C# 指定索引排序 (原)
private void test(string[] sortkey_list, string[] list_temp) { //打开excel到dt: " }; string[] roww ...
- Qt第三方库----QCustomPlot
一.软件下载 下载地址:http://www.qcustomplot.com/index.php/download 这里推荐下载第一个链接的内容: 注:这里的第三方库要放在非中文目录下. 二.配置 ( ...
- 【CF1250G】Discarding Game(DP)
题意:A和B玩游戏,一共n轮,A先B后,第i轮两人分别能得到a[i]和b[i]的得分,累加到当前得分和中 每一轮进行完之后A可以选择抵消得分,即两者都减去两者的min 若某个时刻某个人得分和不小于K则 ...
- ModelSerializer 使用知识点_序列化和反序列化用法区别
1.ModelSerializer 如下 from api_test.errorCode.errorCode import Statusclass RelatedbSerializer(serial ...
- 满减 HRBUST - 2455
https://vjudge.net/problem/HRBUST-2455 有两种优惠方式,一是满400减100,另外一种是商品自带折扣,二者不可叠加 dp[i][j]表示前i种商品,(参与满400 ...
- 1.Python编程基础
1. 其实,程序指的就是一系列指令,用来告诉计算机做什么,而编写程序的关键在于,我们需要用计算机可以理解的语言来提供这些指令. 虽然借助 Siri(Apple).Google Now(Android) ...
- python学习之路(24)
访问限制 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个 ...
- c/c++运算符
1.算术运算符(+ - / * %) 2.移位运算符 移运算符:操作数必须是整形,>>,逻辑左移左边移入的位用0填充,算数左移左边移入的的位用符号位补齐.(无符号数为逻辑左移,对于 ...
- php中处理汉字字符串长度:strlen和mb_strlen
PHP内置的字符串长度函数strlen()无法正确处理中文字符串,它得到的只是字符串所占的字节数.对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍 ...
- MIME 类型,ContentType
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准. MIME 消息能包含文本.图像.音频.视频以及其他应用程序专用的数据. 官方 ...