C++ 类(构造函数和析构函数)

C++ 类(构造函数和析构函数)文章概述构造函数和析构函数的由来 构造函数和析构函数的基本语法 C 编译器构造析构方案 PK 对象显示初始化方案构造函数的分类以及调用默认的构造函数构造函数调用规则构造函数和析构函数的总结构造函数和析构函数的由来类的数据成员不能在类的声明时候初始化 为了解决这个问题 使用构造函数处理对对象的初始化 构造函数是一种特殊的成员函数 与其他函数不同 不需要用户调用它 而

文章概述

  1. 构造函数和析构函数的由来?
  2. 构造函数和析构函数的基本语法
  3. C++编译器构造析构方案 PK 对象显示初始化方案
  4. 构造函数的分类以及调用
  5. 默认的构造函数
  6. 构造函数调用规则
  7. 构造函数和析构函数的总结

构造函数和析构函数的由来

类的数据成员不能在类的声明时候初始化,为了解决这个问题? 使用构造函数处理对对象的初始化。构造函数是一种特殊的成员函数,与其他函数不同,不需要用户调用它,而是创建对象的时候自动调用。析构函数是对象不再使用的时候,需要清理资源的时候调用。


构造函数和析构函数的基本语法

a. 构造函数:

  • C++中的类需要定义与类名相同的特殊成员函数时,这种与类名相同的成员函数叫做构造函数;
  • 构造函数可以在定义的时候有参数;
  • 构造函数没有任何返回类型。
  • 构造函数的调用: 一般情况下,C++编译器会自动的调用构造函数。特殊情况下,需要手工的调用构造函数。
class Test { public: //构造函数 Test() { } }

b. 析构函数:

  • C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的函数是析构函数;
  • 析构函数没有参数和没有任何返回类型;
  • 析构函数在对象销毁的时候自动调用;
  • 析构函数调用机制: C++编译器自动调用。
class Test { ~Test() { } }

C++编译器构造析构方案 PK 对象显示初始化方案

class Test { private: int x; public: Test(int x) { this->x = x; cout << "对象被创建" << endl; } Test() { x = 0; cout << "对象被创建" << endl; } void init(int x) { this->x = x; cout << "对象被创建" << endl; } ~Test() { cout << "对象被释放" << endl; } int GetX() { return x; } }; int main() { //1.我们按照C++编译器提供的初始化对象和显示的初始化对象 Test a(10); Test b; //显示创建对象但是还是调用无参构造函数,之后显示调用了初始化函数 b.init(10); //创建对象数组(使用构造函数) Test arr[3] = {Test(10),Test(),Test()}; //创建对象数组 (使用显示的初始化函数) Test brr[3]; //创建了3个对象,默认值 cout< 
     
       0].GetX()< 
      
        0].init( 
       10); 
       cout< 
       
         0].GetX()< 
        
          return 
         0; } 
         
        
       
     
  • a. init函数只是一个普通的函数,必须显示的调用;
  • b. 一旦由于失误的原因,对象没有初始化,那么结果也是不确定的。没有初始化的对象,其内部成员变量的值是不定的;
  • c. 不能完全解决问题。

构造函数的分类以及调用

a. 无参构造函数

class Test { private: int x; public: Test() { this->x=10; } }

无参构造函数的调用: Test a;


b. 有参构造函数

class Test { private: int x; public: Test(int x) { this->x=x; } }

有参数构造函数的调用时机:

  • Test a(10); 调用有参数构造函数
  • Test b=(2,3); 逗号表达式的值是最后一位,调用有参数构造函数
  • Test c=Test(2); 产生一个匿名对象,直接转化成c(只会调用一次有参数构造函数)

c. 拷贝构造函数: 使用对象a初始化对象b

class Test { private: int x; public: Test(const Test& a) { this->x=a.x; } }

拷贝构造函数的调用时机:

