引用
定义一个引用,并将其初始化为引用某个变量:
int n = 4;
int &r = n;
某个变量的引用,等价于这个变量,相当于该变量的一个别名。改变n或r,r或n同步改变。
定义引用时一定要初始化成某个变量。
初始化后,它就一直引用某个变量,不会再引用其他变量。
引用只能引用变量。
交换两个变量的值:
void swap(int &a, int &b)
{
int temp;
temp=a;a=b;b=temp;
}
int n1,n2;
swap(n1,n2);
引用作为函数的返回值:
int n=4;
int & SetValue() { return n; }
int main()
{
SetValue() = 40;
cout<<n;
return 0;
}
改变了全局变量n的值。
常引用:定义引用时,前命加const关键字。
int n;
const int &r = n;
r的类型是const int &。不能通过常用去修改所引用的内容。
const关键字
1).定义常量
const int max_val = 23;
const double pi = 3.14;
const char *sn = "pu";
2).定义常量指针
不可以通过常量指针修改其指向的内容,常量指针的指向可以改变。
int n,m;
const int *p = &n;
*p = 5; // 编译出错
n = 4; // ok
p = &m; // ok
不能把常量指针赋值给非常量指针。
const int *p1; int *p2;
p1 = p2; // ok
p2 = p1; // error
p2 = (int*)p1; // ok 强制类型转换
函数参数为常量指针,可避免函数内部不小心改变参数指针所指地方的内容。
void MyPrintf(const char *p)
{
strcpy(p, "this"); // error
printf("%s", p); // ok
}
3).定义常引用
不能通过常引用修改变量的值。
动态内存分配
用new运算符实现动态内存分配
1).分配一个变量
P = new T;
// T是任意类型名,P是类型为T *的指针。
2).分配一个数组
P = new T[N];
// 动态分配出一片大小为N * sizeof(T)字节的内存空间。
用new动态分配的内存空间,一定要用delete运算符进行释放。
delete指针:该指针必须指向new出来的空间。
int *p = new int;
*p = 5;
delete p;
delete p; // 异常,一片空间不能被delete多次
delete [ ]指针:该指针必须指向new出来的数组。
int *p = new int[20];
p[0] = 1;
delete []p;
内联函数
编译器处理对内联函数的调用语句时,是将整个函数的代码插入到调用语句处,而不会产生调用函数的语句。
inline int Max(int a, int b)
{
if(a>b) return a;
return b;
}
函数重载
一个或多个函数,名字相同,而参数个数或参数类型不同。
int Max(double f1, double f2) {}
int Max(int n1, int n2) {}
int Max(int n1, int n2, int n3) {}
编译器根据调用语句中的实参的个数和类型判断应该调用哪个函数。
函数的缺省参数
c++中,定义函数的时候可以让最右边的连续若干个参数有缺省值,那么调用函数的时候,若相应位置不写参数,参数就是缺省值。
void func(int x1, int x2=2, int x3=3) {}
func(10 );
func(10