string类型访问单个字符  

#include <iostream>
#include <string>
#include <sstream> using namespace std; //访问 string单个字符 int main()
{ string s = "1a2b3a4c";
int n = ;
for(int i= ; i< s.length() ; i++)
{ if(isdigit(s[i]))//isdigit 判断字符是否0-9的阿拉伯数字 为真返回flase 否则返回true
//这里 使用s[i] 直接访问数组s中的字符
n++;//执行结果 n = 4
}
cout << n <<endl; return ;
}

  数组范文符是 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[] ={,,,,};
for(int i= ; i< ; i++)
cout << s[i] <<" ";//使用s[i] 访问数组S 输出结果12345
cout << endl; for(int i= ; i< ; i++)
cout << *(s+i) <<" ";//使用*(s+i) 访问数组S 输出结果12345
cout << endl; for(int i= ; i< ; i++)
cout << *(i+s) <<" ";//使用*(i+s) 访问数组S 输出结果12345
cout << endl; for(int i= ; i< ; i++)
cout << i[s] <<" ";//使用 i[s] 访问数组S 输出结果12345
cout << endl;
return ;
}

数组访问操作符([])

  只能通过类的函数进行重载。

  重载函数只能使用一个参数。

  可以定义多个不同的重载函数。  

#include <iostream>
#include <string>
#include <sstream> using namespace std; //测试 数组访问操作符([])
/* []操作符重载规则
只能通过类的函数进行重载。   重载函数只能使用一个参数。   可以定义多个不同的重载函数。
*/ class Test
{
int a[];
public:
int& operator[](int i)
{
return a[i];
}
Test()
{
for(int i = ;i< ;i++)
a[i] = i;
}
int length()
{
return ;
}
};
int main()
{ Test t;
for(int i = ; i< t.length();i++)
cout << t[i]<<" ";//将调用到 int& operator[](int i)这个函数t是Test创建的对象。使用对象加([])的方式访问Test数组中的私有数组
cout <<endl;
return ;
}

既然上面可以在类中重载([]数组操作符) 那么同理,也应该可以重载 () 这个符号。

  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 = ;
a1 = ;
}
Fid(int n)
{
a0 = ;
a1 = ;
for(int i = ; 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 = ;i< ;i++)
cout <<fid() <<endl;
cout <<endl; Fid fid1();
for(int i = ;i< ;i++)
cout <<fid1() <<endl;
return ;
}

运行结果:


  关于赋值操作符:重载赋值操作符,必然需要实现深拷贝。

  1、编译器默认了赋值操作符

  2、默认赋值操作符为浅拷贝

  3、需要使用到深拷贝的时候需要重载赋值操作符。

  4、赋值操作符与拷贝构造函数有相同的存在意义。

编译器默认的函数:

  

