C++函数引述传递与值传递的区别,求赐教
C++函数引用传递与值传递的区别,求赐教
1.假设有函数void f(int a)和函数void f(const int& a)
是不是后者的写法更好?因为后者避免了分配内存?
2.见程序:
打印出来的结果是:
create:0031F8FB 调用a的构造函数,内存0031F8FB
0031F8FB 打印a的地址0031F8FB
0031F820 打印函数中的b的地址
delete:0031F820 对b析构
这里我很疑惑的是,既然为b分配了内存空间,函数返回时,也调用了b的析构函数
为何没有调用b的构造函数?
请各位朋友指教下小弟。
另外关于这方面指针,数组和内存方面的知识,我可以从哪里获取到相关知识,或者可以推荐两本书给我,
谢谢大家
------解决方案--------------------
1.假设有函数void f(int a)和函数void f(const int& a)
是不是后者的写法更好?因为后者避免了分配内存?
>> 两者的主要区别:
>> a. void f(int a)传递到函数内部的,是a的一份拷贝,void f(const int& a)传递到函数内部的是a的本身
>> b. 由于a所提及的原因,前者会产生一个拷贝,如果(实参)对象比较大的时候,肯定会对内存空间有所要求
>> c. 由于a、b所提及的原因,后者的效率要比前者高
>> 注意:除了引用传递,其它任何方式都会产生拷贝(包括传递指针)
2. 这里我很疑惑的是,既然为b分配了内存空间,函数返回时,也调用了b的析构函数为何没有调用b的构造函数?
>> 上面已经说了:除了引用传递,其它任何方式都会产生拷贝。f(A b)显然不是用引用进行传递的,所以会产
>> 生b的一份拷贝,要产生这个拷贝,就会调用A类的拷贝构造函数,在A中楼主并没有提供拷贝构造函数,但编
>> 译器会自动为你提供一个滴。所以在地址0031F820上的对象是,传入的实参b的一份拷贝,它是有A类的缺省
>> 拷贝构造函数创建的。参考下面的代码:
1.假设有函数void f(int a)和函数void f(const int& a)
是不是后者的写法更好?因为后者避免了分配内存?
2.见程序:
- C/C++ code
class A{ public: A(){cout<<"create:"<<this<<endl;}; ~A(){cout<<"remove:"<<this<<endl;}; }; void f(A b){ cout<<&b<<endl; }; int main() { A a ; cout<<&a<<endl; f(a); system("pause"); };
打印出来的结果是:
create:0031F8FB 调用a的构造函数,内存0031F8FB
0031F8FB 打印a的地址0031F8FB
0031F820 打印函数中的b的地址
delete:0031F820 对b析构
这里我很疑惑的是,既然为b分配了内存空间,函数返回时,也调用了b的析构函数
为何没有调用b的构造函数?
请各位朋友指教下小弟。
另外关于这方面指针,数组和内存方面的知识,我可以从哪里获取到相关知识,或者可以推荐两本书给我,
谢谢大家
------解决方案--------------------
1.假设有函数void f(int a)和函数void f(const int& a)
是不是后者的写法更好?因为后者避免了分配内存?
>> 两者的主要区别:
>> a. void f(int a)传递到函数内部的,是a的一份拷贝,void f(const int& a)传递到函数内部的是a的本身
>> b. 由于a所提及的原因,前者会产生一个拷贝,如果(实参)对象比较大的时候,肯定会对内存空间有所要求
>> c. 由于a、b所提及的原因,后者的效率要比前者高
>> 注意:除了引用传递,其它任何方式都会产生拷贝(包括传递指针)
2. 这里我很疑惑的是,既然为b分配了内存空间,函数返回时,也调用了b的析构函数为何没有调用b的构造函数?
>> 上面已经说了:除了引用传递,其它任何方式都会产生拷贝。f(A b)显然不是用引用进行传递的,所以会产
>> 生b的一份拷贝,要产生这个拷贝,就会调用A类的拷贝构造函数,在A中楼主并没有提供拷贝构造函数,但编
>> 译器会自动为你提供一个滴。所以在地址0031F820上的对象是,传入的实参b的一份拷贝,它是有A类的缺省
>> 拷贝构造函数创建的。参考下面的代码:
- C/C++ code
#include <iostream> using namespace std; class A{ public: A(){cout<<"create:"<<this<<endl;} A(const A& a) // 自己增加一个拷贝构造函数,及可以清楚地看到,拷贝构造函数被调用了 { cout << "copy constructor" << endl; } ~A(){cout<<"remove:"<<this<<endl;} }; void f(A b){ cout<<&b<<endl; }; int main() { A a ; cout<<&a<<endl; f(a); system("pause"); };