一.写出程序运行结果

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】重载数组下标操作符的更多相关文章

  1. 网易云课堂_C++程序设计入门(下)_第8单元:年年岁岁花相似– 运算符重载_第8单元 - 作业2:OJ编程 - 重载数组下标运算符

    第8单元 - 作业2:OJ编程 - 重载数组下标运算符 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...

  2. 5.6 C++重载下标操作符

    参考:http://www.weixueyuan.net/view/6384.html 总结: 下标操作符是必须要以类的成员函数的形式进行重载的.其在类中的声明格式如下:    返回类型 & ...

  3. C++程序设计方法3:数组下标运算符重载

    数组下标运算符重载 函数声明形式 返回类型operator[](参数): 如果返回类型是引用,则数组运算符调用可以出现在等式的左边,接受赋值,即: Obj[index] = value; 如果返回类型 ...

  4. js如何判断一组数字是否连续,得到一个临时数组[[3,4],[13,14,15],[17],[20],[22]];

    var arrange = function(arr){ var result = [], temp = []; arr.sort(function(source, dest){ return sou ...

  5. C++学习29 重载[](下标运算符)

    前面已经提到,下标操作符[]必须以类的成员函数的形式进行重载.在类中的声明格式如下: 返回值类型 & operator[] (参数) 或 const 返回值类型 & operator[ ...

  6. PHP 数组转json_encode,单个数组下标为了0时不对??

    在 php 数组转json时,假如 有一个数组下标是顺序的,他json_encode后会直接变成一个简版二维json, $arr = ['1'=>1,'2'=>2]; echo (json ...

  7. poj 2262 筛法求素数(巧妙利用数组下标!)

    Goldbach's Conjecture Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 41582   Accepted: ...

  8. C——数组下标与间址运算符

    只说一句,数组下标与间址运算符*是等价的,即:a[i] = *(a+i),看代码: int main(int argc, char* argv[]) { ] = {, , , , }; int i; ...

  9. bash中不可以用字符串做数组下标

    bash中可以用字符串做数组下标吗例如 test["abc"]=1------解决方案-------------------- 好像是误会,是awk里可以,bash shell里不 ...

随机推荐

  1. Java正则表达式之Matcher类的find和matches方法的区别

    讨论整个问题之前,先看个例子:   从上面的例子可以看出 matches()是整个字符串完全匹配时,才会返回true 而find()则只需要字符串中,找到某部分的子字符串匹配则返回true       ...

  2. neocomplcache 自动补全

    key description ctrl+n 当前词补全项,下一个 ctrl+p 当前词补全项,上一个 :help NERDTree NERDTree帮助手册

  3. Hello JFinal World

    JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java 语言所有优势 ...

  4. Java凝视分类

    Java凝视分类 1.单行凝视    //打印结果    System.out.println("结果是:"+result); 2.多行凝视    /**     * @autho ...

  5. Hadoop科普文—常见的45个问题解答 &#183; Hadoop

    个模式 · 单机(本地)模式 · 伪分布式模式 · 全分布式模式 2.  单机(本地)模式中的注意点? 在单机模式(standalone)中不会存在守护进程,全部东西都执行在一个JVM上. 这里相同没 ...

  6. python在linux中输出带颜色的文字的方法

    在开发项目过程中,为了方便调试代码,经常会向stdout中输出一些日志,默认的这些日志就直接显示在了终端中.而一般的应用服务器,第三方库,甚至服务器的一些通告也会在终端中显示,这样就搅乱了我们想要的信 ...

  7. TCP和UDP 协议发送数据包的大小

    在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,这里仅对像ICQ一类的发送聊天消息的情况作分 ...

  8. redis 有序集合数据结构实现 skiplist

    Redis使用跳跃表作为有序集合键的的底层实现,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时Redis就会使用跳跃表 来作为有序集合键的底层实现 Redis只在两 ...

  9. Android开发:《Gradle Recipes for Android》阅读笔记1.1

    第一章1.1节 注:下面都是用android studio新建出来的默认项目配置,没有修改 1.settings.gradle记录了哪些子目录包含了它们自己的工程,例如:include':app',如 ...

  10. Tomcat 配置连接池

    1. Tomcat 配置 JNDI 资源 JNDI(Java Naming and Directory Interface), Java 命名和目录接口; JNDI 作用: 在服务器上配置资源, 然后 ...