浅析类的 默认构造函数, 拷贝构造函数, 赋值拷贝函数“=”

每一个类只有一个析构函数,但可以有多个构造函数(包含一个默认构造函数,一个拷贝构造函数,和其他普通构造函数)和多个赋值函数(包含一个拷贝赋值函数,其他的为普通赋值函数)。一般情况下,对于任意一个类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;
}

结果图

 

原文地址:https://www.cnblogs.com/johnnyflute/p/3658272.html