您的位置:首页 > 编程语言 > C语言/C++

C++ 第8章 函数探幽

2015-06-07 19:26 267 查看
常量引用

double refcube(const double &ra) : 当编译器发现代码修改了ra的值时,将会生成错误信息。

如果编写基本数值类型的函数,应该采用按值传递。而不要采用引用。当数据比较大的时候,如结构或者类,引用参数将会很有用。

左值可以表示对象,即具有对应的可以由用户访问的存储单元(应特别注意和类风格面向对象中的对象——的实例的区别;Java等语言的对象即使用此种说法;C的左值相当于Java中的“变量”[1] )。正因为如此,用于取得对象的指针的内建操作符&要求操作数是左值。

左值表示存储在计算机内存的对象,与此相对的概念是右值(rvalue),习惯上统称为左值性(lvalue-ness) 。

如果函数参数声明为const 常量引用,则编译器将在必要的时候生成临时变量。

const Student& refcube (const double &ra) : 当编译器发现代码修改了ra的值时,将会生成错误信息。//

将const变量赋值给非const引用是非法的.

指针和引用的使用指导

1.如果数据对象是基本数据类型,则按值传递或者使用指针

2.如果数据对象是数组,则只能使用指针

3.如果数据对象是结构,则使用指针或者引用

4.如果数据对象是类对象,则使用引用

类设计的语义常常要求使用引用来作为传递。

默认参数:

char *left (const char * str,int n = 1)//n的默认值为·1

则left(“Hello”);//不会出错。因为默认值N=1

//只能在参数列表中,从右向左提供默认值、

通常在函数原型中指定默认参数。

函数重载:

********* 编译器将类型引用和类型本身视为同一个特征值。

********* 注意特征值:为函数列表,不包括返回值

void staff(double &rs);

void staff(const double &rs)

视为不同的函数

double x = 1.0 call 1

const double y = 32.0 call2

8.5 函数模板

类型是用参数表示的,类型变量、参数化类型

template <typename AnyType> //格式

void Swap(AnyType &a,AnyType &b){

AnyType tenp;

temp = a;

a = b;

b = temp;

}

关键字 template typename 是必须的, class替换type name 则就变成了类模板。模板描述了一副蓝图,并不创建任何函数,只是告诉编译器如何定义函数

重载模板

template <typename AnyType> //格式

void Swap(AnyType *a,AnyType *b,int n)

显式具体化

template <> void Swap<job>(job& a,job b);

或者 template<> void Swap(job& a,job& b);

编译器看到此类声明后,表示 “不要用Swap()模板来生成函数定义,而应该使用专门为int类型显式地定义的函数定义,与实例化区别在于,template后面包含<>”

优先级:

具体化优先于常规模板,而非模板函数优先于具体化和常规模板。

显式实例化和隐式实例化

记住,在代码中包含函数模板本身并不会生成函数定义,它只是一个用于生成函数定义的方案。编译器使用模板为特定类型生成函数定义的时候,得到的是模板的实例。

例如函数调用Swap(i,j)将会导致编译器生成一个int类型变量的实例,这称之为隐式实例化。

现在C++支持显示实例化

语法:

template void Swap<int>(int,int);

编译器看到这种声明后,将使用Swap模板生成一个使用int类型的实例,也就是说,该声明的意思是“使用Swap()模板生成int类型的函数定义”

试图在同一个文件中使用同一种类型的具体化和显式实例化将出错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: