C++引用与指针的比较
引用是C++中的概念,初学者容易把引用和指针混淆一起。
一下程序中,n是m的一个引用(reference),m是被引用物(referent)。
int m;
int &n = m;
n相当于m的别名(绰号),对n的任何操作就是对m的操作。
所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。
l 引用的规则:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象),这里指不能再绑定其他的对象,只要不是const,就可以改变值,即可以通过引用改变绑定对象的值,因为它们其实是相同的。
以下示例程序中,k被初始化为i的引用。语句k = j并不能将k修改成为j的引用,只是把k的值改变成为6。由于k是i的引用,所以i的值也变成了6。
int i = 5;
int j = 6;
int &k = i;
k = j; // k和i的值都变成了6;
引用的主要功能是传递函数的参数和返回值。
内联函数是代码被插入到调用者代码处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。
内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在 需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏 的一些问题。
#include <iostream>
using namespace std;
void swap(int &i, int &j){
i^=j;
j=i^j;
i=i^j;
cout<<"the call function: "<<i<<"\t"<<j<<endl;
}
void print( const int &l){//如果形参是const,实参both。如果实参const,说明实参不能被改动,则形参必须const。
cout<<"l= "<<l<<endl;
}
void main(){
int i=3,j=5;
swap(i,j);
const int k=6;//定义的同时必须初始化,const int k;k=6;报错
int &m=i;//引用定义的同时必须初始化,而且要关联到某一类型。int &m=3报错
double b=3.0;
double &a=b;
//cout<<sizeof(a)<<endl;//引用的sizeof指向其绑定的对象的大小
char *r;
//cout<<sizeof(r)<<endl;//指针都是4个字节
float array[12];
cout<<sizeof(array)<<endl;//数组的sizeof就是本身类型占用字节数*个数
//error :&m=j;引用一旦初始化后不可再绑定其他对象
double n=1.2;
const int &t=n;//const类型的引用可以绑定到其他类型,而非const类型的引用不可以。。。
// print(k);
// cout<<"the main function: "<<i<<"\t"<<j<<endl;
// cout<<"k= "<<k<<endl;
}
//总结:一般变量想被外部文件使用,直接在引用的地方加上extern就ok了。const变量不行,如果想外部引用,初始化的地方加extern,引用的地方也要加
本节主要讲函数调用及参数传递的一些问题。
首先说参数调用,参数调用做了2件事情,用对应的实参初始化函数的形参,并将控制权转移给被调用函数,主调函数的执行被挂起,被调函数开始执行。函数的运行以形参的隐式定义和初始化开始。执行到return的时候,被调函数完成,主调函数在调用处开始恢复执行,并将函数的返回值用作求解调用操作符的结果,继续处理在执行调用的语句中的剩余工作。
参数传递
第一种传递方式:值传递
值传递需要复制对应的实参实现初始化,当用实参副本初始化形参时,函数并没有访问调用函数所传递的实参本身,对实参副本的修改也是局部的,函数调用结束就结束了,因此不会修改实参的值。
引用传递:
因为复制实参并不是在所有的情况下都适合,不适合复制实参的情况包括:
当需要在函数中修改实参的值时;
当需要以大型对象作为实参传递时,对实际的应用而言,复制对象所付出的时间和存储空间代价往往过大
当没有办法实现对象的复制时
引用形参直接关联到绑定的对象而非对象的副本,必须使用与该引用绑定的对象初始化该引用。引用形参完全以相同的模式工作。在c语言中,人们习惯用指针,在c++中使用引用。
使用引用形参返回额外的信息。这个跟上面有些类似,只不过说如果你想要多返回些东西,但是直接又没法返回,那么就借助引用好了,通过引用改变改变实参的值。
利用const引用避免复制。这个主要是大型对象的时候,复制代价比较高。比如string。。。
很多时候如果不需要改变值,就加上const。
double fl=1.2;
const double *pl=&fl;//这个是正确的,赋值初始化
*pl=4.3;//error:因为已经是const类型的了,不允许改变值,不过指针pl还是可以指向其他对象的。
double *cosnt plt;这个时候plt是不能更改的。。。
string.h是c语言对应的标准库,在c++里面对应的是