【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里不 ...
随机推荐
- HTML 网页中以超链接的方式调用iphone 手机的app
2011-11-13 14:36:33| 分类: 随笔 | 标签:iphone 调用iphone手机app |举报|字号 订阅 <1>. 调用iphone 手机地图APP的 ...
- SQLServer -- 竟然默认不区分大小写
SELECT * FROM USER_INFO WHERE USERNAME = :username; 这样的写法,:username的值竟然不区分大小写 原因:数据库的排序规则设置的是Chinese ...
- JPA(Java Persistence API)Java持久化API-介绍
JPA全称: Java Persistence API JPA的宗旨是为POJO提供持久化标准规范,能够脱离容器独立运行,很方便开发和测试.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关 ...
- SUSE10 SP4源码升级Python到2.6.6
1.安装依赖包(CentOS可采用yum) zypper in gcc gcc-c++ openssl-devel-32bit openssl-devel readline-devel readlin ...
- openstack组件通讯端口定义
openstack 组件通讯是通过ZeroMQ+ceilometer发送组件调用信息,具体是通过TCP通讯,发送数据和接收数据是用同一个端口(在配置文件指定),下面通过代码稍作解析: IceHouse ...
- caffe使用自己的数据做分类
这里只举一个例子: Alexnet网络训练自己数据的过程 用AlexNet跑自己的数据 参考1:http://blog.csdn.net/gybheroin/article/details/54095 ...
- day12闭包,装饰器
一.闭包:内部函数引用了外部函数的变量. # f1() #闭包的定义 #内部的函数引用了外部函数的变量 # def f1(b): #闭包的常用状态 # def f2(): # print(b) # r ...
- keras常用的网络层
一.常用层 常用层对应于core模块,core内部定义了一系列常用的网络层,包括全连接.激活层等. 1.Dense层 Dense层:全连接层. keras.layers.core.Dense(outp ...
- 巨蟒python全栈开发django4:url反向解析图解&&模板渲染
第一部分: 1.(1)知识点回顾: django回顾: ()下载安装 输入网址,a,form表单get post,爬虫 (请求)==>django项目服务端的url(r"index/& ...
- 参数Slave_IO_Running和Slave_SQL_Running的状态值解析
Slave_SQL_Running: No mysql同步故障解决方法 2010-02-21 16:31:30 标签:mysql 双机 同步 数据库 休闲 原创作品,允许转载,转载时请务必以超链接形 ...