没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
在一个类中,如果类没有指针成员,一切方便,因为默认合成的析构函数会自动处理所有的内存。但是如果一个类带了指针成员,那么需要我们自己来写一个析构函数来管理内存。在<<c>> 中写到,如果一个类需要我们自己写析构函数,那么这个类,也会需要我们自己写拷贝构造函数和拷贝赋值函数。 析构函数: 我们这里定义一个类HasPtr,这个类中包含一个int 类型的指针。然后定义一个析构函数,这个函数打印一句话。 HasPtr.h 类的头文件 #pragma once #ifndef __HASPTR__ #define __HASPTR__ class HasPtr { public: H
资源推荐
资源详情
资源评论
C++带有指针成员的类处理方式详解带有指针成员的类处理方式详解
在一个类中,如果类没有指针成员,一切方便,因为默认合成的析构函数会自动处理所有的内存。但是如果一个类带了指针成
员,那么需要我们自己来写一个析构函数来管理内存。在<<c++ primer>> 中写到,如果一个类需要我们自己写析构函数,那
么这个类,也会需要我们自己写拷贝构造函数和拷贝赋值函数。
析构函数:
我们这里定义一个类HasPtr,这个类中包含一个int 类型的指针。然后定义一个析构函数,这个函数打印一句话。
HasPtr.h 类的头文件
#pragma once
#ifndef __HASPTR__
#define __HASPTR__
class HasPtr
{
public:
HasPtr(int i,int *p);
//HasPtr& operator=(HasPtr&);
//HasPtr(const HasPtr&);
~HasPtr();
int get_ptr_value();
void set_ptr_value(int *p);
int get_val();
void set_val(int v);
private:
int val;
int *ptr;
};
#endif // !__HASPTR__
HasPtr.cpp 类的实现
#include "stdafx.h"
#include <iostream>
#include "HasPtr.h"
using namespace std;
HasPtr::HasPtr(int i, int *p)
{
val = i;
ptr = p;
}
int HasPtr::get_ptr_value()
{
return *ptr;
}
void HasPtr::set_ptr_value(int *p)
{
ptr = p;
}
int HasPtr::get_val()
{
return val;
}
void HasPtr::set_val(int v)
{
val = v;
}
HasPtr::~HasPtr()
{
cout << "destructor of HasPtr " << endl;
}
ClassWithPointer 类,包含main入口,HasPtr在stack上。
// ClassWithPointer.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include "HasPtr.h"
using namespace std;
int main()
{
int temp = 100;
HasPtr ptr(2,&temp);
cout << ptr.get_ptr_value() << endl;
cout << ptr.get_val() << endl;
system("PAUSE");
system("PAUSE");
return 0;
}
执行该入口方法,发现最后还是打印了析构函数这句话,OK,在main 方法中,stack上定义了一个HasPtr,在main方法退出
前,析构函数自动调用了。
如果将HasPtr改为动态对象,也就是放在堆上呢?
ClassWithPointer 类,包含main入口,HasPtr在heap上。
// ClassWithPointer.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include "HasPtr.h"
using namespace std;
int main()
{
int temp = 100;
//HasPtr ptr(2,&temp);
HasPtr *ptr = new HasPtr(2,&temp);
cout << ptr->get_ptr_value() << endl;
cout << ptr->get_val() << endl;
system("PAUSE");
return 0;
}
执行一下,发现析构函数没有调用。OK,我们在return 0前面添加一个delete ptr; 析构函数执行了。
所以,这里有两个结论:
当一个对象在stack 上时,析构函数自动调用。
当一个对象在heap上时,需要调用delete 语句,析构函数才会被执行。
现在在析构函数中调用delete 语句来删除指针成员。
头文件不变,HasPtr.cpp 文件代码如下:
#include "stdafx.h"
#include <iostream>
#include "HasPtr.h"
using namespace std;
剩余7页未读,继续阅读
weixin_38543749
- 粉丝: 1
- 资源: 929
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Wafer - 企业级微信小程序全栈方案.zip
- Vue,React,微信小程序,快应用,TS , Koa, JS 一把梭.zip
- unocss微信小程序预设,unocss小程序默认,在 taro uniapp 原生小程序中使用unocss.zip
- c++ -msvc-chrono.hpp 时间类: 对本头文件的注释,以便于理解 STL 里引入的时间方面的操作
- uni-app小程序.zip
- uni-app echarts vue2专用小程序.zip
- spritejs 小程序版.zip
- scrm小程序.zip
- Java制作统计工资的示例工程
- paho.mqtt.wxapp可以让你在微信小程序里连接MQTT代理,在小程序里实现控制硬件,也可用于游戏 .zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页