类的基本知识点:构造函数

下面整理列出关于类的构造函数的知识点:
1、类的构造函数是类的成员函数,它的名字跟类名相同。

2、其目的是初始化类的私有成员变量。

3、值得注意的是,类的构造函数没有返回值。(并不是说它的返回值是void,而是根本没有返回值)

4、一个类可以有多个构造函数,他们之间的用形式参数数量的不同来区别。

5、没有任何形参的构造函数称为类的“缺省构造函数”。

6、当创建一个类对象时,根据其传入的实际参数的数量来调用类的构造函数。

7、如何向构造函数传递参数:在声明类对象时,在对象名后直接写上实参列表,编译器就会根据实参的个数和类型选择调用合适的构造函数。如DATE date1(2016,5,20);

8、若声明类对象时没有实参列表,则:(1) 若该类有缺省构造函数,则调用该构造函数,同时创建该对象(为该对象分配内存空间)。(2) 若该类没有缺省构造函数,则创建该对象。但该对象的私有成员没有得到初始化。

根据8(2)的情况做一下说明:如果类中没有缺省构造函数,则系统会自动帮你创建一个缺省构造函数,但是其函数题为空,并没有什么实际的作用。其作用只是让你创建一个没有实参的对象这个行动变成合法的。所以应该养成编写构造函数的好习惯。

9、特别说明一下带有默认参数的构造函数:在默认构造函数的声明里设置默认参数。不要在类的函数定义中设置默认值。
如:

class DATE // DATE.h
{
public:
DATE( int = 2000, int = 1, int = 1 );
:
};
DATE::DATE( int initYear, int initMonth, int initDay ) //DATE.cpp
{
year = initYear; month = initMonth; day = initDay;
}
int main() //client.cpp
{
DATE date1; //initYear, initMonth, initDay分别为2000, 1, 1
DATE date2( 1976 ); //initYear, initMonth, initDay分别为1976, 1, 1
DATE date2( 1976, 12 ); //initYear, initMonth, initDay分别为1976, 12, 1
DATE date2( 1976, 12, 20 ); //initYear, initMonth, initDay分别为1976, 12, 10
}

10、一类特别的构造函数是拷贝构造函数:
(1)、形参类型为该类类型本身且参数传递方式为按引用传递。
(2)、用一个已存在的该类对象初始化新创建的对象。
(3)、每个类都必须要有一个拷贝构造函数。可以显示定义,若没有显示定义,则系统会自动提供一个缺省拷贝构造函数。
(4)、缺省拷贝构造函数使用逐位复制方式利用已存在的对象来初始化新创建的对象(相当于赋值=)。
(5)、为了确保作为形参的对象不会被修改,一般声明为const。如:A::A(const A& obj);

拷贝构造函数的作用:
(1)、创建新的对象时,相当于赋值操作符“=”。
(2)、当类对象作为函数的参数时,实际上是需要拷贝一个对象的副本给函数使用,所以拷贝构造函数是必须的。
(3)、当某个函数将类对象作为函数的返回值时。当函数返回一对象时,系统将自动创建一个临时对象来保存函数的返回值。创建此临时对象时需要调用拷贝构造函数。

那末何时需要自己写拷贝构造函数,何时只需系统自动创建的就可以呢?
一般的,如果设计者在拷贝构造函数中有自己的特殊需要,自己定义拷贝构造函数比较好。另外,因为缺省拷贝构造函数使用的是浅复制的策略,因此对含指针成员的类并不能满足需要。所以含指针成员的类的构造函数一般自己定义比较好。需要注意的是含指针成员的类通常应在构造函数(及拷贝构造函数)中分配内存,在析构函数中释放内存。
对于不含指针成员的类,使用系统提供(编译器自动合成)的缺省拷贝构造函数即可。

类对象成员的初始化:
对象成员既是在类中声明的具有类类型的数据成员。为了初始化对象成员,类的构造函数必须调用对象成员所属类的构造函数,如:

class A
{
CLASS_1 obj1;
CLASS_2 obj2;
};
A::A(参数表0): obj1(参数表1), obj2(参数表2) { … }

以上内容整理自万海讲师上课内容及《C++Primer》。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值