对象的生成方式
拷贝构造函数:用一个已经存在的对象去初始化另一个对象时,用到拷贝构造函数。
如:class A{...};
A a1;
A a2=a1;//这里就用到拷贝构造函数
另外:在传入参数和return返回时,以传值方式传递,需要调用拷贝构造函数。
需要注意的两种情况:
(1)
A a1;
A a2;
a2=a1;
并没有用拷贝构造函数,而是赋值函数。因为不是“初始化”
(2)
#include <iostream>
using namespace std;
class A
{
private:
int i;
public:
A()
{
i=0;
cout<<"无参数的构造函数"<<endl;
}
A(int x):i(x)
{
cout<<"构造函数"<<endl;
}
~A()
{
cout<<"析构函数"<<endl;
}
A(const A& a)
{
i=a.i;
cout<<"拷贝构造函数"<<endl;
}
A& operator=(const A&a)
{
i=a.i;
cout<<"赋值函数"<<endl;
return *this;
}
};
void main()
{
A a1(1);
A a2=A(1);//相当于A a2(1);
}
输出为:
构造函数
构造函数
析构函数
析构函数
之所以没有调用拷贝构造函数,是因为A a2=A(1);中,A(1)是一个临时对象,不是已经存在的对象,因此直接调用构造函数,而并没有生成一个无名对象。相当于A a2(1);
如果函数返回的是无名对象,则根据主调函数的接收情况,出现两种情形:
1、主调函数正好要利用函数的返回值构造一个新的有名对象,这时没有必要再被调函数中产生临时对象,而是直接在被调函数返回之前构造出主调函数中的那个接收对象即可。
#include <iostream>
using namespace std;
class A
{
private:
int i;
public:
A()
{
i=0;
cout<<"无参数的构造函数"<<endl;
}
A(int x):i(x)
{
cout<<"构造函数"<<endl;
}
~A()
{
cout<<"析构函数"<<endl;
}
A(const A& a)
{
i=a.i;
cout<<"拷贝构造函数"<<endl;
}
A& operator=(const A&a)
{
i=a.i;
cout<<"赋值函数"<<endl;
return *this;
}
};
A get()
{
return A(99);
}
void main()
{
A a1=get();
}
输出:
构造函数
析构函数
2、不是用来构造一个新的有名对象
#include <iostream>
using namespace std;
class A
{
private:
int i;
public:
A()
{
i=0;
cout<<"无参数的构造函数"<<endl;
}
A(int x):i(x)
{
cout<<"构造函数"<<endl;
}
~A()
{
cout<<"析构函数"<<endl;
}
A(const A& a)
{
i=a.i;
cout<<"拷贝构造函数"<<endl;
}
A& operator=(const A&a)
{
i=a.i;
cout<<"赋值函数"<<endl;
return *this;
}
};
A get()
{
return A(99);
}
void main()
{
A a1(1);
a1=get();
}
输出:
构造函数
构造函数
赋值函数
析构函数
析构函数