情况1:
#include <bits/stdc++.h>
using namespace std;
class stu{
private:
int num;
public:
stu(int a):num(a){}
stu(const stu& a){
cout<<"复制函数被调用"<<endl;
}
~stu(){
cout<<"析构被调用"<<endl;
}
};
stu fun(stu x){
stu b(1);
return x;
}
int main(){
stu a1(1);
fun(a1);
return 0;
}
/*输出:
复制函数被调用
复制函数被调用
析构被调用
析构被调用
析构被调用
析构被调用
上面fun()中: a1通过复制函数初始化形参x; return x;返回给一个临时对象调用复制;
形参消亡前调用析构; 局部变量b消亡调用析构; 临时对象消亡调用析构; main()a1消亡调用析构;
没毛病.但是以下:
#include <bits/stdc++.h>
using namespace std;
class stu{
private:
int num;
public:
stu(int a):num(a){}
stu(const stu& a){
cout<<"复制函数被调用"<<endl;
}
~stu(){
cout<<"析构被调用"<<endl;
}
};
stu fun(stu x){
stu b(1);
return b; 仅仅改变了返回值///
}
int main(){
stu a1(1);
fun(a1);
return 0;
}
/*输出:
复制函数被调用
析构被调用
析构被调用
析构被调用
却少了一次调用复制和析构.
情况2同上:
#include <bits/stdc++.h>
using namespace std;
class stu{
private:
int num;
public:
stu(int a):num(a){}
stu(const stu& a1){
num=a1.num;
cout<<"复构被调用"<<endl;
}
~stu(){
cout<<"析构函数被调用"<<endl;
}
};
stu fun(){
stu b1(1);
return b1;
};
int main(){
stu a1(1);
fun();
return 0;
}
/*输出:
析构函数被调用
析构函数被调用
按 "函数作为返回值时 在调用该函数时会调用复制构造函数对返回值(临时)对象进行初始化" 来说,假设令fun()函数会返回临时对象c,c通过调用类的复制构造函数进行初始化,即b1为该函数实参传递给c,此时应该输出"复构被调用",(但是没有),并且该函数结束调用应调用析构函数对临时对象c进行处理,输出"析构函数被调用".fun()函数内有b1局部变量,b1在函数结束后也该调用析构函数进行处理并输出"析构函数被调用",最后main()中的a1也该输出,三个但是输出了两个?