【C++】字符串类实验

目的

  1. 学习类的定义、实例化的方法
  2. 学习运算符重载的使用方法
  3. 学习使用异常处理的使用方法
  4. 体会面向对象程序设计方法

任务

  1. 设计一个 CString类,并实现以下功能。
1
2
3
4
5
6
7
8
9
class CString{
friend ostream& operator<<(ostream& o, const CString& s);
public:
CString(const char* str = "");
~CString();
char& operator[](int pos);
private:
char* _s;
};
  1. 当发生下标越界等异常时,能够进行异常处理。

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//CString.h
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<iostream>
using namespace std;
class CString
{
friend ostream& operator<<(ostream& o, const CString& s);
public:
CString(const char* str = "");
~CString();
char& operator[](int pos);
private:
char* _s;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//CString.cpp 
#include "CString.h"

ostream& operator<<(ostream& o, const CString& s) {
for(int i=0;i<strlen(s._s);i++)
cout << s._s[i];
return o;
}

char& CString::operator[](int index) {
if (index < 0 || index >= strlen(_s)) throw ("下标越界");
return _s[index];
}

CString::CString(const char* str) {
_s = new char[strlen(str) + 1];
strcpy(_s, str);
}

CString::~CString() { delete[] _s; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//main.cpp
#include"CString.h"

int main() {
CString str("I love China!");
cout << str << endl;
try {
str[2] = 'L';
cout << str << endl;
str[20] = 'L';
}
catch (const char* s) {
cout << "异常:" << s << endl;
}
}

总结

  1. 请你简要描述异常处理的语法及基本要点:
    1. 检测是否满足条件后throw()出报错信息。
    2. 在外面用try{}包括可能出现错误的语句块。
    3. Try{}后面用catch{}捕获语句,执行catch语句块中的代码。
    4. 一个语句中只能有一个try块,但可以有多个catch语句块,以便与不同的异常类型匹配。catch语句必须有参数,如果try语句块中的代码抛出了异常,无论抛出的异常的值是什么,只要异常的类型与catch的参数类型匹配,异常就会被catch语句捕获。最后一个catch语句参数为…符号,表示可以捕获任意类型的异常。
    5. 一旦某个catch语句捕获到了异常,后面的catch语句将不再被执行,其用法类似switch…case语句。
    6. try和catch语句块中的代码必须使用大括号{}括起来,即使语句块中只有一行代码。
    7. try语句和catch语句不能单独使用,必须连起来一起使用。
  2. 请你简要回答下标运算符[]的重载为什么要返回引用:
    1. 因为返回值存在堆中,需要内外对同一段数据进行操作,所以使用引用。
  3. 请你简要回答,为什么流输出运算符不能重载为成员函数。
    1. 如果重载为成员函数,那么使用起来就会变成:参数≪cout,不能进行连续输出,而且用起来还十分不方便。