class Test { private: int x; public: Test(int x) { this->x = x; cout << "对象被创建" << endl; } Test() { x = 0; cout << "对象被创建" << endl; } ~Test() { cout << "对象被释放" << endl; } Test(const Test& a) { this->x = a.x; cout << "对象被释放(拷贝构造函数)" << endl; } };
  • 第一个场景: 用对象a初始化对象b:
Test a(10); //调用的是拷贝构造函数 Test b = a;
  • 第二个场景: 用对象a初始化对象b
Test a(10); //调用的是拷贝构造函数 Test b(a)

第一个场景和第二个场景是一样的,用一个对象初始化另一个对象。

  • 第三个场景: 实参初始化形参的时候,会调用拷贝构造函数
 Test a(10); //实参初始化形参 PrintF(a);
  • 第四个场景: 函数返回一个匿名对象
    我们分析第四个场景前,我们看看下面的这个全局函数:

//该函数返回的是谁? Test p() { Test c(4); return c; }
Test a=p(); 
 Test b; //匿名对象赋值另一个对象 b = p();

默认的构造函数


构造函数调用规则


构造函数和析构函数的总结

  • -
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202631.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午11:40
下一篇 2026年3月19日 下午11:41


相关推荐

  • tp-link路由器无线桥接详细教程_tp-link路由器怎么有线桥接

    tp-link路由器无线桥接详细教程_tp-link路由器怎么有线桥接本文介绍了TP-Link路由器有线桥接的设置方法,路由器有线桥接其实严格上应该叫做:两个(多个)路由器串联上网。主要适用于这样的网络环境:有A、B两台TP-Link路由器,A连接Moden(猫)上网,然后在用网线连接A和B,要实现B路由器也能够上网,包括B的无线网络。方法一、路由器B设置1、用网线连接电脑和TP-Link路由器B的A、B路由器之间,暂时不需要用网线连接。只让电脑连接无线路由器2、进…

    2025年7月15日
    8
  • Python-正则匹配

    Python-正则匹配一、匹配单个字符:1、数字匹配\d表示匹配任意数字In[16]:ret=re.match(r"速度与激情\d","速度与激情1")In[17]

    2022年7月2日
    27
  • SQL学习收获与心得

    SQL学习收获与心得SQL或结构化查询语言是一种语言,旨在允许技术和非技术用户查询,操作和转换关系数据库中的数据。由于其简单性,SQL数据库为数百万个网站和移动应用程序提供安全且可扩展的存储。有许多流行的SQL数据库,包括MySQL,MSSQL和Oracle等等。所有这些都支持通用的SQL语言标准,这是该网站将要教授的内容,但每个实现可以在它支持的附加功能和存储类型方面有所不同。基本的sql语句:选择:se…

    2022年8月21日
    8
  • StretchDIBits函数

    StretchDIBits函数引用:http://blog.csdn.net/giantchen547792075/article/details/6996011The StretchDIBits functioncopiesthecolordataforarectangleofpixelsinaDIB,JPEG,orPNGimagetothespecifieddestination

    2022年6月15日
    27
  • cglib BeanCopier的使用

    cglib BeanCopier的使用一、概述  选择Cglib的BeanCopier进行Bean拷贝的理由是,其性能要比Spring的BeanUtils,Apache的BeanUtils和PropertyUtils要好很多,尤其是数据量比较大的情况下。  之前的一篇文章:Easy-mapper教程——模型转换工具提到了Cglib的BeanCopier使用ASM字节码生成技术,所以性能会非常好。  下面的文章内容直接整理…

    2025年9月13日
    9
  • java databus_linkedin 的 databus 部署「建议收藏」

    java databus_linkedin 的 databus 部署「建议收藏」1.下载源码复制ojdbc.jar到相应的文件夹gitclonehttps://github.com/linkedin/databus/sandbox-repo/com/oracle/ojdbc6/11.2.0.2.0/ojdbc6-11.2.0.2.0.jar2.在subprojects.gradle中加上options.addStringOption(‘encodi…

    2022年10月17日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号