c++:(各种)构造函数的调用方式

原创 2017年03月08日 13:07:09

c++的类中有5种值得注意的基本的函数:

  • 无参构造函数
  • 有参构造函数
  • 拷贝构造函数
  • 赋值函数
  • 析构函数

关于析构函数,需要注意的点在上一篇博客里面 c++: 是否会自动delete? 也提到过了,在这里暂时不多说。这篇博客主要记录这3个构造函数、1个赋值函数的调用方式,希望大家学习之后,不但知道如何调用,还可以根据一句话来判断到底调用了几次构造函数。

可以通过一个例子来说明,假如我现在有一个Animal类,其中为了调试,我特意在每个构造函数中加入了输出语句,来看看调用的结果:

struct Animal {
    int age;
    string name;

    Animal() {  // 无参构造函数
        cout << "No-args Constructor" << endl;
        age = -1;
        name = "Unknown";
    }

    Animal(string name, int age) { // 有参构造函数
        cout << "Argumenting Constructor" << endl;
        this->name = name;
        this->age = age;
    }

    Animal(const Animal &other) { // 拷贝构造函数
        cout << "Copy constructor" << endl;
        this->name = other.name;
        this->age = other.age;
    }

    Animal& operator=(const Animal &other) { // 赋值函数
        cout << "Assigning" << endl;
        this->name = other.name;
        this->age = other.age;
    }

    ~Animal() {
        cout << "Destructor" << endl;
    }

    friend ostream& operator<<(ostream &out, const Animal &animal) {
        out << "Animal[" << animal.name << "]: " << "age=" << animal.age;
        return out;
    }
};

然后,以下代码会演示创建一个实例的多种方式,并且我把每一种创建方式的输出结果、以及一些思考,以注释的方式写出来:

int main() {


    //-----------------无参构造函数-----------------------

    Animal animal01; // 虽然不是很明显,但是这里不是使用指针,而是直接操作实例,所以这里实际上调用了无参构造函数。
    cout << animal01 << endl;
    /*
      输出:
        No-args Constructor
        Animal[Unknown]: age=-1
    */


    Animal animal02(); // 这并不能调用无参构造函数!编译器会当作是某个函数的声明,所以下面输出的1也许是函数的地址(暂时没有深究)。
    cout << animal02 << endl;
    /*
      输出:
        1
    */


    Animal animal03 = Animal();
    // 注意,这里可能有人会认为:等号右边调用了默认构造函数,然后因为赋值给左边所以又调用了一次拷贝构造函数,就会认为这样子会白白浪费掉一个实例。
    // 实际上,根据输出可以看到,结果并不是上述那样,而是这个语句整体上只调用了一次无参构造函数。即与“Animal animal03;”效果一样。
    cout << animal03 << endl;
    /*
      输出:
        No-args Constructor
        Animal[Unknown]: age=-1
    */

    //----------------------------------------------




    //-----------------有参构造函数-----------------------  

    Animal animal001("Lion", 1);
    cout << animal001 << endl;
    /*
      输出:
        Argumenting Constructor
        Animal[Lion]: age=1
    */


    Animal animal002 = Animal("Lion", 1);
    // 这里同上面所说的,整体上仅仅调用了一次有参构造函数。
    cout << animal002 << endl;
    /*
      输出:
        Argumenting Constructor
        Animal[Lion]: age=1
    */

    //----------------------------------------------




    //----------------拷贝构造函数-------------------  

    Animal animal0001 = animal001;
    // 这里要区分“拷贝构造函数”和“赋值函数”的调用时机。前者是声明和赋值在同一行,后者不是。所以这里属于拷贝构造函数。
    cout << animal0001 << endl;
    /*
      输出:
        Copy constructor
        Animal[Lion]: age=1
    */  

    //-------------------------------------------




    //------------------赋值函数------------------------  

    Animal animal;
    animal = animal0001;
    // 因为这里animal的声明和赋值不在同一行,所以编译器会认为不是拷贝构造,而是一般的赋值语句。
    cout << animal << endl;
    /*
      输出:
        No-args Constructor
        Assigning
        Animal[Lion]: age=1
    */  

    //-----------------------------------

    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

C++各种构造函数的写法

构造函数 ,是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数...
  • baiyq369
  • baiyq369
  • 2017年02月08日 15:01
  • 1585

浅谈C++中的几种构造函数

3月中旬参加宣讲会,做了X软公司的C++笔试题,里面有一道“默认拷贝构造函数的题”,由于好久没复习C++基础知识,当时连基本的概念都想不来了了。于是乎,开始拿起以前看的谭浩强C++复习起来,现在书快要...
  • zxc024000
  • zxc024000
  • 2016年04月14日 17:56
  • 9161

c++类的构造函数详解

http://ticktick.blog.51cto.com/823160/194307         c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中...
  • tiantang46800
  • tiantang46800
  • 2011年11月05日 16:30
  • 78445

C++中的显式构造函数

    有如下一个简单的复数类:class ClxComplex{public:    ClxComplex(double dReal = 0.0, double dImage = 0.0) { m_...
  • starlee
  • starlee
  • 2006年10月12日 09:26
  • 8815

C++的构造函数

构造函数用来初始化 和开辟空间
  • u010056396
  • u010056396
  • 2014年05月22日 21:57
  • 1279

c++构造函数详解及显式调用构造函数

1>构造函数是干什么的class Counter { public: Counter() {// 特点:以类名作为函数名,无返回类型 m_value = 0; } private: int...
  • lihualong0328
  • lihualong0328
  • 2017年01月23日 10:45
  • 1352

C++构造函数和析构函数的总结

C++是面向对象的编程语言,在定义类的时候,离不开构造和析构函数。类中同类同名的成员函数称为构造函数,主函数中初始化一个对象时,如果有传入数据,其实是传入到构造函数的形参中。...
  • ladybai
  • ladybai
  • 2016年03月10日 14:51
  • 3163

C++中构造函数的作用

构造函数用于解决类中的对象初始化的问题 构造函数是一类特殊的函数,与其他的成员函数不同的是构造函数构造函数不需要用户来调用它,而是建立对象的时候自动的执行#include //#include "...
  • andrewgithub
  • andrewgithub
  • 2017年03月02日 15:30
  • 1905

c++构造函数之四种默认构造方式

c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初...
  • qq_28337005
  • qq_28337005
  • 2016年06月26日 17:33
  • 3454

C++构造函数中用参数列表初始化成员

C++构造函数中初始化成员参数列表初始化成员(必须用的原因:对象成员的初始化,const修饰的成员的初始化,引用成员的初始化,子类调用父类的构造函数初始化父类成员)参数列表在构造函数执行之前执行,参数...
  • zx3517288
  • zx3517288
  • 2015年09月29日 14:57
  • 6813
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++:(各种)构造函数的调用方式
举报原因:
原因补充:

(最多只允许输入30个字)