我们平时编写代码都是使用的集成开发工具,很多时候都忽略了c++中隐藏的成员函数。具体来说,c++编译器会自动提供一下几个基本函数:
●默认构造函数,如果没有定义构造函数
●复制构造函数,如果没有定义
●析构函数,如果没有定义
●赋值操作符,如果没有定义
●地址操作符
class Stack { private: char *str; public: Stack(); //默认构造函数 ~Stack();//析构函数 Stack (const Stack &); //复制构造函数 Stack (char *str ) // 构造函数 Stack & Stack::operator=(const Stack &); //赋值操作符 Stack & operator =(const Stack &); //地址操作符 void Add() // 成员函数 }; |
刚开始学习c++的时候见的比较多的也就默认构造函数和析构函数了,其他的几个很少用到,甚至在代码中没有见到过,今天在这里梳理一下。
1、默认构造函数。如果没有提供任何构造函数,c++将创建一个没有任何参数和行为的默认构造函数。如果定义了构造函数,c++将不会定义默认构造函数。如果希望在创建对象时显式地对它进行初始化,或需要创建对象数组时,则必须显式地定义默认构造函数。这里需要说明一下,在创建对象数组时,这个类必须提供默认构造函数,因为初始化对象数组的方案是,首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中。
有两种方式可以用来定义默认构造函数,一种是给已有构造函数的所有参数提供默认值:
Stock(const char* a = "Error", int m = 0,double dr = 0.0);
另一种方式是通过函数重载来定义另一个构造函数——一个没有参数的构造函数:
Stock();
由于只能有一个默认构造函数,因此不要同时采用这两种方式。
2、复制构造函数
又叫拷贝构造函数。它用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中,而不是常规的赋值过程中。类的复制构造函数原型通常如下:
class_name (const class_name &)
它接受一个指向类对象的常量引用作为参数。
这里需要注意复制构造函数和赋值操作符的区别,以免混淆两者的功能。
1)新建一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。每当程序生成了对象副本时,编译器都将使用复制构造函数,具体说,当函数按值传递对象或函数返回对象时,都将使用复制构造函数。假设motto是一个Stack类对象,下面几种都会调用复制构造函数。
Stack ditto(motto);
Stack ditto = motto;
Stack ditto = Stack(motto);
Stack *pDitto = new Stack(motto);