目录
1 引用的概念
1-0 基本概念
- 定义引用时一定要初始化为某个变量
- 引用只能引用变量不能引用表达式,常量
1-1 变量的引用
int a = 0;
int &r = a; //变量r的类型为int &
- 相当于变量a多了一个别名r,对r的任何操作等同与对a的任何操作
1-2 函数返回值的引用
#include <iostream>
using namespace std;
int n = 4;
//函数体setvalue()实现对返回值n的引用
int & setvalue(){ return n; }
int main()
{
setvalue() = 40; // 直接对返回值进行修改
cout << n << endl; // 40
return 0;
}
- 函数的返回值所引用的返回值不能是局部变量,局部变量在函数体执行会被释放。
1-3 常引用
要求:无法通过常引用修改变量值
#include <bits/stdc++.h>
#define DEBUG
using namespace std;
int main()
{
int n = 100;
const int & r = n;
n = 1000;
r = 1000;
return 0;
}
/*
[Error] assignment of read-only reference 'r'
*/
1-4 常引用与非常引用的转换
1. const T & 与 T & 是不同的类型(常引用与非常引用属于不同的类型)。
2. 常引用可以被普通引用以及普通类型变量初始化。
3. 常量以及常引用无法初始化引用。
1-5 const关键字的使用
/*
1. 定义常量指针,无法通过常量指针修改内容
2. 函数参数为常量指针时,可避免函数内部不小心改变 参数指针所指地方的内容。
3. 定义为const的对象的所有数据成员的值都不能被修改。凡出现调用非const的成员函数,将出现编译错误。但构造函数除外。因为如果调用非const函数无法保证对象不被修改。与const的规则的相违背。
*/
const int * p = & n; //定义常量指针
const int & r = n; //定义常引用
概念辨析:
常引用所引用的变量,其值不能被修改(错误,可以通过引用的对象修改原有的变量)
不能通过常量指针,去修改其指向的变量(正确)
常量指针一旦指向某个变量,就不能再指向其他变量(错误)
2 内存的分配
2-1 new与delete的使用
P = new T;
delete 指针;
------------------------------------------------------------------------------
int * pn;
pn = new int;
* pn = 5;
- T是任意类型名, P是类型为T * 的指针。 动态分配出一片大小为 sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P.
P = new T[N];
delete [ ] 指针;
- T :任意类型名,P :类型为T * 的指针,N :要分配的数组元素的个数,可以是整型表达式
- 动态分配出一片大小为 sizeof(T)*N字节的内存空间,并且将该内存空间的起始地址赋值给P。
2-2 指针使用注意点
-----------------------------------
char * p = new int;
p = 'a'; // 错误,字符类型赋值给指针变量
delete p;
----------------------------------
int *p = new int[25];
p[10] = 100; // 错误,越界
delete p;
-----------------------------------
char * p = new char[10]; // 正确
p[0] = 'K';
delete [] p;
3 内联函数与函数重载与函数的缺省参数
3-1 内联函数
/*使用inline关键字定义内联函数*/
inline int Max(int a,int b)
{
if( a > b) return a;
return b;
}
- 函数调用是有时间开销的。如果函数本身只有几条语句,执行非常快,而且函数被反复执行很多次,相比之下调用函数所产生的这个开销就会显得比较大。
- 为了减少函数调用的开销,引入了内联函数机制。编译器处理对内联函数的调用语句时,是将整个函数的代码插入到调用语句处,而不会产生调用函数的语句。
3-2 函数重载
重载函数具有以下特点:
- 函数名相同
- 函数的参数类型与参数个数不同
编译器如何区分重载函数?
- 编译器根据调用语句的中的实参的个数和类型判断应该调用哪个函数
重载的好处:
- 使得函数命名变得简单。
重载的实例:
int Max(double f1,double f2) { } // (1)
int Max(int n1,int n2) { } // (2)
int Max(int n1,int n2,int n3) { } // (3)
Max(3.4,2.5); //调用 (1)
Max(2,4); //调用 (2)
Max(1,2,3); //调用 (3)
Max(3,2.4); //error,没有参数1为int类型,参数2为double的类型的重载函数
注意点:
- 参数的个数、类型、次序都相同,方法名也相同,仅返回值不同,则无法构成重载
3-3 函数的缺省参数
- 函数参数可缺省的目的在于提高程序的可扩充性。
- 如果某个写好的函数要添加新的参数,而原先那些调用该函数的语句,未必需要使用新增的参数,那么为了避免对原先那些函数调用语句的修改,就可以使用缺省参数
实例:
void func( int x1, int x2 = 2, int x3 = 3){ }
func(10 ) ; //等效于 func(10,2,3)
func(10,8) ; //等效于 func(10,8,3)
func(10, , 8) ; //不行,只能最右边的连续若干个参数缺省
概念辨析:
A) 多个重载函数的参数个数必须不同。 (错误,可能时类型不同)
B) 两个函数,参数表相同,返回值类型不同,它们是重载关系。 (错误)
C) 调用一个第二个和第三个参数都有有缺省值的函数时,可以不写第二个实参而写第三个实
参。 (错误,参数时按照顺序匹配的)
D) 使用内联函数的目的是提高程序的运行速度
参考资料
2018年4月7日笔记