构造函数

        构造函数的名字是非常切题的,它就是制造一个对象的函数。在最简单的情况下,构造函数只不过是一个便利的初始化函数,但它们有一些重要的微妙差别。
重载构造函数
        构造函数的名总是与类名相同,它没有返回类型,甚至都不能将其定义为void类型。
象大多数的C++函数一样,构造函数也可以被重载。这意味着你可以重复使用同一个函数名,只要它们的参数列表是不同的(参数的个数和类型应该都不同)。
默认的构造函数
        每个类都有或者应该有一个默认的构造函数。对于任何给定的类,默认构造函数是没有参数的最简单的构造函数,它并不复杂,只是简单地把所有的成员变量初始化为0。当定义了一个没有初始化的对象、创建一个没有初始化对象矩阵或者使用不带参数的new操作符时,默认的构造函数就会被调用。
        如果一个类没有声明任何类型的构造函数,那么编译器就会提供一个默认的构造函数,这是一个隐藏的构造函数。但是如果你回头去为类声明任何的构造函数,编译器提供的默认构造函数将会自动消失。所以,你应该总包含一个默认的构造函数,尽管它并不做任何事情。这是防御编程技术的一种。
复制构造函数
        当建立对象时,传入构造函数的参数是同一类的对象,这意味着将要复制该对象,所以这种执行对象复制的构造函数称为复制构造函数。所谓的复制对象所执行的工作,基本上是将对象的属性一个一个复制给新产生的对象。这种构造函数是非常重要的,因为除了定义变量之外,在下面的情形会自动调用它:
1.当类的对象由数值来传递时,C++调用类的复制构造函数来创建变量的一个拷贝,然后将其放入堆栈;
           void Print_string(CStr str);
2.当函数返回类的一个对象,也就是返回值的类型是类时,C++调用类的复制构造函数来创建一个对象返回给函数的调用者。
           CStr func(void);
         因为这些情况太通常了,所以如果你没有提供一个明确的复制构造函数,编译器将会提供一个隐藏的复制构造函数。但是,编译器提供的复制构造函数是过分单纯化的,它所做的只是完成一个成员到成员的复制。如果类中没有定义指针,直接利用系统自动产生的复制构造函数即可。当类中有数据类型定义为指针的属性时,就需要自定义复制构造函数。因为默认的复制构造函数进行对象的逐个复制时,仅会复制指针类型属性的地址值,而不是指针指向的数据值。因此,会造成两个对象的指针属性共用一块地址值的情况。在这种情形下,对任何一个对象的改变都会破坏另一个对象的数据。
类型转换构造函数
         如过当构造函数传入的参数只有一个,且不是复制构造函数时,可以将该构造函数称为类型转换构造函数。这类构造函数利用传入的对象建立成为新对象,除了可以视为完全对象的建立外,更可以视为是对对象类型的转换。
例如,构造函数CStr(char *) 告诉编译器如何将一个char*形式的字符串转换为一个CStr类的对象。无论何时需要一个CStr类的对象,都可以使用一个char*形式的字符串来代替它,并且编译器会为你转换它。
          CStr make_uppercase(CStr s);
          CStr string1;
          string 1 = make_uppercase("Amirural");           //调用构造函数CStr(char *)来从字符串"Amirural"创建一个CStr类的对象。然后将这个对象被传递到make_uppercase函数中去。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值