欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

构造函数析构函数和拷贝构造函数

程序员文章站 2022-07-15 17:00:05
...

构造函数:创建类对象,并初始化其值。
1.传参
2.按照类成员声明顺序依次构造其成员
3.执行构造函数函数体
析构函数:用来完成对象被删除前的一些清理工作(释放类对象)
1.执行析构函数函数
2.按照类中成员变量声明顺序的逆序依次析构其成员
初始化列表:初始化对象成员(调用成员对象的带参构造)
形式:在构造函数函数首部之后,函数体之前,其书写顺序不影响构造函数执行顺序
拷贝构造函数:
定义:当用一个已经存在的对象去初始化一个新对象时,会调用拷贝构造函数
功能:把初始值对象的每个数据成员的值都复制到新建立的对象中

1.一般方法:

class 类名
{
public:
类名(形参表);      //构造函数
类名(类名&对象名);   //复制构造函数
...
};
类名::类名(类名&对象名);   //复制构造函数的实现
{
函数体
}

2.普通构造函数是在对象创建时被调用,而拷贝构造函数在一下3种情况下都会被调用
(1)当用类的一个对象去初始化该类的另一个对象时。
例如:

int main()
{
point a(1,2);
point b(a);  //对对象a初始化对象b,拷贝构造函数被调用
point c=a;  //用对象a 初始化对象c,拷贝构造函数被调用
cout<<b.getx()<<endl;
return 0;
}

注意:该两种写法只是形式上的不同,执行的操作完全相同
(2)如果函数的形参是类的对象,调用函数时,进行形参和实参结合时。

  void f(point p)
  {
  cout<<p.getx()<<endl;
  }
  int main()
  {
  point a(1,2);
  f(a);   //函数的形参为类的对象,调用函数时,拷贝函数被调用
  return 0;
  }

注意:只有把对象用值传递时,才会调用拷贝构造函数,如果传递引用,则不会调用拷贝构造函数,由于一些原因,调用比较大的对象时,传递引用会比穿值的效率高很多。
(3)函数的返回值是类的对像,函数执行完成返回调用者时

point  g()
{
point a(1,2);
return a;   //函数的返回值是类对象,返回函数值时,调用拷贝构造函数
}
int main()
{
point b;
b=g();
return 0;
}

解析:表面上函数g将a返回给了主函数,但是a是g()的局部对象,离开建立它的函数g以后就消亡了,不可能返回主函数后继续生存所以在这种情况时编译系统会在主函数值创建一个无名临时对象,该临时对象的生存期只在函数调用所处的表达式中,也就是表达式b=g()中,执行语句return a;时,实际上是调用拷贝构造函数将a的值复制到临时对象中,函数g运行结束时对象a消失,但临时对象会存在于表达式b=g()中,计算完这个表达式后,临时对象的使命也就完成了,该临时对象便会自动消失。