7.构造函数与析构函数(一)

 

目录

 

构造函数

默认构造函数

重载构造函数

构造函数与new

析构造函数

析构函数与delete运算符

析构函数可以显式调用

转换构造函数

赋值与初始化区别

explicit


构造函数

  • 构造函数是特殊的成员函数
  • 创建类类型的新对象,系统自动会调用构造函数
  • 构造函数是为了保证对象的每个数据成员都被正确初始化
  • 函数名和类名完全相同

  • 不能定义构造函数的类型(返回类型),也不能使用void

  • 通常情况下构造函数应声明为公有函数,否则它不能像其他成员函数那样被显式地调用

  • 构造函数被声明为私有有特殊的用途。(单例模式)

  • 构造函数可以有任意类型和任意个数的参数,一个类可以有多个构造函数(重载)

默认构造函数

不带参数的构造函数,如果程序中未声明,则系统自动产生出一个默认构造函数。如果有其他构造函数,系统将不再提供默认构造函数

重载构造函数

不带参数的构造函数与到参数的构造函数构成重载

构造函数与new

new会分配内存并调用构造函数(  指new表达式)

注意:全局对象的构造先于main函数

析构造函数

  • 函数名和类名相似(前面多了一个字符“~”
  • 没有返回类型
  • 没有参数
  • 析构函数不能被重载

如果没有定义析构函数,编译器会自动生成一个默认析构函数,其格式如下:

  类名::~默认析构函数名( )

  {

  }

默认析构函数是一个空函数。

析构函数与delete运算符

在栈上创建的对象,在生命周期结束的时候会自动调用析构函数

在堆上创建的对象,在生命周期结束的时候要由程序员显示调用delete,delete会调用对象的析构函数释放对象,并释放内存

析构函数可以显式调用

析构函数可以显示调用,但一般不推荐

转换构造函数

  • 单个参数的构造函数将其它类型转换为类类型
  • 类的构造函数只有一个参数是非常危险的,因为编译器可以使用这种构造函数把参数的类型隐式转换为类类型
Test t(10);//普通构造函数
t=20;    //转换构造函数  将20生成一个临时对象 ,将临时对象赋值给t

赋值与初始化区别

在初始化语句中的等号不是运算符。编译器对这种表示方法有特殊的解释

赋值,编译器会默认创建赋值操作,将类的逐个成员进行赋值

Test& Test::operator=(const Test& other);

Test t=10;//等价于Test t(10)  这里的=不是运算符,表示初始化
t=20;  //赋值

explicit

只提供给类的构造函数使用的关键字。编译器不会把声明为explicit的构造函数用于隐式转换,它只能在程序代码中显示创建对象

Test t=10  ;//加上explicit之后  这句错误  不能这样创建

猜你喜欢

转载自blog.csdn.net/Alatebloomer/article/details/81297702
今日推荐