string类型访问单个字符
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
//访问 string单个字符
int main()
{
string s = "1a2b3a4c";
int n = 0;
for(int i=0 ; i< s.length() ; i++)
{
if(isdigit(s[i]))//isdigit 判断字符是否0-9的阿拉伯数字 为真返回flase 否则返回true
//这里 使用s[i] 直接访问数组s中的字符
n++;//执行结果 n = 4
}
cout << n <<endl;
return 0;
}
数组范文符是 C/C++内置的操作符。 实质是 数组访问 与 指针运算 。
a[n] <==> *(a+n)<==>*(n+a)<==>n[a]
实验代码:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
//测试a[n] <==> *(a+n)<==>*(n+a)<==>n[a]
int main()
{
int s[5] ={1,2,3,4,5};
for(int i=0 ; i< 5; i++)
cout << s[i] <<" ";//使用s[i] 访问数组S 输出结果12345
cout << endl;
for(int i=0 ; i< 5; i++)
cout << *(s+i) <<" ";//使用*(s+i) 访问数组S 输出结果12345
cout << endl;
for(int i=0 ; i< 5; i++)
cout << *(i+s) <<" ";//使用*(i+s) 访问数组S 输出结果12345
cout << endl;
for(int i=0 ; i< 5; i++)
cout << i[s] <<" ";//使用 i[s] 访问数组S 输出结果12345
cout << endl;
return 0;
}
数组访问操作符([])
只能通过类的函数进行重载。
重载函数只能使用一个参数。
可以定义多个不同的重载函数。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
//测试 数组访问操作符([])
/* []操作符重载规则
只能通过类的函数进行重载。
重载函数只能使用一个参数。
可以定义多个不同的重载函数。
*/
class Test
{
int a[5];
public:
int& operator[](int i)
{
return a[i];
}
Test()
{
for(int i = 0;i<5 ;i++)
a[i] = i;
}
int length()
{
return 5;
}
};
int main()
{
Test t;
for(int i = 0 ; i< t.length();i++)
cout << t[i]<<" ";//将调用到 int& operator[](int i)这个函数t是Test创建的对象。使用对象加([])的方式访问Test数组中的私有数组
cout <<endl;
return 0;
}
既然上面可以在类中重载([]数组操作符) 那么同理,也应该可以重载 () 这个符号。
1、只能通过类的成员函数重载
2、可以定义多个不同参数的重载。
3、函数对象在工程中取代指针函数。
实验:实现获取 斐波那契数列 每项值
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
//实现()实现获取 斐波那契数列 每项值
/*
斐波那契数列
a0 = 0
a1 = 1
*/
class Fid
{
int a0;
int a1;
public:
Fid()//构造函数 初始化 a0 a1
{
a0 = 0;
a1 = 1;
}
Fid(int n)
{
a0 = 0;
a1 = 1;
for(int i = 2; i<= n; i++)
{
int t = a1;
a1 = a1+a0;
a0 = t;
}
}
int operator() ()//重载()操作符
{
int ret =a1;
a1 = a1+a0;
a0 = ret;
return ret;
}
};
int main()
{
Fid fid;
for(int i = 0;i< 10;i++)
cout <<fid() <<endl;
cout <<endl;
Fid fid1(5);
for(int i = 0;i< 5;i++)
cout <<fid1() <<endl;
return 0;
}
运行结果:
1
1
2
3
5
8
13
21
34
55
5
8
13
21
34
关于赋值操作符:重载赋值操作符,必然需要实现深拷贝。
1、编译器默认了赋值操作符
2、默认赋值操作符为浅拷贝
3、需要使用到深拷贝的时候需要重载赋值操作符。
4、赋值操作符与拷贝构造函数有相同的存在意义。
编译器默认的函数: