函数参数 |
返回地址 |
局部变量 |
C++学习笔记——引用与拷贝构造函数
原创
©著作权归作者所有:来自51CTO博客作者whithin的原创作品,请联系作者获取转载授权,否则将追究法律责任
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类型数组的指针。
上一篇:C++学习笔记——名字控制
下一篇:网络管理导论笔记
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
C++的拷贝构造和运算符重载
C++的拷贝构造和运算符重载
拷贝构造函数 运算符重载 -
拷贝构造函数剖析【C++】
C++拷贝构造函数知识点:解释:拷贝构造函数是一种特殊的构造函数
类 c++ class 面向对象编程 程序设计