1. 引用
大多数函数的模式是采用0个或者多个参数执行计算,然后返回一个结果。但是当你试图返回两个值时怎么办?引用。
&与类型一起使用来说明这个变量是一个引用。可以像使用普通变量一样使用这个变量,但是实际上这是一个指向原始变量的指针,每次修改都会改变存储在那个存储单元里面的内容。假设有这样一个程序:
#include<iostream>
using namespace std;
int addone1(int i)
{
i++;
}
int addone2(int& i)
{
i++;
}
int main()
{
int i=1;
addone1(i);
cout<<i<<endl;
addone2(i);
cout<<i<<endl;
}
//输出的结果是1 2
2. C++中的字符串
在C++中有三种使用字符串的方法。
(1)C风格,将字符串看成数组;
(2)C++风格,将字符串封装在一个易于使用的string类型里
(3)最后就是不是标准的普通类。
C++string类型在<string>头文件中定义,string类型也位于std名称空间中。
3. 异常
C++是一种非常灵活的语言,但是带来的问题就是 不是那么安全。异常就是试图增加一点安全性的语言特性。
异常是一种无法预料的情形。例如,如果编写一个获取web页面的函数,就有几件事情可能出错,包含页面的Internet主机处于关机状态,页面可能是空白的,连接可能丢失,等等。处理这种情况办法就是,从函数返回特定的值(最熟悉的404)。异常提供了吹了此类问题的更好办法。
当某段代码检测到异常时,就会抛出一个异常,另一段代码会捕获这个异常然后执行恰当的操作。例如:
#include<stdexcept>
#include<iostream>
#include<exception>
double divideNumbers(double numerator,double denominator)
{
if(denominator == 0)
{
throw std::invalid_argument("Denominator cannot be 0.");
}
return numerator / denominator;
}
int main()
{
try
{
std::cout<<divideNumbers(2.54,0.5)<<std::endl; //正常执行
std::cout<<divideNumbers(6.8,0)<<std::endl; //抛出一个异常
std::cout<<divideNumbers(2.54,0.5)<<std::endl; //不会执行
}
catch(const std::exception& exception1)
{
std::cout<<"Exception caught: "<<exception1.what()<<std::endl;
}
return 0;
}
C++的异常非常灵活,为了正确使用异常,需要理解抛出异常时堆栈变量的行为,必须正常捕获并处理必要的异常。