【C++ Primer 学习札记】返回数组指针和返回函数指针

目录

一、返回数组指针

1,类型别名

2,直接定义

3,尾置返回类型(C++11)

4,使用decltype

二、返回函数指针

1,类型别名

2,直接定义

3,尾置返回类型(C++11)

4,使用decltype


一、返回数组指针

返回数组指针有三种方式:

1,类型别名

2,直接定义

3,尾置返回类型(C++11)

4,使用decltype

 

1,类型别名

《C++ Primer》P205

因为我们无法返回数组,所以将返回类型定义成数组的指针。

将返回类型定义为数组的指针有两种方式,一种式类型别名(typedef),另外一种式别名声明(using)

类型别名(typedef)

typedef int arrT[10];
arrT* func(int i);

 别名声明(using)

using arrT = int[10];
arrT* func(int i);

 

2,直接定义

《C++ Primer》P205

如果我们想定义一个返回数组指针的函数,则数组的维度必须跟在函数名字之后。然而,函数的形参列表也跟在函数名字后面且形参列表应该先于数组的维度。因此,返回数组的指针的函数形式如下所示:

Type (*function(parameter_list))[dimension]

举个例子:

int (*fun(int i))[10] ;

 

3,尾置返回类型(C++11)

尾置类型返回类型跟在形参列表后面并以一个->符号开口。

为了表示函数真正的返回类型跟在形参列表之后,我们在本应该出现返回类型的地方放置一个auto:

//func 接受一个int类型的实参,返回一个指针,该指针指向含有10个整数的数组
auto func(int i) -> int(*)[10];

4,使用decltype

如果我们知道函数返回的指针将具体指向哪个数组,就可以使用decltype关键字声明返回类型。

int odd[] = {1,3,5,7,9};
int even[] = {2,4,6,8,10};
//返回一个指针,该指针指向含有5个整数的数组
decltype(odd) *arrPtr(int i)
{
    return (i % 2) ? &odd : &even;
}

注意,decltype不负责把数组类型转换成对应的指针,所以decltype的结果是一个数组,要想表示arrPtr返回指针还必须在函数声明中加一个*符号。

 

二、返回函数指针

《C++ Primer》P223

和数组类似,虽然不能返回一个函数,但是能返回指向函数类型的指针。

返回函数指针有三种方式:

1,类型别名

2,直接定义

3,尾置返回类型(C++11)

4,使用decltype

 

1,类型别名

using F = int(int*, int);//F是函数类型
using PF=int(*)(int*,int);//PF是指针类型

PF f1(int);//正确:PF是指向函数的指针,f1返回指向函数的指针
F f1(int);//错误:F是函数类型,f1不能返回一个函数
F *f1(int);//正确:显式地指定返回类型是指向函数的指针

2,直接定义

int (*f1(int))(int*,int);

3,尾置返回类型(C++11)

auto f1(int) -> int(*)(int*,int);

4,使用decltype

string::size_type sumLength(const string&,const string&);
string::size_type largerlength(const string&,const string&);
//根据形参的取值,getFcn函数返回指向sumLength或者largerlength的指针
decltype(sumLength) *getFcn(const string&);

 牢记当我们将decltype作用于某个函数时,它返回函数类型而非指针类型,

因此我们显式地加上*已表明我们需要返回指针,而非函数本身

 

 

 

你可能感兴趣的:(《C++,Primer》学习札记)