建议
当函数的形式参数是类的对象时,如果在函数内部不需要改变形式参数的状态,需要把形式参数声明为常引用的形式,例如Child fcn(const Child&),目的是为了避免拷贝构造函数的调用,以及错误的修改实参的状态。
不要通过函数返回局部对象的引用或者指针,例如Child& fcn(const Child& child) { Child local; return local; }。因为函数内部的局部对象会在函数调用完成以后被析构,因此返回的引用或者指针指向的是已经被销毁的对象空间
#include <iostream>
using namespace std;class MyClass{
int val;
public:
MyClass(int i){ val=i; }
int getval(){ return val; }
void setval(int i){ val=i; }
};
void display(MyClass ob){ cout<<ob.getval()<<endl; }
void change1(MyClass ob){ ob.setval(50); }
void change2(MyClass & ob){ ob.setval(50); }
void change3(MyClass * ob){ ob->setval(100); }
void main(){
MyClass a(10);
cout<<"Value of a before calling change -----";
display(a);
change1(a);
cout<<"Value of a after calling change1()-----";
display(a);
change2(a);
cout<<"Value of a after calling change2()-----";
display(a);
change3(&a);
cout<<"Value of a after calling change3()-----";
display(a);
}
在加入构造和析构函数后:
#include <iostream>
using namespace std;
class MyClass{
int val;
public:
MyClass(int i){ val=i; cout<<"construct"<<val<<endl;}
~MyClass(){cout<<"destruct"<<val<<endl;}
int getval(){ return val; }
void setval(int i){ val=i; }
};
void display(MyClass ob){ cout<<ob.getval()<<endl; }
void change1(MyClass ob){ ob.setval(50); }
void change2(MyClass & ob){ ob.setval(50); }
void change3(MyClass * ob){ ob->setval(100); }
void main(){
MyClass a(10);
cout<<"Value of a before calling change -----";
display(a);
change1(a);
cout<<"Value of a after calling change1()-----";
display(a);
change2(a);
cout<<"Value of a after calling change2()-----";
display(a);
change3(&a);
cout<<"Value of a after calling change3()-----";
display(a);
}
在向函数传递类对象的时候,拷贝类对象时未进行构造函数,离开函数时却进行了析构函数!