指针与引用的对比

advertisement
C++ Programming
Lecture 13
Wei Liu (刘威)
Dept. of Electronics and Information Eng.
Huazhong University of Science and Technology
Feb. 2014
Lecture 13

Chapter 15. Introduction to C++





15.1 Introduction
15.2 First Program
15.3 Sum up two numbers
15.4 Reference
15.5 More about functions
-2-
First Program
Comments(注释)
//, /* */
Function body
(函数体)
Preprocessor directive
(预处理器指令)#include
Function
return
type
Function
name
with()
Header file(头文
件)
<iostream>
Keyword(关键字)
int, return
Statement;
(语句)
std::cout, output object, print the text message
Indicate the end of program
-3-
Basic structure of source code





Comments: can be any line, started with //
Preprocessor directive: end without ;
Statement: end with ;
main() function body
keywords
-4-
C++ output with cout
std::cout
-5-
Lecture 13

Chapter 15. Introduction to C++





15.1 Introduction
15.2 First Program
15.3 Sum up two numbers
15.4 Reference
15.5 More about functions
-6-
Another Program
Variables
declarations
Input object
std::cin
Arithmetic
calculation
-7-
Experiment

编写程序,对两个数求和,使用C++的语法
#include <iostream>
using namespace std;
int sum( int, int);
int main (void)
{
cout << " [main] begin! " << endl;
int sum1;
sum1 = sum( 5, 10);
cout << " [main] sum1 = " << sum1 << endl;
return 0;
}
-8-
Lecture 13

Chapter 15. Introduction to C++





15.1 Introduction
15.2 First Program
15.3 Sum up two numbers
15.4 Reference
15.5 More about functions
-9-
指针使用上可能出现的问题

指针也是变量,也应“声明-初始化-使用”。
在使用前一定要初始化,否则将导致程序内存
错误
int a = 1;
int *p ;
* p = 10;
// 指针被声明时,可以不初始化
// 此处操作的是一个随机地址的数据
-10-
指针使用上可能出现的问题

指针的赋值一定要类型匹配,即与该指针类型
相符合的变量或者常量的地址

指针的算术运算最好在数组连续区中进行,一
旦数组越界将导致程序内存错误
-11-
“引用”的引入


为了克服C语言指针的这些问题,C++语言引入了
“引用”(References)的概念
被声明为引用的变量(References variable)



引用变量可以作为其它变量的别名(aliase)
引用变量在声明时必须被初始化,运行时不允许重新赋值
当引用变量被声明为某个原变量的别名后,操作引用变量
等效于操作原变量
-12-
-13-
-14-
指针与引用的对比

定义 Definition 的对比



引用Reference不是一种独立的数据类型,而是已经存
在的某变量或者对象的别名,例如“侧门”
指针Pointer是一种独立的数据类型,其存储空间大小
与所指向的变量或者对象大小有关,例如“钥匙”
声明 Declaration 的对比

引用
int a = 1;
int &r = a;

// 引用被声明时必须初始化,&为引用声明符
指针
int a = 1;
int *p ;
p = &a;
// 指针被声明时,可以不初始化
// &为取地址符
-15-
指针与引用的对比

使用 Usage 的对比

引用
int &r = a;
r += 1;
// 用引用名直接访问变量
void fun1(int & x) {
x += 3;
// 用引用名直接访问变量
}

指针
int *p = &a;
*p += 1;
// 指针用*间接引用符访问变量
void fun2(int * x) {
*x += 3;
// 指针用*间接引用符访问变量
}
-16-
15.7 References and Reference
Parameters

Two ways to passing variable to function
Passing by value
值传递
Passing by reference
引用传递
-17-
15.7 References

Pass-by-reference 引用传递



the caller gives the called function the ability to access
the caller’s data directly, and to modify that data. 可以
直接操作和修改变量的值
A reference parameter is an alias for its corresponding
argument in a function call. 引用形参可以视为原实参
的一个“别名”
How to indicate a reference 引用的声明


Follow the parameter’s type in the function prototype
by an ampersand (&)
Use the same convention when listing the parameter’s
type in the function header.
-18-
-19-
-20-
Sample

指针或者引用作为函数的形参
-21-

指针或者引用作为函数的返回值
-22-
Experiment

编写四个函数,对两个数求和,分别使用指针/引用作为
函数参数和返回值,演示它们的调用
-23-
小结:指针与引用

指针 vs. 引用

引用的功能类似于指针常量,引用能够实现的功
能,指针都可以实现

C++ 引入“引用”的概念,主要意图是将引用作为函
数的形式参数,扩充函数传递数据的功能,增强可
读性、避免指针的误操作

但是引用不能完成指针的全部功能



所指向的对象会发生改变时
函数指针
数组指针
-24-
Lecture 13

Chapter 15. Introduction to C++





15.1 Introduction
15.2 First Program
15.3 Sum up two numbers
15.4 Reference
15.5 More about functions




15.6 Inline Functions
15.9 Default Arguments
15.11 Function Overloading
15.12 Function Templates
-25-
Inline Functions 内联函数



C++ provides inline functions to help reduce function
call overhead—especially for small functions. 降低函数
调用开销,适用于小规模的函数
Placing the qualifier in-line before a function’s return
type in the function definition “advises” the compiler to
generate a copy of the function’s code in place (when
appropriate) to avoid a function call. 由编译器产生替换
代码
The complete function definition must appear before
the code is inlined so that the compiler knows how to
expand a function call into its inlined code.
-26-
-27-
15.9 Default Arguments 默认实参

默认实参


在函数原型中指定实参的默认值
示例:

sum函数完成四个数相加的功能 int sum(a,b,c,d); 如果该
函数的定义符合需求,但是调用时不想输入所有参数
-28-
15.11 Function Overloading函数重载

函数重载



同名的函数但具有不同的形参,被称为函数重载
编译器通过函数的签名(函数名、形参类型)来区分
示例

sum函数完成四个数相加的功能 int sum(a,b,c,d); 如果
该函数的定义满足不了新的需求,需要考虑其他的参数
列表和返回值,且函数体有可能不同
-29-
15.12 Function Templates函数模板

函数模板


函数重载的特例,对不同类型的形参操作都相同时可以采用函数
模板
示例

sum函数完成四个数相加的功能 int sum(a,b,c,d); 如果该函数的定
义满足不了新的需求,但只是形式参数类型不同,参数的个数和
函数体都相同
-30-
谢谢!
刘威 副教授
互联网技术与工程研究中心
华中科技大学电子与信息工程系
电话:13986224922
Email: liuwei@hust.edu.cn
网址:http://itec.hust.edu.cn
Download