浅析类的 默认构造函数, 拷贝构造函数, 赋值拷贝函数“=”
每一个类只有一个析构函数,但可以有多个构造函数(包含一个默认构造函数,一个拷贝构造函数,和其他普通构造函数)和多个赋值函数(包含一个拷贝赋值函数,其他的为普通赋值函数)。一般情况下,对于任意一个类A,如果程序员不显示的声明和定义上述函数,C++编译器将会自动的为A产生4个public inline 的默认函数,这4个函数最常见的形式为:
A() //默认构造函数
A(const A&) //默认拷贝构造函数
~A() //默认析构函数
A& operator = (const A &) //默认赋值函数。
下面让我们使用程序来验证这4个函数的存在。
#include <iostream>
using namespace std;
class A
{
};
int main()
{
A a;
cout << "OK! 存在默认无参数的构造函数" << endl;
A b(a);
cout << "OK! 存在默认拷贝构造函数" << endl;
b=a;
cout << "OK! 存在默认的拷贝赋值函数" << endl;
return 0;
}
通过VC编译成功,并且能成功运行,故说明,一个类中存在默认的无参数的构造函数,默认的拷贝构造函数,还有默认的赋值函数。
所以我们应该行使我们自己的权利,将这些函数按照我们自己的想法,将其改写!
下面我想讲讲这些函数在构造对象时,是如何进行调用的?
同样使用一个例子来介绍。
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "A::A()!" << endl;
};
A(const A &a)
{
cout << "A::A(const A &a)!" << endl;
}
A& operator=(const A &a)
{
cout << "A::A& operator=(const A &a)!" << endl;
return *this;
}
};
int main()
{
cout << "调用无参数构造函数" << endl;
A a1;
cout << endl;
cout << "调用拷贝构造函数" << endl;
A a2(a1);
cout << endl;
cout << "调用拷贝构造函数" << endl;
A a3=a1;
cout << endl;
cout << "调用拷贝赋值函数" << endl;
a2=a1;
cout << endl;
return 0;
}
通过这个例子,我们可以知道,创建一个对象,有三种方式,
1、直接定义,例如A a1;
2、通过其他对象,进行拷贝定义,例如A a2(a1);
3、使用“=”进行赋值定义,例如A a3=a1;
那么着三种方式的调用的函数时不同的
第一种方式,调用普通的构造函数,来初始化对象。
第二种方式,调用拷贝构造函数,来初始化对象。
第三种方式,同样是调用拷贝构造函数,来初始化对象。
注意 第二种方式和第三种方式 调用了相同的函数,尤其是第三种方式,并没有调用拷贝赋值函数。
程序运行截图
假如 我们在class A类中添加一个函数, bool hasAcceptableQuality(A a),那么在调用它时,我们使用a3.hasAcceptableQuality(a1)
在这个函数中,我们使用的是值传递的方式,故在调用此函数时,实参a1将通过拷贝构造函数,来将值传递给形参a;所以当我们在使用对象作为参数时,
一定要尽量使用引用传递,或者指针传递,这样可以效率更高!
下面是程序实例
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "A::A()!" << endl;
};
A(const A &a)
{
cout << "A::A(const A &a)!" << endl;
}
A& operator=(const A &a)
{
cout << "A::A& operator=(const A &a)!" << endl;
return *this;
}
bool hasAcceptableQuality(A a)
{
cout << "hasAcceptalbeQuality!" << endl;
return true;
}
};
int main()
{
cout << "调用无参数构造函数" << endl;
A a1;
cout << endl;
cout << "调用拷贝构造函数" << endl;
A a2(a1);
cout << endl;
cout << "调用拷贝赋值函数" << endl;
a2=a1;
cout << endl;
cout << "调用拷贝构造函数" << endl;
A a3=a1;
cout << endl;
a3.hasAcceptableQuality(a1);
return 0;
}
结果图