C++ Primer总结与拓展(第七章函数)

知识点1:

千万不要返回局部对象的引用
理解返回引用至关重要的是:千万不能返回局部变量的引用。
当函数执行完毕时,将释放分配给局部对象的存储空间。此时,对局部对象
的引用就会指向不确定的内存。考虑下面的程序:
// Disaster: Function returns a reference to a local object
const string &manip(const string& s)
{
string ret = s;
// transform ret in some way
return ret; // Wrong: Returning reference to a local object!
}

知识点2:

千万不要返回指向局部对象的指针
函数的返回类型可以是大多数类型。特别地,函数也可以返回指针类型。和
返回局部对象的引用一样,返回指向局部对象的指针也是错误的。一旦函数结束,
局部对象被释放,返回的指针就变成了指向不再存在的对象的悬垂指针

知识点3:

默认实参
默认实参是一种虽然并不普遍、但在多数情况下仍然适用的实参值。调用函数时,
可以省略有默认值的实参。编译器会为我们省略的实参提供默认值。

string screenInit(string::size_type height = 24,
string::size_type width = 80,
char background = ' ' );
调用包含默认实参的函数时,可以为该形参提供实参,也可以不提供。如果提供
了实参,则它将覆盖默认的实参值;否则,函数将使用默认实参值。下面的函数
screenInit 的调用都是正确的:
string screen;
screen = screenInit(); // equivalent to screenInit (24,80,'
')
screen = screenInit(66); // equivalent to screenInit (66,80,'
')
screen = screenInit(66, 256); // screenInit(66,256,' ')
screen = screenInit(66, 256, '#');

知识点4:

自动对象
默认情况下,局部变量的生命期局限于所在函数的每次执行期间。只有当定
义它的函数被调用时才存在的对象称为自动对象。自动对象在每次调用函数时创
建和撤销

知识点5:

一个变量如果位于函数的作用域内,但生命期跨越了这个函数的多次调用,
这种变量往往很有用。则应该将这样的对象定义为 static(静态的)。
static 局部对象确保不迟于在程序执行流程第一次经过该对象的定义语句
时进行初始化。这种对象一旦被创建,在程序结束前都不会撤销。当定义静态局
部对象的函数结束时,静态局部对象不会撤销。在该函数被多次调用的过程中,
静态局部对象会持续存在并保持它的值。

知识点6:

指向函数的指针

bool (*pf)(const string &, const string &);
这个语句将 pf 声明为指向函数的指针,它所指向的函数带有两个 const
string& 类型的形参和 bool 类型的返回值。

用 typedef 简化函数指针的定义
函数指针类型相当地冗长。使用 typedef 为指针类型定义同义词,可将函
数指针的使用大大简化:(第 2.6 节):
typedef bool (*cmpFcn)(const string &, const string &);
该定义表示 cmpFcn 是一种指向函数的指针类型的名字。该指针类型为“指
向返回 bool 类型并带有两个 const string 引用形参的函数的指针”。在要使
用这种函数指针类型时,只需直接使用 cmpFcn 即可,不必每次都把整个类型声
明全部写出来。

通过指针调用函数
指向函数的指针可用于调用它所指向的函数。可以不需要使用解引用操作
符,直接通过指针调用函数:
cmpFcn pf = lengthCompare;
lengthCompare("hi", "bye"); // direct call
pf("hi", "bye"); // equivalent call: pf1 implicitly
dereferenced
(*pf)("hi", "bye"); // equivalent call: pf1 explicitly
dereferenced
如果指向函数的指针没有初始化,或者具有 0 值,则该指针不
能在函数调用中使用。只有当指针已经初始化,或被赋值为指
向某个函数,方能安全地用来调用函数。

知识点7:

返回指向函数的指针

你可能感兴趣的:(C++,Primer)