c++ 使用 at()访问数组 抛出异常

1、说明

当我们定义一个数组vector b(10)后,b\[\]和b.at()都可以对v中元素进行访问,平时一般大家使用的都是v\[\]这种访问方法,以至于将v.at()这种访问方式忘记了。

2、vector\[\]和vector.at()的区别

b.v\[\]和b.at()都可以对v中元素进行访问,并且访问的元素时都不能越界,比如a10或a.at(10)这样的使用会报错。区别在于,operator\[\]不做边界检查, 哪怕越界了也会返回一个引用,当然这个引用是错误的引用,如何不小心调用了这个引用对象的方法,会直接导致应用退出。而由于at会做边界检查,如果越界,会抛出异常,应用可以try catch这个异常,应用还能继续运行。

3、示例代码

(1)出现异常

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
int main(){
    string str = "http://c.biancheng.net";
    char ch1 = str[100];  //下标越界,ch1为垃圾值
    cout<<ch1<<endl;
    char ch2 = str.at(100);  //下标越界,抛出异常
    cout<<ch2<<endl;
    return 0;
}

str\[\] 不会检查下标越界,不会抛出异常,所以即使有错误,try 也检测不到

换句话说,发生异常时必须将异常明确地抛出,try 才能检测到;如果不抛出来,即使有异常 try 也检测不到。所谓抛出异常,就是明确地告诉程序发生了什么错误。

linux 下运行

(2)捕获异常

cpp 复制代码
#include <iostream>
#include <exception>
using namespace std;

int main(int argc, char const *argv[])
{
    string str = "http://c.biancheng.net";
    //1、捕获不到异常
    try
    {
        char ch1 = str[100];//因为[]不会检查下标越界,不会抛出异常,所以即使有错误,try 也检测不到
        //换句话说,发生异常时必须将异常明确地抛出,try 才能检测到;如果不抛出来,即使有异常 try 也检测不到。所谓抛出异常,就是明确地告诉程序发生了什么错误。
        cout << ch1 << endl;
    }
    catch (exception e)
    {
        cout << "[1]out of bound!" << endl;
    }
	
	//2、捕获到异常
    try
    {
        char ch2 = str.at(100);//推荐使用at,会检查下标越界
        cout << ch2 << endl;
    }
    catch (exception &e)
    { //exception类位于<exception>头文件中
        cout << "[2]out of bound!" << endl;
        cout << e.what() << endl;
    }
  
    return 0;
}

linux 下运行

相关推荐
方华世界11 分钟前
企业级Java AI Agent应用平台
java·开发语言·人工智能
劉宇雁37 分钟前
C++ ASCII 3D无尽跑酷游戏
c++·游戏·3d
ujainu小38 分钟前
原生性能优化:6变量实现高效桥接
开发语言·华为·性能优化·harmonyos
甄同学44 分钟前
第十七篇:Bash Executor命令执行器,安全运行Shell命令
开发语言·安全·bash
张3231 小时前
Go语言基础 Map 函数值 闭包
开发语言·golang
杜子不疼.1 小时前
【C++ 在线五子棋对战】- 会话管理模块实现
开发语言·c++
有点。1 小时前
C++深度优先搜索(DFS)的概念(一)
开发语言·c++·深度优先
旖-旎1 小时前
《LeetCode 978 最长湍流子数组 || LeetCode 139 单词拆分》
c++·算法·leetcode·动态规划
时间的拾荒人1 小时前
C语言编译与链接:从源码到可执行程序的完整解析
c语言·开发语言
人道领域1 小时前
【0-1的agent进阶篇】Prompt 与上下文工程
java·开发语言·prompt·mcp