【c++习题】【17/5/22】重载数组下标操作符
一.写出程序运行结果
1#include <iostream >
using namespace std;
int a[10]={1,2, 3, 4, 5, 6, 7, 8, 9, 10};
int fun( int i);
void main()
{int i ,s=0;
for( i=0;i<=10;i++)
{ try
{ s=s+fun(i);}
catch(int)
{cout<<”数组下标越界!”<<endl;}
}
cout<<"s=”<<s<<endl;
}
int fun( int i)
{if(i>=10)
throw i;
return a[i];
}
数组下标越界!
S=55
2 #include <iostream>
using namespace std;
void f();
class T
{public:
T( )
{cout<<"constructor"<<endl;
try
{throw "exception";}
catch( char*)
{cout<<"exception”<<endl;}
throw "exception";
}
~T( ) {cout<<"destructor";}
};
void main()
{cout<<"main function”<< endl;
try{ f( ); }
catch( char *)
{ cout<<"exception2"<<endl;}
cout<<"main function”<<endl;
}
void f( )
{ T t; }
main function
constructor
exception
exception2
main function
二、程序设计题
1以String类为例,在String类的构造函数中使用new分配内存。如果操作不成功,则用try语句触发一个char类型异常,用catch语句捕获该异常。同时将异常处理机制与其他处理方式对内存分配失败这一异常进行处理对比,体会异常处理机制的优点。
2在1的基础上,重载数组下标操作符[],使之具有判断与处理下标越界功能。
解法一
#include
<iostream>
#include
<cstring>
using
namespace std;
class
String{
public:
String(const
char*);
String(const
String&);
~String();
char
operator[](int);
void
ShowStr(){cout<<sPtr<<endl;}
private:
char
*sPtr;
};
1
#include <iostream>
using namespace std; int a[10]={1,2, 3, 4, 5, 6, 7, 8, 9, 10};
int fun( int i); void main()
{
int i, s=0;
for(i=0; i<=10; i++) { // 第十趟不会完整运行
try {
s=s+fun(i);
} catch(int) {
cout<<"数组下标越界!"<<endl;
}
}
cout<<"s="<<s<<endl;
} int fun(int i) {
if (i>=10) throw i;
return a[i];
} 2
#include <iostream>
using namespace std; void f(); class T {
public:
T() {
cout<<"constructor"<<endl; // 2
try
{ throw "exception";}
catch( char*)
{ cout<<"exception"<<endl;} // 3
throw "exception";
}
~T( ) {cout<<"destructor";} // 不被执行
}; void main()
{
cout<<"main function"<< endl; // 1
try { f( ); }
catch( char *)
{ cout<<"exception2"<<endl;} // 4
cout<<"main function"<<endl; // 5
} void f( )
{ T t; } 3
#include <iostream>
#include <cstring>
using namespace std;
class String{
public:
String(const char*);
String(const String&);
~String();
char operator[](int i);
void ShowStr(){cout<<sPtr<<endl;} private:
char *sPtr;
}; // 构造函数
String::String(const char *s) {
sPtr = new char[strlen(s)+1];
if (sPtr == NULL) throw ("Constructor abnormal");
strcpy(sPtr, s);
} String::String(const String& copy) {
sPtr = new char[strlen(copy.sPtr) + 1];
if (sPtr == NULL) throw ("Copy constructor abnormal");
strcpy(sPtr, copy.sPtr);
} String::~String() {
delete[] sPtr;
} // 重载数组下标操作符
char String::operator [] (int i) {
if (i < 0 || i > strlen(sPtr)) throw ("Exception: overflow.\n");
return sPtr[i];
} int main()
{
String hi("hello"); try {
hi.ShowStr(); printf("hi[0]=%c\n", hi[0]);
printf("hi[1]=%c\n", hi[1]);
printf("hi[2]=%c\n", hi[2]);
printf("hi[3]=%c\n", hi[3]);
printf("hi[4]=%c\n", hi[4]);
printf("hi[5]=%c(zero)\n", hi[5]);
printf("hi[6]=%c\n", hi[6]); // error!
} catch (char* exception) {
cout << exception << endl;
} return 0;
} /*
output:
hello
hi[0]=h
hi[1]=e
hi[2]=l
hi[3]=l
hi[4]=o
hi[5]= (zero)
Exception: overflow.
*/
【c++习题】【17/5/22】重载数组下标操作符的更多相关文章
- 网易云课堂_C++程序设计入门(下)_第8单元:年年岁岁花相似– 运算符重载_第8单元 - 作业2:OJ编程 - 重载数组下标运算符
第8单元 - 作业2:OJ编程 - 重载数组下标运算符 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...
- 5.6 C++重载下标操作符
参考:http://www.weixueyuan.net/view/6384.html 总结: 下标操作符是必须要以类的成员函数的形式进行重载的.其在类中的声明格式如下: 返回类型 & ...
- C++程序设计方法3:数组下标运算符重载
数组下标运算符重载 函数声明形式 返回类型operator[](参数): 如果返回类型是引用,则数组运算符调用可以出现在等式的左边,接受赋值,即: Obj[index] = value; 如果返回类型 ...
- js如何判断一组数字是否连续,得到一个临时数组[[3,4],[13,14,15],[17],[20],[22]];
var arrange = function(arr){ var result = [], temp = []; arr.sort(function(source, dest){ return sou ...
- C++学习29 重载[](下标运算符)
前面已经提到,下标操作符[]必须以类的成员函数的形式进行重载.在类中的声明格式如下: 返回值类型 & operator[] (参数) 或 const 返回值类型 & operator[ ...
- PHP 数组转json_encode,单个数组下标为了0时不对??
在 php 数组转json时,假如 有一个数组下标是顺序的,他json_encode后会直接变成一个简版二维json, $arr = ['1'=>1,'2'=>2]; echo (json ...
- poj 2262 筛法求素数(巧妙利用数组下标!)
Goldbach's Conjecture Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 41582 Accepted: ...
- C——数组下标与间址运算符
只说一句,数组下标与间址运算符*是等价的,即:a[i] = *(a+i),看代码: int main(int argc, char* argv[]) { ] = {, , , , }; int i; ...
- bash中不可以用字符串做数组下标
bash中可以用字符串做数组下标吗例如 test["abc"]=1------解决方案-------------------- 好像是误会,是awk里可以,bash shell里不 ...
随机推荐
- 基于springCloud的分布式架构体系
Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...
- 基于 UML 的业务建模举例
简介: 对于管理流程咨询项目.大型信息化建设项目和套装管理软件实施项目,对业务环境的分析和理解对项目的成功至关重要.系统.全面理解 IT 系统所处的业务环境,可以帮助 IT 系统能提供正确系统功能,并 ...
- tomcat 测试页面显示
首先下载匹配jdk版本的tomcat 解压即可使用 将完成的html文件直接放置到webapps目录下的子目录中是无法使用的 原因是tomcat默认加载的是jsp文件,且需要文件配置 所以,除去在we ...
- staticmethod classmethod修饰符
一.staticmethod(function) Return a static method for function.A static method does not receive an imp ...
- _DataStructure_C_Impl:SeqListBasedSort
// _DataStructure_C_Impl:Sort #include<stdio.h> #include<stdlib.h> #define MaxSize 50 ty ...
- week 5: ;Lasso regression & coordinate descent
笔记. 岭回归, 计算回归系数时使( RSS(w)+λ||w||2) 最小 岭回归的结果会是所有的特征的weight都较小,但大多数又不完全为零. 而实际情况中,有的特征的确与输出值相关程度很高,we ...
- poj 2942(点双连通+判奇圈)
题目链接:http://poj.org/problem?id=2942 思路:我们对于那些相互不憎恨的骑士连边,将每次参加会议的所有人(不一定是整个骑士团,只需人数>=3且为奇数)看做一个点双联 ...
- iOS内存管理之浅见
当我们用alloc.new.copy创建对象时,对象的应用计数为1,当把这个对象retain时.引用计数+1.当对这个对象发送release消息时,引用计数-1,当对象的引用计数为0时,系统回收这个对 ...
- 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)
[BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...
- SharePoint服务器端对象模型 之 访问网站和列表数据(Part 3)
(三)视图 与传统意义上的数据视图类似,SharePoint中的列表视图指定了列表中数据的筛选条件.排序条件.分组条件.显示栏/字段.显示条目数.显示样式等内容.在SharePoint中,使用SPVi ...