代码改变世界

5--三大函数

2013-11-28 17:07  gongti  阅读(276)  评论(0编辑  收藏  举报
 (1)类的构造函数
构造函数是特殊的成员函数,只要创建了类类型的对象,都要执行构造函数
构造函数的目的是保证每个对象的数据成员都有合适的初始值。
 
构造函数是特殊的成员函数,与其他成员函数不同,构造函数和类同名,而且没有
返回类型。一个类可以有多个构造函数,每个构造函数必须有与其他构造函数
不同数目或者类型的形参。
 
在创建对象的时候,编译器会自动调用构造函数,不需要用户调用
 
如果没有为一个类定义任何的构造函数,那么在初始化的时候会调用默认构造函数。
默认构造函数由编译器生成,为所有的数据成员提供初始化。默认构造函数没有任何参数。
但是如果一个类一旦定义了构造函数,那么编译器就不再提供任何默认构造函数
 

 
(2)构造函数的初始化列表
构造函数和其他的函数一样,具有函数名称、形参表和函数体。与其他函数不同的是,
构造函数也可以包含一个构造函数初始化列表。
构造函数初始化列表紧跟在构造函数的后面,以一个冒号开始,接着是一个以逗号分隔
的数据成员列表,每个数据成员后面跟一个放在圆括号中的初始化式。
Employee::Employee():garde(0),salary(0)        //构造函数的初始化列表
{
}
Empoyee::Employee()                           
{
    garde=0;
    salary=0;
}
上面两种方法是有区别的:
第一种对每个变量只有一次初始化。
后一种方法则是先用默认值初始化,然后又赋一个值,也就是说进入构造函数之前已经完成了初始化。
 
使用初始化列表时候,有一些需要注意的地方:
  • 不是所有的数据成员都必须出现在初始化列表中
  • 初始化列表中每个成员只能出现一次,不可以重复初始化
  • 数据成员在初始化列表中出现的顺序与类中定义顺序无关
 
 

 
(3)复制构造函数
类的构造函数可以方便的为类指定初始值,当用一个现有对象来创建新的对象的时候
就需要使用到复制构造函数。
 
如果在类中不自定义复制构造函数,编译器会用位复制来执行上面的过程。
Employee emp1("mike",23,7000);
Employee emp2=emp1;
但是对于一些包含指针数据成员的类,位复制的时候只会复制这个指针,
两个指针指向同样的地址,后面的对象依赖前面的对象。也就是浅拷贝。
 
在C++中,可以用自己定义的函数来代替位复制,这个函数就是复制构造函数。
复制构造函数是一个特殊的构造函数,该函数接收一个本类型的引用作为参数,
参数数目只能有一个。通过使用复制构造函数,可以用一个现有的类对象来创建
一个新的类对象。
claas Employee
{
    public:
        Employee(const Employee &E)           //一定是本类型的引用
}
 
在下面三种形式下,编译器会调用复制构造函数:
  1. 在定义类对象的时候直接用其他类对象初始化,比如前面的 Empoyee emp2=emp1;
  2. 调用函数的时候。如果函数的类型是类类型,且没有定义为引用,这个函数的参数是值传递
  3. 在函数返回的时候。如果函数的返回类型是类类型,且没有定义为引用。


 
(4)类的析构函数
在释放对象的时候会调用析构函数。析构函数也是类中一个特殊的成员函数。
当对象脱离其作用域的时候,系统会自动执行析构函数。
析构函数往往是用来做"清理善后"的工作。例如在建立对象时用new开辟一片
内存空间,应在退出程序前在析构函数中用delete释放。
 
析构函数使用波浪线"~"加类名作为函数名,没有返回类型,没有参数。
一个类可以有多个构造函数,但是只能定义一个析构函数。
 
如果没有为类定义析构函数,那么编译器也会自动添加一个析构函数,不过这个由编译器
添加的析构函数不进行任何操作。如果有一些需要自己手动释放的东西,如指针或者打开
的文件等,就一定需要定义析构函数。