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类型的函数定义”
试图在同一个文件中使用同一种类型的具体化和显式实例化将出错
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类型的函数定义”
试图在同一个文件中使用同一种类型的具体化和显式实例化将出错
相关文章推荐
- C++ tips: std::stringstream 对象的复用
- C++ tips: throw和throw+对象的差别
- 【学习笔记】【C语言】逻辑运算符
- 类模板相互引用的问题(错误:缺少类型说明符-假定为int。注意:C++不支持默认int)
- chapter11test5
- 类模板相互引用的问题(错误:缺少类型说明符-假定为int。注意:C++不支持默认int)
- C++中的explicit关键字
- 黑马程序员——OC语言基础——面向对象三大特性之继承
- C++文件读写详解(ofstream,ifstream,fstream)
- 二值图像边缘提取算法C语言实现
- c++ --> 复制构造函数
- c语言编写贪吃蛇修改后最新版
- c++ --> 构造函数与析构函数
- C 链表
- 浅谈工作中使用过的几种C++界面库
- 初学c++之template <typename T>
- c++模板学习
- C++ primer 箭头操作符重载心得体会
- uefi的c++编程支持new和delete
- 用C++写uefi程序