您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记――引用与拷贝构造函数

2009-03-31 10:18 357 查看
1、引用和指针的区别:
引用是别名。必须和具体的对象绑定,在声明的时候初始化,以后不能改变绑定关系;引用不能声明为null类型;
指针是一种变量,它的值为地址,在使用的时候可以改变,也可以赋为null;使用之前必须进行合法性判别。
2、从现有对象生产新的对象时,使用拷贝构造函数。如Class x1,x2=x1;此时x2从现存的x1生成,采用拷贝构造函数。还有就是在传递和返回对象时,使用拷贝构造函数。
函数在返回或传递简单类型变量时,一般采用按值传递,但对于对象或者结构等比较复杂的参数时,编译器调用对象的拷贝构造函数。没有自定义的则编译器使用默认的拷贝构造函数。强制不使用拷贝构造函数传值,则必须将其声明为private。
3、函数调用框架:
函数参数
返回地址
局部变量
调用函数时,编译器首先将参数压栈;然后调用函数,此时必须先将函数返回地址压栈;在函数内部,将函数的局部变量压栈;执行代码;将返回值压栈。
编译器可以根据距离返回地址的偏移值访问返回值和局部变量。返回地址保存在EBP寄存器(基址)中。
对象等数据结构比较复杂,直接在堆栈中返回会产生“重入”问题,最佳的方法是将返回值的地址压栈,函数直接将返回值信息拷贝到目的地。
4、Class X;
X f(X param)
{return param};//这种情况下要调用两次拷贝构造函数。
首先,将param对象作为参数传递时,要按值传递,调用拷贝构造函数。
然后,将param 对象作为返回值传递时,调用拷贝构造函数,按值返回对象
【临时对象】,执行语句f();时,f的返回值会先产生一个临时对象,保存在内存某一个地址中,而且临时对象是常量,试图改变它的行为是非法的。如,将其作为左值赋值的行为是错误的。
5、函数指针判定:按照“右左右……”的判断顺序进行判定。比如
float (*(*fp2)(int))[10];
从中间的fp2开始,
向右“)”,返回;
向左“*”,fp2是一个指针;
向右“(int)”,函数参数列表,fp2是一个函数指针,返回什么?
向左,“*”,返回值是一个指针,指向什么?
向右,“[10]”,长度为10数组,指针指向长度为10的数组,什么类型的数组?;
向左,“float”,数组是float类型的。
总结 fp2是一个函数指针,参数为Int类型,返回指向float类型数组的指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: