C++构造函数析构函数

本文介绍了C++中的构造函数和析构函数。构造函数是类中用于初始化成员变量的特殊函数,分为显式声明和编译器隐式生成的默认构造函数。初始化成员变量时,推荐使用初始化列表,因为它适用于更多场景并具有较高效率。析构函数则在对象生命周期结束时自动调用,常用于资源释放等清理工作。析构函数由系统自动调用,名称为类名前加反引号,不能重载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.构造函数

  • 什么是构造函数
    构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行,用以为成员变量设置初始值。构造函数的名称与类名完全相同,并且不反回任何类型。当需要对成员变量设置初始值时,需要显示声明构造函数;当不需要对成员变量设置初始值,常常不会显示声明构造函数,但是此时,编译器会隐式生成一个默认构造函数,并且编译器隐式声明的构造函数为空。
//显式声明构造函数的类
class Test
{
public:
 Test(int a)    //显式构造函数
 {
  b = a;
 }
 void print()
 {
  cout << b << endl;
 }
private:
 int b;
};

//编译器隐式生产构造函数的类,隐式生成的构造函数为Test() {}
class Test
{
public:
 void print()
 {
  cout << "Test constructor." << endl;
 }
};
  • 构造函数的初始化
    显式声明的构造函数在初始化时有两种初始化方式:使用初始化列表来初始化和赋值初始化。

(1)初始化列表
格式:
构造函数():变量名1(数值),变量名2(数值){}
有以下三种情况必须使用初始化列表进行初始化:
1.需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显式调用父类的构造函数对父类数据成员进行初始化)

#include <iostream>
using namespace std;
class Test
{
 public:
    Test (int, int, int){
    cout <<"Test" << endl;
 };
 private:
    int x;
    int y;
    int z;
};
class Mytest 
{
 public:
    Mytest():test(1,2,3){       //初始化
    cout << "Mytest" << endl;
    };
private:
    Test test; //声明
};
int _tmain(int argc, _TCHAR* argv[])
{
 Mytest test;
 return 0;
}


/*输出结果为:
Test
Mytet
*/

2.需要初始化const或引用成员数据

class ConstRef
{
public:
    ConstRef(int ii);
    ~ConstRef();
private:
    int i;
    const int ci;
    int &ri;    
};
ConsrRef::ConstRef(int ii):i(ii),ci(ii),ri(ii) {}

3.子类初始化父类的私有成员

class Test{
public:
    Test(){};
    Test (int x){ int_x = x;};
    void show(){cout<< int_x << endl;}
private:
    int int_x;
};
class Mytest:public Test{
public:
    Mytest() :Test(110){
      //Test(110);            //  构造函数只能在初始化列表中被显示调用,不能在构造函数内部被显示调用
    };
};
int _tmain(int argc, _TCHAR* argv[])
{
 Test *p = new Mytest();
 p->show();
 return 0;
}

(2)赋值
和普通的赋值操作一样,在此不再赘述。
这两张构造函数的初始化方式,初始化列表的适用范围更广,并且效率更高。

析构函数

  • 什么是析构函数
    析构函数与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后”的工作(例如在建立对象时用new开辟一片内存空间,delete会自动调用析构函数后释放内存)。析构函数名与类名相同,只是在函数名前面加一个位取反符~,以区别构造函数。它不能再任何参数,也没有返回值。只能有一个构造函数,不能重载。可以显示声明析构函数,如没有显示声明,编译器会自动生成一个缺省的析构函数。
#include<string.h>
#include<iostream>
using namespace std;
class stud
{
private:
 int num;
 char name[10];
 char sex;
public:
 stud(int n, const char nam[], char s)
 {
  num = n;
  strcpy_s(name,nam);
  sex = s;
 }
 ~stud()
 {
  cout << "stus has been destructed!" << endl;
 }
 void display()
 {
  cout << "num:" << num << endl;
  cout << "name:" << name << endl;
  cout << "sex:" << sex << endl;
 }
};
int main()
{
 stud stud1(10010, "Wangli", 'f'), stud2(10011,"Zhangfun",'m');
 stud1.display();
 stud2.display();
 return 0;
}

/*输出结果为:
num:10010
name:Wangli
sex:f
num:10011
name:Zhangfun
sex:m
stus has been destructed!
stus has been destructed!
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值