各种构造函数的区别

来源:互联网 发布:做淘宝店怎么推广 编辑:程序博客网 时间:2024/05/22 15:07

 各种构造函数的区别
       构造函数(包括拷贝构造函数)的基本功能:分配空间,初始化数据.

       构造函数名和类名一样
一.默认构造函数.
        与用户自定义构造函数相比,默认构造函数有功能缺陷:只能分配空间,完成不了初始化数据的任务(类的数据成员都是基本类型数据类型时的默认拷贝构造函数是个例外).

  1.一般的默认构造函数
        若用户没有定义任何构造函数(包括拷贝构造函数),则编译器自动添加默认构造函数(不带任何参数),但该函数不作任何实际工作.即它不能完成对类的数据成员的初始化工作,若用户在用其它方式初始化这些数据成员之前对它们进行访问,就会出错.因此,在任何情况下,用户都应该自定义构造函数,而不使用编译器提供的默认构造函数.

  2.默认拷贝构造函数
         若用户没有定义拷贝构造函数,则编译器自动添加默认拷贝构造函数(带一个该类类型的参数),称为
浅拷贝.它只能完成基本类型数据类型(如int型变量)的拷贝,若类中有动态数组等数据类型,浅拷贝就会出问题.即是说,浅拷贝有潜在危险(当类的数据成员都是基本类型数据类型时,它是安全的).因此,在任何情况下,用户自定义拷贝构造函数是可取的.

二.用户自定义的构造函数(可以重载).
         用户自定义的构造函数需要完成两个功能:分配空间,初始化数据.

1.一般的用户自定义构造函数
(1).无参数的自定义构造函数
        该函数允许用户如此定义类的对象
ClassName c;  //该定义类对象的形式很重要,

ClassName* C=new ClassName[2];     /*

ClassName D[2];                                     /*该段代码调用的就是无参数的 自定义构造函数.*/

(2).一般的自定义构造函数(可以允许部分形参有对应默认参数)
       带有若干参数,调用时显式的写明实参.
ClassName c(...);
ClassName C[2]={(...),(...)};

(3).所有形参都有对应默认参数自定义构造函数
        相当于复合了1与2的功能,是常用的且很方便的一种方法.
ClassName* C=new ClassName[2];
ClassName D[2]={(...),(...)};

2.用户自定义的拷贝构造函数
        为了安全,是很有必要定义的.

 

//1.构造函数不能有返回值

//2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空

// 3.创建一个对象时,系统自动调用构造函数。但如果是用类的一个对象去初始化该类的另一个对象,则调用拷贝构造函数。

 

三、析构函数

//析构函数没有参数,也没有返回值。不能重载,也就是说,一个类中只可能定义一个析构函数。

//如果一个类中没有定义析构函数,系统也会自动生成一个默认的析构函数,为空函数,什么都不做。

//调用条件:1.函数体内定义的对象,当函数执行结束时,该对象所在类析构函数被自动调用

//                2.用new运算符动态构建的对象,在使用delete运算符释放它时。

 

 四、拷贝构造函数

//拷贝构造函数实际上也是构造函数,具有一般构造函数的所有特性,其名字也与所属类名相同

//拷贝构造函数中只有一个参数,这个参数是对某个同类对象的引用。

//在三种情况下被调用1.用类的一个对象去初始化该类的另一个对象时; //见程序员面试宝典-P.111例5:调用析构函数,调用拷贝构造函数

    如:

class string{
  int x,y;
 public:
   string(int a, int b)  // 构造函数
   { x=a;y=b;}
   string(const string & other) // 拷贝构造函数 , 定义other是引用变量,“引用const string型”的引用变量。
   { x=2*other.x;y=2*other.y;}
};

main()
{
  string p1(30,40); //定义对象p1,调用了普通的构造函数
  string p2(p1);      //这里会调用拷贝构造函数,&other,把p1引用过来(或理解为指向p1),用p1初始化p2
  
   cout<<p1.x<<p1.y<<endl;
   cout<<p2.x<<p2.y<<endl;
}

//                                2.函数的形参是类的对象,调用函数进行形参和实参的结合时;

//                                      这也是为什么拷贝构造函数的参数需要加引用避免反复循环 调用构造函数

 

//                                3.函数的返回值是类的对象,函数执行完返回调用者。

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我微信冻结了怎么办 微信账号冻结了怎么办 微信被冻结里面的钱怎么办 微信账户冻结了怎么办 微信公众号忘记密码怎么办 网课没有刷完怎么办 形势与政策挂了怎么办 苹果录屏声音小怎么办 老师跟学生家长吵起来了怎么办 蓝幕拍摄抠像有蓝色怎么办 学东西悟性不高怎么办 微商不会写笔记怎么办 布鞋买大了一码怎么办 凉鞋买大了一码怎么办 皮鞋小了一码怎么办妙招 图书馆借的书本损坏了怎么办 把人打伤没钱赔怎么办 小孩不小心打伤了老师怎么办 高考进了三段怎么办 工作中和领导产生冲突怎么办 酒店不给员工发工资怎么办 裙子没有解开超市的锁怎么办 接待老外听不懂他说的怎么办 脚脱皮又痒又臭怎么办 成都应聘平面模特被骗了怎么办 文明6开场一堆蛮族怎么办 幼儿园里出了水痘怎么办 穿高跟鞋脚容易出汗怎么办 粗跟鞋走路太响怎么办 粗跟鞋鞋跟很响怎么办 皮鞋跟走路太响怎么办 穿高跟鞋脚崴了怎么办 高跟鞋小了一码怎么办 高跟皮鞋磨脚怎么办 大同同煤集团三供一业人员怎么办 小孩被猫咪抓了怎么办 长得特别丑的人怎么办 锅巴放的不脆了怎么办 淘宝买到假货了怎么办 单位不给解约函怎么办 安卓个人热点打不开怎么办