zoukankan      html  css  js  c++  java
  • 浅析类的 默认构造函数, 拷贝构造函数, 赋值拷贝函数“=”

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

    结果图

     

  • 相关阅读:
    MQTT学习笔记——Yeelink MQTT维修 采用mqtt.js和paho-mqtt
    ubuntu 14.04设备OVS虚拟OpenFlow交换机配置汇总
    于iOS跳转到应用程序AppStore
    C++学习笔记33 转换操作符
    Win32 Windows规划 三
    [2014 Regional]牡丹江 H Hierarchical Notation 做题记录
    序言树,为了,序后,(递归)
    Visual Studio Code尝试体验
    2015第40周二Node学习
    2015第40周一Node学习
  • 原文地址:https://www.cnblogs.com/johnnyflute/p/3658272.html
Copyright © 2011-2022 走看看