C++之构造析构

编程入门 行业动态 更新时间:2024-10-21 15:48:22

C++之构造析构

C++之构造析构

构造析构

  1. 构造函数
  2. 析构函数
  3. this指针

构造函数

  1. 什么是构造函数?

构造函数,它是一种特殊的函数,主要用来在创建对象时初始化对象,即为对象的成员变量赋初始值。

  1. 构造函数的特点
  1. 函数名和类名相同
  2. 没有函数返回值类型,也无函数返回值
  3. 如果一个类说明中没有显式的给出构造,系统将自动地给出一个缺省的(隐式)
    什么都不干的构造函数,<类名>(){};
  4. 如果说明中包括多个构造函数,一般会有不同的参数列表和函数体
  5. 一个新的对象被建立时,该对象的构造函数会自动地被调用,对这个对象进行初始化工作
  1. 构造函数声明及定义
<类名>::<类名>(){}class CStudent{int id;char name[20];public:CStudent()//无参构造 		类中声明且定义{id = 0;strcpy(name,”张三”);}CStudent(int i,char n[]);	类中声明在类外定义}
//在类外进行构造函数的定义,通过 :: 域访问符来表示该构造函数属于CStudent类CStudent::CStudent(int i,char n[]){id = i;strcpy(name,n);}
  1. 构造函数的调用
//无参构造的调用CStudent stu;CStudent *pStu = new CStudent();
//带参构造的调用CStudent stu(100,”张三”);CStudent *pStu = new CStudent(123,”李四”);

注意:只有公有属性的行为才允许在类外调用,所以构造基本为公有属性,如果构造为私有或保护属性,那么该类对象的正常创建会失败。

析构函数

  1. 什么是析构函数?

析构函数,它和构造函数一样,也是一种特殊的函数,主要用来在对象结束其生命周期时,系统自动执行析构函数。它往往用来做“清理售后”的工作。

  1. 构造函数的特点
  1. 函数名与类名相同,在前面加上一个~
  2. 没有函数返回值类型,也没有返回值,也没有参数
  3. 当对象出了他的作用域时,系统会自动调用析构函数;
  4. 一个类只有一个析构函数
  5. 如果一个类中没有显示的给出析构,析构将会自动给出一个(隐式)什么都不干的析构 ~类名() {}
  1. 析构函数的声明及定义
 <类名>::~<类名>(){}class CStudent{int id;char name[20];public:~CStudent()//无参构造 		类中声明且定义{}}
//在类外进行析构函数的定义,通过 :: 域访问符来表示该析构函数属于CStudent类CStudent::~CStudent(){}
  1. 析构函数的调用
CStudent *pStu = new CStudent;
delete pStu;		//自动调用类中析构函数

注意:只有公有属性的行为才允许在类外调用,所以析构基本为公有属性,如果析构为私有或保护属性,那么该类对象的正常结束生命周期会失败。

  1. 析构函数的使用

类中成员有在堆区分配动态内存的操作时,需要在析构函数里面进行该堆内存的释放,否则会导致指针使用时出现的常用问题,指向内存的指针不存在了,但堆内存还继续存在,造成内存泄露。

分析:类对象成员如果是指针的话,该对象成员只占指针的大小,指针另外指的堆内存是需要手动分配和释放的。类对象的生命周期结束时,只会结束该对象的内存,不会去主动结束该对象成员指针所指的堆内存。

this指针

  1. this指针

this指针是系统自动生成,且自动隐藏。

this指针并不是对象本身的一部分,它的作用域在类的内部。当类的普通函数在访问类的普通成员的时候,该this指针总是指向调用者对象。

  1. this指针的使用
  1. this->成员名;或者 (*this).成员名;
    表示当前调用者的某个成员。
  2. return this;
    表示返回当前调用者对象的首地址。
  3. return *this;
    表示返回当前调用者对象。
  1. this指针在代码中表现
//某类中有一个数据成员 int score;还有一个成员函数,如下:void fun(int num){score += num;} 
// 在上述函数中不管有没有主动加上this指针,对于编辑器来说会是:this->score += num;

在代码编写的过程中可以直接隐藏this指针。

//this指针在代码中表现
//如果参数与类成员的标识符相同,如下:void fun(int score){//score += score;//类成员名和形参名一致,会导致无法修改类成员this->score += score;//通过this指针指明左操作数为类成员数据}

练习代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
class Person
{
private:int id;string name;
public:Person(){id = 1;name="NULL";cout << "调用默认构造" << endl << "Id: " << id << endl << "Name: " << name << endl;}Person(int id, string name){this->id = id;this->name = name;cout << "调用默认带参构造" << endl << "Id: " << id << endl << "Name: " << name << endl;}void show(){cout << "Show()函数" << endl;}~Person(){cout << "调用默认析构" << endl;}
};
class A
{
public:int a=10;char c='a';string str = "Ye";
};
class B
{
public:A* a = nullptr;char c='b';A* d = new A;B(){a = new A();}~B(){if (a != NULL){delete a;a = NULL;}if (d != NULL){delete d;d = NULL;}}};class Student {char* name;
public:Student(const char* name){   this->name = new char[strlen(name) + 1];strcpy(this->name, name);}void show(){cout << "Name:" << name << endl;}Student* p(){return this;}~Student(){if (name != NULL){cout << name << "已释放" << endl;delete[]name;name = NULL;}}
};
int main()
{//A c;//B b; //cout << sizeof(c) << endl;//cout << sizeof(b) << endl;//Person p(1,"Yesir");//Person* p2 = new Person(2, "小叶");//p2->show();//delete p2;{Student stu("小叶");stu.p()->show();stu.show();}system("pause");return 0;
}

更多推荐

C++之构造析构

本文发布于:2024-02-27 05:48:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1705408.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!