C++ 数组操作符重载、函数对象分析、赋值操作符的更多相关文章

  1. C++ Primer 学习笔记_62_重载操作符与转换 --调用操作符和函数对象

    重载操作符与转换 --调用操作符和函数对象 引言: 能够为类类型的对象重载函数调用操作符:一般为表示操作的类重载调用操作符! struct absInt { int operator() (int v ...

  2. Python学习手册之内部方法、操作符重载和对象生命周期

    在上一篇文章中,我们介绍了 Python 的类和继承,现在我们介绍 Python 的内部方法.操作符重载和对象生命周期. 查看上一篇文章请点击:https://www.cnblogs.com/dust ...

  3. 第35课.函数对象分析("()"重载)

    1.编写一个函数 a.函数可以获得斐波那契数列 b.每调一次返回一个值 c.函数可以根据需要重复使用 2.函数数对象 a.使用具体的类对象取代函数 b.改类的对象具备函数调用的行为 c.构造函数指具体 ...

  4. C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

    在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符.我就斗胆将他们命名为六大函数好了. 一.构造函数 c++primer中说过: ...

  5. C++ 流操作符重载函数

    1. 问题 在C++中,在进行输入输出操作时,我们首先会想到用cout, cin这两个库操作语句来实现,比如 cout << 8 << "hello world!&q ...

  6. 5.5 C++重载赋值操作符

    参考:http://www.weixueyuan.net/view/6383.html 总结: 重载赋值操作符同重载类的是拷贝构造函数的原因是一样,将一个对象拷贝给另一个对象,同时当类中存在指针类型的 ...

  7. C++中逗号操作符重载的分析

    1,关注逗号操作符重载后带来的变化: 2,逗号操作符: 1,逗号操作符(,)可以构成都好表达式:exp1, exp2, exp3, ..., expN 1,逗号表达式用于将多个表达式连接为一个表达式: ...

  8. C++ 构造函数 隐式转换 深度探索,由‘类对象的赋值操作是否有可能调用到构造函数’该实验现象引发

    Test1 /** Ques: 类对象的赋值操作是否有可能调用到构造函数 ? **/ class mystring { char str[100]; public: mystring() //myst ...

  9. C++基础学习笔记----第十三课(操作符重载-下)

    本节主要讲使用成员函数重载操作符,包括[],=,(),->四种操作符的重载以及&&和||的问题. 类的成员函数进行操作符重载 基本概念 类的成员函数也可以进行操作符的重载.类的普 ...

随机推荐

  1. C++入门经典-例8.10-实现抽象类中的成员函数

    1:抽象类通常作为其他类的父类,如果从抽象类派生的子类是抽象类,则子类必须实现父类中的所有纯虚函数.代码如下: // 8.10.cpp : 定义控制台应用程序的入口点. // #include &qu ...

  2. AsyncTaskMethodBuilder

    AsyncTaskMethodBuilder Represents a builder for asynchronous methods that return a task. public stru ...

  3. -webkit-scrollbar 的使用,滚动条的隐藏

    滚动条的隐藏 -webkit-scrollbar 是一个伪类选择器 设置滚动条的样式 例如滚动条的隐藏 元素::-webkit-scrollbar{ width:0; }

  4. Java-GC 垃圾收集器(HotSpot)

    垃圾收集器为垃圾收集算法的具体实现,是执行垃圾收集算法的,是守护线程. HotSpot 虚拟机采用分代收集(JVM 规范并未对堆区进行划分),将堆分为年轻代和老年代,垃圾收集器也按照这样区分.不过已有 ...

  5. Groovy脚本基础全攻略

    1 背景 Groovy脚本基于Java且拓展了Java,所以从某种程度来说掌握Java是学习Groovy的前提,故本文适用于不熟悉Groovy却想快速得到Groovy核心基础干货的Java开发者(注意 ...

  6. vue文件流转换成pdf预览(pdf.js+iframe)

    参考文档:https://www.jianshu.com/p/242525315bf6 PDFJS: https://mozilla.github.io/pdf.js/     支持获取文件流到客户端 ...

  7. PreparedStatement执行sql語句

    import com.loaderman.util.JdbcUtil; import java.sql.Connection; import java.sql.PreparedStatement; i ...

  8. 阶段3 3.SpringMVC·_07.SSM整合案例_08.ssm整合之Spring整合MyBatis框架

    service能供成功的调用到service对象就算是整合成功 如果能把生成的代理对象也存大IOC的容器中.那么ServiceImpl就可以拿到这个对象 做一个注入,然后就可以调用代理对象的查询数据库 ...

  9. C++函数传值问题

    在做题出现个神奇的事情,C++的传值跟其他OOP语言不一样.首先做个测试,看看下面输出结果是什么? void F(int a,int b,int c){ cout<<a<<b& ...

  10. 能详细说一下action:=cafree这句吗?好多书都没说清楚!

    关闭一个窗口有几种方式:最小化这个窗口,隐藏这个窗口,释放这个窗口,这句话就是说但这个窗口关闭的时候释放这个窗口,它应该是在form的onclose事件里面的 就是form.onclose() beg ...