前言上期了解C类中有public、protected、private三种访问权限。肯定会有人疑惑C为什么要设置这三个权限呢本期内容就是围绕上面的问题展开说明一、面向对象开始的文章就提到过类是OOP面向对象编程的基础那么面向对象编程究竟是个什么东东呢百度百科是这样解释的通俗的来说就是利用代码将现实世界的事物抽象出来使代码更具有真实事物的行为简单举个栗子狗是人类的朋友有很多人养狗做宠物宠物狗有名字年龄毛发颜色等等特征狗还会吃饭喝水汪汪汪之类的行为如果利用代码抽象一个小狗类这些名字年龄等就对应成员变量吃饭喝水等行为就是成员函数上代码1234567891011121314151617181920classDog{protected:intAge;string Name;string Color;public:voidEating(){cout 吃狗粮 endl;}voidDrinking(){cout 喝水水 endl;}voidWangwangwang(){cout 汪汪汪 endl;}};在现实世界中狗的名字我们可以改但年龄和颜色我们是无法改变的就比如狗的颜色是它本身DNA决定的。我们可以分辨颜色是因为我们视力没有问题可以通过看的方式访问狗的颜色所以我们通常在代码里将成员变量设置成protected属性让外部无法直接访问就像我们无法直接去看狗的DNA序列一样。所以通常会定义一些成员函数来间接访问成员变量这里上期讲解遗漏了下面补充一下Protected和private无法在类外访问但可以在自己的类内部被成员函数访问对外接口而将这些成员函数放在public下在类外使用这些成员函数就相当于间接访问无法访问的变量这就体现出C面向对象中封装的特性我们看看百度百科中对封装的介绍简单 的说外部使用一个封装好的类的时候只会考虑某些接口的特定功能而并不会关心内部的具体实现细节。具体看下图那么进入主题看看封装的具体技术二、构造函数1.基本概念基本概念构造函数是类的成员函数作用是在类创建对象时用于初始化对象。特点函数名和类名相同且不用写返回值在创建对象时会自动调用。语法函数名 形参列表 { 函数实现 }注意1.构造函数不需要返回值类型2.构造函数的函数名和类名相同代码如下1234567891011121314151617181920212223242526272829303132classMyClass{protected:inti;charc;string str;public:voidprint()//用于显示成员变量{cout i i endl;cout c c endl;cout str str endl;}MyClass()//构造函数{i 5;c a;str str in MyClass;}};voidtest(){//创建对象 claMyClass cla;//调用 成员函数printcla.print();}intmain(){test();return0;}运行效果可见我们只是创建了一个对象并没有对这个对象做任何操作。我们不用自己调用构造函数编译器在创建对象时自动调用构造函数为变量初始化。2.构造函数重载1.构造函数分类构造函数大概分无参构造、有参构造、拷贝构造三种上述代码中的构造函数就是一个典型的无参构造2.有参构造函数例如以下代码有参构造的3个重载123456789101112131415MyClass(inti){this-i i;}MyClass(inti,charc){this-i i;this-c c;}MyClass(inti,charc,string str){this-i i;this-c c;this-str str;}3.有参构造函数3个调用规则括号法1234//使用有参构造函数创建对象 cla2cla3,cla4MyClass cla2(10);MyClass cla3(10,b);MyClass cla4(10,b,str in MyClass_cla2);等号法123//使用有参构造函数创建对象(等号法)MyClass cla5 10;MyClass cla6 (10,b);直接调用构造函数1234//使用有参构造函数创建对象(调用构造函数)MyClass cla7 MyClass(10);MyClass cla8 MyClass(10,b);MyClass cla9 MyClass(10,b,str in MyClass);4.拷贝构造函数123456MyClass(MyClass cla){this-i cla.i;this-c cla.c;this-str cla.str;}注意拷贝构造函数的形参是自身类型的引用拷贝构造函数调用123//使用拷贝构造函数创建对象MyClass cla11(cla8);MyClass cla12 cla9;5.析构函数基本概念:在对象被释放时编译器会自动调用析构函数用于释放对象中变量的内存空间语法函数名 形参列表 { 函数实现 }注意1.构造函数不需要返回值类型2.构造函数的函数名为 ~(类名)特点函数名和类名相同且不用写返回值在创建对象时会自动调用。有人会问对象内存被释放时成员变量内存空间不是也被释放了吗
C++:构造函数,析构函数详解
发布时间:2026/5/28 20:28:13
前言上期了解C类中有public、protected、private三种访问权限。肯定会有人疑惑C为什么要设置这三个权限呢本期内容就是围绕上面的问题展开说明一、面向对象开始的文章就提到过类是OOP面向对象编程的基础那么面向对象编程究竟是个什么东东呢百度百科是这样解释的通俗的来说就是利用代码将现实世界的事物抽象出来使代码更具有真实事物的行为简单举个栗子狗是人类的朋友有很多人养狗做宠物宠物狗有名字年龄毛发颜色等等特征狗还会吃饭喝水汪汪汪之类的行为如果利用代码抽象一个小狗类这些名字年龄等就对应成员变量吃饭喝水等行为就是成员函数上代码1234567891011121314151617181920classDog{protected:intAge;string Name;string Color;public:voidEating(){cout 吃狗粮 endl;}voidDrinking(){cout 喝水水 endl;}voidWangwangwang(){cout 汪汪汪 endl;}};在现实世界中狗的名字我们可以改但年龄和颜色我们是无法改变的就比如狗的颜色是它本身DNA决定的。我们可以分辨颜色是因为我们视力没有问题可以通过看的方式访问狗的颜色所以我们通常在代码里将成员变量设置成protected属性让外部无法直接访问就像我们无法直接去看狗的DNA序列一样。所以通常会定义一些成员函数来间接访问成员变量这里上期讲解遗漏了下面补充一下Protected和private无法在类外访问但可以在自己的类内部被成员函数访问对外接口而将这些成员函数放在public下在类外使用这些成员函数就相当于间接访问无法访问的变量这就体现出C面向对象中封装的特性我们看看百度百科中对封装的介绍简单 的说外部使用一个封装好的类的时候只会考虑某些接口的特定功能而并不会关心内部的具体实现细节。具体看下图那么进入主题看看封装的具体技术二、构造函数1.基本概念基本概念构造函数是类的成员函数作用是在类创建对象时用于初始化对象。特点函数名和类名相同且不用写返回值在创建对象时会自动调用。语法函数名 形参列表 { 函数实现 }注意1.构造函数不需要返回值类型2.构造函数的函数名和类名相同代码如下1234567891011121314151617181920212223242526272829303132classMyClass{protected:inti;charc;string str;public:voidprint()//用于显示成员变量{cout i i endl;cout c c endl;cout str str endl;}MyClass()//构造函数{i 5;c a;str str in MyClass;}};voidtest(){//创建对象 claMyClass cla;//调用 成员函数printcla.print();}intmain(){test();return0;}运行效果可见我们只是创建了一个对象并没有对这个对象做任何操作。我们不用自己调用构造函数编译器在创建对象时自动调用构造函数为变量初始化。2.构造函数重载1.构造函数分类构造函数大概分无参构造、有参构造、拷贝构造三种上述代码中的构造函数就是一个典型的无参构造2.有参构造函数例如以下代码有参构造的3个重载123456789101112131415MyClass(inti){this-i i;}MyClass(inti,charc){this-i i;this-c c;}MyClass(inti,charc,string str){this-i i;this-c c;this-str str;}3.有参构造函数3个调用规则括号法1234//使用有参构造函数创建对象 cla2cla3,cla4MyClass cla2(10);MyClass cla3(10,b);MyClass cla4(10,b,str in MyClass_cla2);等号法123//使用有参构造函数创建对象(等号法)MyClass cla5 10;MyClass cla6 (10,b);直接调用构造函数1234//使用有参构造函数创建对象(调用构造函数)MyClass cla7 MyClass(10);MyClass cla8 MyClass(10,b);MyClass cla9 MyClass(10,b,str in MyClass);4.拷贝构造函数123456MyClass(MyClass cla){this-i cla.i;this-c cla.c;this-str cla.str;}注意拷贝构造函数的形参是自身类型的引用拷贝构造函数调用123//使用拷贝构造函数创建对象MyClass cla11(cla8);MyClass cla12 cla9;5.析构函数基本概念:在对象被释放时编译器会自动调用析构函数用于释放对象中变量的内存空间语法函数名 形参列表 { 函数实现 }注意1.构造函数不需要返回值类型2.构造函数的函数名为 ~(类名)特点函数名和类名相同且不用写返回值在创建对象时会自动调用。有人会问对象内存被释放时成员变量内存空间不是也被释放了吗