1、说明
当我们定义一个数组vector b(10)后,b[]和b.at()都可以对v中元素进行访问,平时一般大家使用的都是v[]这种访问方法,以至于将v.at()这种访问方式忘记了。
2、vector[]和vector.at()的区别
b.v[]和b.at()都可以对v中元素进行访问,并且访问的元素时都不能越界,比如a[10]或a.at(10)这样的使用会报错。区别在于,operator[]不做边界检查, 哪怕越界了也会返回一个引用,当然这个引用是错误的引用,如何不小心调用了这个引用对象的方法,会直接导致应用退出。而由于at会做边界检查,如果越界,会抛出异常,应用可以try catch这个异常,应用还能继续运行。
3、示例代码
(1)出现异常
#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)捕获异常
#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 下运行