C++之构造析构
构造析构
- 构造函数
- 析构函数
- this指针
构造函数
- 什么是构造函数?
构造函数,它是一种特殊的函数,主要用来在创建对象时初始化对象,即为对象的成员变量赋初始值。
- 构造函数的特点
- 函数名和类名相同
- 没有函数返回值类型,也无函数返回值
- 如果一个类说明中没有显式的给出构造,系统将自动地给出一个缺省的(隐式)
什么都不干的构造函数,<类名>(){};- 如果说明中包括多个构造函数,一般会有不同的参数列表和函数体
- 一个新的对象被建立时,该对象的构造函数会自动地被调用,对这个对象进行初始化工作
- 构造函数声明及定义
<类名>::<类名>(){}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);}
- 构造函数的调用
//无参构造的调用CStudent stu;CStudent *pStu = new CStudent();
//带参构造的调用CStudent stu(100,”张三”);CStudent *pStu = new CStudent(123,”李四”);
注意:只有公有属性的行为才允许在类外调用,所以构造基本为公有属性,如果构造为私有或保护属性,那么该类对象的正常创建会失败。
析构函数
- 什么是析构函数?
析构函数,它和构造函数一样,也是一种特殊的函数,主要用来在对象结束其生命周期时,系统自动执行析构函数。它往往用来做“清理售后”的工作。
- 构造函数的特点
- 函数名与类名相同,在前面加上一个~
- 没有函数返回值类型,也没有返回值,也没有参数
- 当对象出了他的作用域时,系统会自动调用析构函数;
- 一个类只有一个析构函数
- 如果一个类中没有显示的给出析构,析构将会自动给出一个(隐式)什么都不干的析构 ~类名() {}
- 析构函数的声明及定义
<类名>::~<类名>(){}class CStudent{int id;char name[20];public:~CStudent()//无参构造 类中声明且定义{}}
//在类外进行析构函数的定义,通过 :: 域访问符来表示该析构函数属于CStudent类CStudent::~CStudent(){}
- 析构函数的调用
CStudent *pStu = new CStudent;
delete pStu; //自动调用类中析构函数
注意:只有公有属性的行为才允许在类外调用,所以析构基本为公有属性,如果析构为私有或保护属性,那么该类对象的正常结束生命周期会失败。
- 析构函数的使用
类中成员有在堆区分配动态内存的操作时,需要在析构函数里面进行该堆内存的释放,否则会导致指针使用时出现的常用问题,指向内存的指针不存在了,但堆内存还继续存在,造成内存泄露。
分析:类对象成员如果是指针的话,该对象成员只占指针的大小,指针另外指的堆内存是需要手动分配和释放的。类对象的生命周期结束时,只会结束该对象的内存,不会去主动结束该对象成员指针所指的堆内存。
this指针
- this指针
this指针是系统自动生成,且自动隐藏。
this指针并不是对象本身的一部分,它的作用域在类的内部。当类的普通函数在访问类的普通成员的时候,该this指针总是指向调用者对象。
- this指针的使用
- this->成员名;或者 (*this).成员名;
表示当前调用者的某个成员。- return this;
表示返回当前调用者对象的首地址。- return *this;
表示返回当前调用者对象。
- 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++之构造析构
发布评论