【C++】高级编程——易忘知识点


C++高级编程要点

概念

移位运算比除法更快>>除以2
移位运算<<乘以2

一 C++文件和流

这里主要介绍如何从文件读取流和向文件写入流,标准库为fstream,它定义了三个数据类型:
在这里插入图片描述
在C++中进行文件处理,就必须包含头文件<iostream> <fstream>

1.1 打开文件

在从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstreamfstream对象都可以用来打开文件进行写操作,ifstream对象用于打开文件进行读操作。
下面是open()函数的标准语法,open()函数是fstream、ifstream和ofstream对象的一个成员。用法如下:
void open(const char *filename, ios::openmode mode);
这里,open()成员函数的第一个参数指定要打开的文件的名称和位置,第二个参数定义了文件被打开的模式。

模式标志 描述
ios::app 追加模式。所有写入都追加到文件末尾
ios::ate 文件打开后定位在文件末尾
ios::in 打开文件用于读取
ios:out 打开文件用于写入
ios::trunc 如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为0

可以同时使用两种或者两种以上模式,比如,写入模式打开并希望截断文件,以防文件已存在:

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc);

类似的,打开文件用于读写有:

fstream afile;
afile.open("file.dat", ios::out | ios::in);

1.2 关闭文件

当C++程序终止时,会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件,推荐使用close()函数在程序终止前关闭所有打开的文件。
close()函数是fstream、ifstream和ofstream对象的一个成员,语法如下:
void close();
使用如下:

fstream afile;
afile.close();

1.3 写入文件

在C++编程中,我们使用流插入运算符<<向文件写入信息,就像使用该运算符输出信息到屏幕上一样,唯一不同的是,这里使用的是ofstream或fstream对象,而不是cout对象。

二、pair数对

c++中的结构模板,定义在头文件utility.h中,提供一个包含2个数据成员的结构体模板。继承与_Pair_base结构体模板。通过first,second访问2个成员,有 operator= 和 swap 方法。

三、参数传递

3.1 三种参数传递机制

下面的函数声明阐述了C++三种参数传递机制,该函数返回arr中前n个整数的平均值,并且如果n大于arr.size()或者小于1,就设定errorFlag = true
double avg(const vector<int> & arr, int n, bool & errorFlag);
这里,arrvector<int>类型的,使用按常量引用调用来传递;nint类型的,通过按值调用来传递,errorFlagbool类型的,使用引址调用来传递。参数传递机制的选用可以通过以下两步的判断来决定:

  • 如果形参必须能够改变实参的值,那么就必须使用引址调用;
  • 否则,实参的值不能被形参改变。如果参数类型是简单类型,使用按值调用,否则,参数类型的类类型的,一般按常量引用调用来传递。
    所以,在avg的声明中,errorFlag参数是通过引址调用来传递的,所以errorFlag的新值返回到实参中。arrn就不会被avg改变。arr按常量引用传递,因为它是类类型的,对其进行复制耗费巨大。n通过值来传递,因为它是基本类型,对其进行复制消耗较小。
    参数传递选项总结如下:
  • 按值调用适用于不被函数更改的小对象;
  • 按常量引用适用于不被函数更改的大对象;
  • 引址调用适用于所有可以被函数更改的对象。

3.2 返回值传递

对象的返回也可以是按值返回和按常量引用返回,偶尔也用到引址返回。使用按值返回总是很安全的,但是如果返回的对象是类类型,更好的办法是使用按常量引用返回以节省复制的开销。然而,这只有在下面的情况下才可能:必须确保返回语句中的表达式在函数返回时依然有效。
下图作为一个例子,两者都试图按常量引用返回值,第一个版本是可用的——表达式a[maxIndex]索引的vector是在findMax外部,并且存在时间长于调用返回的时间,第二个版本是错的,maxValue是一个局部变量,当函数返回的时候就不复存在了,这样一来,没有进行复制之前就返回时不恰当的。如果编译器没有查出这个问题,那么返回值既可能使对的,也可能是错的,这取决于编译器释放maxValue所使用的内存的速度,使调试工作即为困难。
没有太懂??maxIndx难道不是局部变量?按值返回??
在这里插入图片描述

发布了96 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Thera_qing/article/details/102157516