1、c++内联函数
将内联函数的编译代码与其他程序代码内联起来,也就是,编译器将使用相应的函数代码替换函数的调用。对于内联函数,程序无需跳到另外一个位置处执行代码,再跳回来。因此,内联函数的运行速度比常规函数稍快。但也有代价是需要占用更多的内存。
2、引用变量
2.1、创建引用变量
c++中&符号,除指示变量的地址,还可以用来声明引用。
int rats;
int &rodents=rats;//int &指的是指向int的引用,这个就是引用声明允许将rats和rodents互换,它们指向相同的值和内存单元。
rats=101;
rodents=101;
rodents++;//这个操作将一个有两个名称的变量加1;
cout<<tats<<todents;//这两个数值都是101;
int rats=-101;
int &rodents=rats;
int *prats=&rats;
这样,表达式rodents和 *prats都可以同rats互换,而表达式&rodents和prats都可以同&ratshu互换。
和指针是有一定的区别:
引用必须在声明引用变量时进行初始化,不能像指针一样, 先声明,再赋值。
2.2、将引用用作函数参数
引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名。这种传递参数的方法称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。
如果编写使用基本数值类型,应采用按值传递的方式,而不要采用按引用传递的方式,当数据比较大时,引用参数将很有用。
临时变量、引用参数已经const
如果实参与引用参数不匹配,c++将生成临时变量,当前仅当参数为const引用时,c++才允许这样做,很久之前不时这样的。
3、将引用用于结构
使用结构引用参数的方式与使用基本变量引用相同,只需在声明结构参数时使用引用运算符&即可。
struct free_throws
{
std::string name;
int made;
int attempts;
float perfcenf;
};
函数原型:
void set_pc(free_throws & ft);
如果不需要函数修改传入的结构,可使用const;
void display(const free_throw)
4、为何要返回引用
传统返回机制与按值传递函数参数类似,计算关键字return后面的表达式,并将结果返回给调用函数。从基础的概念上说,这个值被复制到一个临时位置而调用程序将使用这个值。
double m=sqrt(16.0);
cot <<sqrt(25.0);
dup=accumulate(team,five);
//如果accumulate()返回一个结构,而不是指向结构的引用,将把整个结构复制到一个临时位置,再将这个拷贝复制给dup,但在返回值为引用时,将直接把team复制到dup,其效率更高。
注意:返回引用的函数实际上是被引用的变量的别名。
5、返回引用时需要注意的问题
应该避免返回函数终止时不再存在的内存单元引用。
同时也要注意避免返回临时变量的指针以及返回一个指向的是临时变量的引用。
解决方法:
5.1.返回一个作为参数传递给函数的引用。作为参数的引用将指向调用函数使用的数据,因此返回的引用也将指向这些数据。
5.2.使用new来分配新的内存空间。
6、为何将const用于引用返回类型
通过省略const,可以编写更简短的代码,但是其含义也更模糊了。
通常,应避免在设计中添加模糊的特性,将返回类型声明为const引用。
7、将引用用于类对象
string类定义了一种char *到string的转换功能,这使地可以使用c_风格字符串来初始化string对象。
假设实参的类型字符与引用参数类型不匹配。但是可以传递一个指向该临时变量的引用。
例如:
如果形参类型为const string& ,在调用函数时,使用的实参可以是string对象或c-风格的字符串,如用括号括起的字符串字面量,以空字符结尾的char数组或指向char的指针变量。
8、对象、继承和引用
ostream和ofstream类凸现了引用的一个有趣的属性。ofstream对象可以使用ostream类的方法,这使得文件输入/输出的格式与控制台输入/输出相同,使得能够将特性从一个类传递给另一个类的语言特性被称为继承,
可以这样认为,ostream是基类,ofstream是派生类,派生类继承了基类的方法,这就相当于ofstream对象可以使用基类的特性,如格式化方法precision()和setf();
继承有的一个特性是,基类引用可以指向派生类对象,而无需进行强制类型转换。
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
const int LIMIT = 5;
void file_it(ostream &os, double fo, const double fe[], int n)
{
//参数os可以指向cout,还可以指向fout,即就是可以直接代替cout等。
ios_base::fmtflags initial;//是存储这种信息所需要的数据类型的名称。
initial = os.setf(ios_base::fixed);//将对象置于使用定点表示法的模式
os.precision(0);
os << "Focal length of objective: " << fo << "mm\n";
os.setf(ios::showpoint);//将对象置于显示小数点的模式
os.precision(1);
os.width(12);//设置下一次输出操作使用的字符宽度,这种设置只在显示下一个值时有效,然后将恢复到默认设置
os << "f.l.eyepiece";
os.width(15);
os << "magnification" << endl;
for (int i = 0; i < n; i++)
{
os.width(12);
os << fe[i];
os.width(15);
os << int(fo / fe[i] + 0.5) << endl;
}
os.setf(initial);//返回调用它之前有效的所有格式化设置。
}
int main()
{
ofstream fout;
const char * fn = "ep_data.txt";//在文档中建立一个文本文档
fout.open(fn);
if (!fout.is_open