![]() |
#2
dz7899892012-08-23 20:43
|
问: Exmpl val3=Exmpl();//c++primer p407 先用默认构造函数构造一个临时对象,再用复制函数。对啊,既然是临时对象,那是不是还要调用析构函数?
可由截图知 他只用了默认构造。。。?
只有本站会员才能查看附件,请 登录

#include <iostream>
#include<string>
#include <vector>
#include"Exmpl.h"
using namespace std;
void fun1(Exmpl a)
{}
void fun2(Exmpl &b)
{}
Exmpl fun3()
{
Exmpl obj;
return obj;//复制函数
}
int main(){
cout<<" Exmpl val1;//用默认构造函数"<<endl;
Exmpl val1;//用默认构造函数
cout<<" Exmpl val3=Exmpl();//默认构造函数,复制"<<endl;
Exmpl val3=Exmpl();//c++primer p407 默认构造函数构造了一个临时对象,然后复制构造函数用该对象初始化 默认构造,复制构造
cout<<" Exmpl val2=val1;//复制函数"<<endl;
Exmpl val2=val1;//复制函数
cout<<" fun1(val1);//复制函数 void fun1(Exmpl a)"<<endl;
fun1(val1);//复制函数
cout<<" fun2(val1);//无需复制 void fun2(Exmpl &b)"<<endl;
fun2(val1);//无需复制
cout<<" val1.input(cin);"<<endl;
val1.input(cin);
cout<<" val2=val1;"<<endl;
val2=val1;
cout<<" fun3(); Exmpl fun3() Exmpl obj; return obj;//复制函数}"<<endl;
fun3();
cout<<" Exmpl *p=new Exmpl;//默认构造函数创造动态的。。。"<<endl;
Exmpl *p=new Exmpl;//默认构造函数创造动态的。。。
cout<<" vector<Exmpl> vec(3);//默认构造函数创建一个临时对象,在复制构造函数复制到vector的各个元素然后析构函数删除临时对象 "<<endl;
vector<Exmpl> vec(3);//默认构造函数创建一个临时对象,在复制构造函数复制到vector的各个元素然后析构函数删除临时对象
cout<<" delete p;"<<endl;
delete p;
cout<<" return 0;"<<endl;
return 0;
}
struct Exmpl{
//默认 构造函数
Exmpl():ival(0)
{
std::cout<<"Exmpl"<<std::endl;
}
//复制构造函数
Exmpl(const Exmpl& E):ival(E.ival),sval(E.sval)
{
std::cout<<"Exmpl(const Exmpl&)"<<std::endl;
}
//输入的构造
std::istream & input(std::istream& in)
{
std::cout<<"input "<<"enter int and string"<<std::endl;
in>>ival>>sval;
return in;
}
//赋值操作符
Exmpl& operator =(const Exmpl &eq)
{
std::cout<<"operator ="<<std::endl;
ival=eq.ival;
sval=eq.sval;
return *this;
}
//析构函数
~Exmpl()
{
std::cout<<"~Exmpl()"<<std::endl;
}
int ival;
std::string sval;
};
谢谢 #include<string>
#include <vector>
#include"Exmpl.h"
using namespace std;
void fun1(Exmpl a)
{}
void fun2(Exmpl &b)
{}
Exmpl fun3()
{
Exmpl obj;
return obj;//复制函数
}
int main(){
cout<<" Exmpl val1;//用默认构造函数"<<endl;
Exmpl val1;//用默认构造函数
cout<<" Exmpl val3=Exmpl();//默认构造函数,复制"<<endl;
Exmpl val3=Exmpl();//c++primer p407 默认构造函数构造了一个临时对象,然后复制构造函数用该对象初始化 默认构造,复制构造
cout<<" Exmpl val2=val1;//复制函数"<<endl;
Exmpl val2=val1;//复制函数
cout<<" fun1(val1);//复制函数 void fun1(Exmpl a)"<<endl;
fun1(val1);//复制函数
cout<<" fun2(val1);//无需复制 void fun2(Exmpl &b)"<<endl;
fun2(val1);//无需复制
cout<<" val1.input(cin);"<<endl;
val1.input(cin);
cout<<" val2=val1;"<<endl;
val2=val1;
cout<<" fun3(); Exmpl fun3() Exmpl obj; return obj;//复制函数}"<<endl;
fun3();
cout<<" Exmpl *p=new Exmpl;//默认构造函数创造动态的。。。"<<endl;
Exmpl *p=new Exmpl;//默认构造函数创造动态的。。。
cout<<" vector<Exmpl> vec(3);//默认构造函数创建一个临时对象,在复制构造函数复制到vector的各个元素然后析构函数删除临时对象 "<<endl;
vector<Exmpl> vec(3);//默认构造函数创建一个临时对象,在复制构造函数复制到vector的各个元素然后析构函数删除临时对象
cout<<" delete p;"<<endl;
delete p;
cout<<" return 0;"<<endl;
return 0;
}
struct Exmpl{
//默认 构造函数
Exmpl():ival(0)
{
std::cout<<"Exmpl"<<std::endl;
}
//复制构造函数
Exmpl(const Exmpl& E):ival(E.ival),sval(E.sval)
{
std::cout<<"Exmpl(const Exmpl&)"<<std::endl;
}
//输入的构造
std::istream & input(std::istream& in)
{
std::cout<<"input "<<"enter int and string"<<std::endl;
in>>ival>>sval;
return in;
}
//赋值操作符
Exmpl& operator =(const Exmpl &eq)
{
std::cout<<"operator ="<<std::endl;
ival=eq.ival;
sval=eq.sval;
return *this;
}
//析构函数
~Exmpl()
{
std::cout<<"~Exmpl()"<<std::endl;
}
int ival;
std::string sval;
};