小工具知识网

当前位置: 首页 > 行业知识 > C++ 构造函数和析构函数 详解

行业知识

C++ 构造函数和析构函数 详解

2026-10-19 05:55:34 来源:互联网转载

目录

  • 概述
  • 构造函数的分类
    • 1. 无参(默认)构造函数
    • 2. 有参构造函数
    • 3. 委托构造函数
    • 4. 复制(拷贝)构造函数
    • 5. 移动构造函数
    • 构造函数调用规则
    • ���构函数

      概述

      C++中用构造函数和析构函数来初始化和清理对象,这两个函数将会被编译器自动调用。对象的初始化和清理是非常重要的,如果我们不提供构造函数与析构函数,编译器会自动提供两个函数的空实现。

      构造函数:主要作用于创建函数时对对象成员的属性赋值。

      析构函数:主要作用于在对象销毁前,执行一些清理工作(如释放new开辟在堆区的空间)。

      主要特点:

      构造函数语法:类名(){}

      1.构造函数,没有返回值也不写void

      2.函数名称与类名相同

      3.构造函数可以有参数,因此可以发生重载

      4.程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次

      析构函数语法: ~类名(){}

      1.析构函数,没有返回值也不写void

      2.函数名称与类名相同,在名称前加上符号 ~

      3.析构函数不可以有参数,因此不可以发生重载

      4.程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次

      其余特点:

      • 构造函数和析构函数是一种特殊的公有成员函数,每一个类都有一个默认的构造函数和析构函数;
      • 构造函数在类定义时由系统自动调用,析构函数在类被销毁时由系统自动调用;
      • 构造函数的名称和类名相同,一个类可以有多个构造函数,只能有一个析构函数。不同的构造函数之间通过参数个数和参数类型来区分;
      • 我们可以在构造函数中给类分配资源,在类的析构函数中释放对应的资源。
      • 如果程序员没有提供构造和析构,系统会默认提供,空实现
      • 构造函数 和 析构函数,必须定义在public里面,才可以调用

        简单示例:

        #includeusing namespace std;class Person{public:Person(){cout cout //创建对象Person  p;//这是一个局部变量,test执行完毕后会释放该对象 进而调用析构函数}int main(){Person  p1;//如果在main函数创建对象,析构函数会在按任意键后再调用test();system("pause");return 0;}public:Person(){cout age = a;cout age = p.age;cout cout     //调用    //1.括号法//注意:调用无参构造时不要输入()//Person p();会被编译器认为是函数的声明Person p;//调用无参构造函数Person p1(10);//调用有参函数构造Person p2(p1);//调用拷贝构造函数cout test();system("pause");return 0;}public://默认构造函数Person();int m_Age;int* m_Height;};//初始化年龄和身高Person::Person() {cout Person p;cout public://默认构造函数Person();//有参构造Person(int age, int height);int m_Age;int* m_Height;};//默认构造Person::Person() {cout cout Person p(18,175);cout public://默认构造函数Person();//有参构造Person(int age, int height);//拷贝构造Person(const Person& p);int m_Age;int* m_Height;};//默认构造Person::Person() :Person(0, 0){cout cout cout Person p;cout public://默认构造函数Person();//有参构造Person(int age, int height);//拷贝构造Person(const Person& p);int m_Age;int* m_Height;};//默认构造Person::Person(){cout cout cout Person p1(18, 175);cout public://无参(默认)构造函数Person() {cout age = a;cout age = p.age;cout cout Person p1(18);//如果不写拷贝构造,编译器会自动添加拷贝构造,并且做浅拷贝操作Person p2(p1);cout //如果用户提供有参构造,编译器不会提供默认构造,会提供拷贝构造Person p1; //此时如果用户自己没有提供默认构造,会出错Person p2(10); //用户提供的有参Person p3(p2); //此时如果用户没有提供拷贝构造,编译器会提供//如果用户提供拷贝构造,编译器不会提供其他构造函数Person p4; //此时如果用户自己没有提供默认构造,会出错Person p5(10); //此时如果用户自己没有提供有参,会出错Person p6(p5); //用户自己提供拷贝构造}int main() {test01();system("pause");return 0;}public://默认构造函数Person();//有参构造Person(int age, int height);//拷贝构造Person(const Person& p);//移动构造函数Person(Person&& p);//析构函数~Person();//展示信息void ShowPerson();int m_Age;int* m_Height;};//默认构造Person::Person(){cout cout cout cout cout cout delete this-m_Height;}}//返回一个右值的对象Person GetPerson(){Person p;return p;}int main(){Person p;p.ShowPerson();return 0;}

上一篇:中介租房备案上海

下一篇:2008服务器如何关闭ping?