类中的多种构造函数
构造函数术语:
1. 默认构造 : 指的是没有形参的构造函数, 由编译器默认提供, 在某些场合编译器需要自动调用一个类对象的构造函数时, 只能调用默认构造.例如: 子类继承了父类,当子类对象被构造的时候, 父类 的构造也会被自动调用,此时就只能自动调用父类的默认构造
2.默认构造函数:没有形参,方法体也是空的,目的是构造一个对象
MyClass.h文件class MyClass{public :MyClass();}; MyClass.cpp文件#include "MyClass.h"MyClass::MyClass(){}2. 转换构造 : 指的是那些只有一个形参,且参数类型是非本类类型的构造函数们. 一般能够显式调用 (例如 `MyClass obj(5)`), 也能隐式调用: `fun(5);` fun的形参是`MyClass`类型
MyClass.h文件class MyClass{public :MyClass(int i);MyClass(double i);private :double m_Num; }; MyClass.cpp文件#include "MyClass.h"MyClass::MyClass(int i){//构造函数中可以什么都不实现}MyClass::MyClass(double n){//构造函数中也可以实现对成员变量的赋值this->m_Num = n;} main.cpp文件int main(){//创建出MyClass的对象//方法1:MyClass myclass(5);//方法2:MyClass myClass = 5.0;//此时编译器会将 MyClass myClass = 5.0;装换成 MyClass myclass(5.0); return 0;}3. 拷贝构造: 指的是只有一个形参, 且参数类型是本类类型的引用. 一般是在定义一个对象的时候, 将另一个对象作为初始值时,就会自动调用这个版本的构造函数, 一般编译器会默认提供一个拷贝 构造, 默认提供的拷贝构造会将对象的内存空间进行拷贝.
MyClass.h文件class MyClass{public :MyClass();MyClass(MyClass& myclass); private:char* cStrName;}; MyClass.cpp文件#include "MyClass.h"MyClass::MyClass(MyClass& myclass){//注意:拷贝构造的形参一定要是对象的引用,如果不是引用那么就会导致拷贝构造不断调用拷贝构造//当前就为拷贝构造函数//拷贝构造函数被调用的时机//1.当某个函数的形参是MyClass类型时//例: int FunMyClass(MyClass myclass){ }//2.当Myclass对象给另一个MyClass对象赋值时//例: MyClass myClass1;// MyClass myClass2 = myClass1;//3.当函数返回值是MyClass类型时://例: MyClass CreateMyClass(){ MyClass myClass; return myClass;}}MyClass::MyClass(){//无参构造函数}//深拷贝和浅拷贝的区别//1.一般在类中存在指针时就必须使用深拷贝MyClass::MyClass(MyClass& myClass){//浅拷贝 //仅仅进行简单赋值,将当前指针保存的内存地址赋值给新的对象。如果此时旧对象调用析构,那么旧对象的成员变量指针指向的内存空间也会被释放,那么这时新对象再去找该空间时就找不到,从而引发程序异常this->cStrName = myClass.cStrName;}//2.深拷贝MyClass::MyClass(MyClass& myClass){//深拷贝时对新指针一定要指向重新创建出的空间,并将旧空间的数据存入新的空间中str_name = _strdup(test.str_name);//_strdup()是string.h中的一个函数,作用是重新创建一块内存空间,内存空间的大小就是实参的空间大小,并且将值赋值给新创建的内存空间}类中包含有指针成员的时候, 一般就需要自己编写拷贝构造, 实现对指针指向的内存进行拷贝的 功能. 否则默认拷贝构造是不会去拷贝指针指向的内容. (深拷贝和浅拷贝的区别)
4. 带参构造 : 含有两个以上的形参的构造函数统称带参构造.
MyClass.h文件class MyClass{public:MyClass(int i,int j);}; MyClass.cpp文件#include "MyClass.h"MyClass::MyClass(int i ,int j){//带参构造函数}
总结
- 上一篇: 关于友元的使用
- 下一篇: 汇编中的通用寄存器、标志寄存器、段寄存器