C++学习笔记--对象创建
来源:互联网 发布:微博用户数据 编辑:程序博客网 时间:2024/05/20 17:26
一、对象创建
1、堆中对象的创建(Human类):
Human * p = new Human;//在堆中为一个没有名字的对象分配内存,调用了构造函数//虽然该对象没有名字,但是p指针指向该对象,所以我们可以通过指针p对对象进行操作,即p->成员名 或者 (*p).成员名
2、在栈中创建对象:
Human Mike;//创建了一个有名字的对象Mike,调用构造函数//而在栈中我们用(对象名.成员名)的方式对对象进行操作:Mkie.成员名。
二、对象的删除:
1、堆中对象删除:
delete p;p = NULL;//执行delete语句之后,调用了类中的析构函数释放存储空间,由堆回收。//如果不执行delete p;该块内存空间会一直无法被他人使用,直到程序结束。//p = NULL;是一个每当释放空间之后都要进行的操作,如果不讲指针p赋值为空,p指向的空间被分配给他人时,由于野指针的存在,造成大的安全隐患。//所以,养成一个每当释放一块内存时,都将指向该内存的指针赋空的习惯是十分有必要的。
2、栈中对象删除:
栈中对象在程序(函数)执行完毕之后会由系统来释放。对象也是如此。
三、举例(栈区对象、堆区对象、类中的指针变量成员与对应的堆中变量):
1、举例1(栈区对象、堆区对象):
# include <iostream>using namespace std;class Human{public: Human(){cout << "构造函数执行中..." << endl;i = 99;}//构造函数 ~Human(){cout << "析构函数执行中... "<< endl;} void get(int x){i = x;} int return_value()const{return i;}private: int i;//私有的成员变量};int main (void){/*创建栈中对象*/ Human Mike; cout << Mike.return_value() << endl; Mike.get(120); cout << Mike.return_value() << endl;/*创建堆中对象*/ Human * p = new Human;//堆中为Human类分配了四个字节的内存,此时调用了构造函数,并将首字节返回给指针p,只能通过指针p对堆内存进行操作 cout << p->return_value() << endl;//没有名字的对象,只能通过指针进行操作 p->get(102); cout << p->return_value() << endl; delete p;//没有释放类的堆内存时,析构函数不执行,而delete p以后就调用了析构函数 return 0;}
运行结果:
/* 构造函数执行中... 99 120 构造函数执行中... 99 102 析构函数执行中... //程序运行完毕自动执行 析构函数执行中... //运行delete p时才执行 Press any key to continue*/
2、举例2(栈区对象、堆区对象、类中的指针变量成员与对应的堆中变量):
# include <iostream>using namespace std;class Human{public: Human(){cout << "构造函数执行中..." << endl;i = new int(99);}//构造函数中开辟新的空间 ~Human(){cout << "析构函数执行中... "<< endl;delete i;} //因为delete p时会删除存储指针i的空间,所以析构函数中指针i指向的空间也必须释放 //否则i的自身空间释放后会导致内存泄漏,i不是对象所以不会调用析构函数 void get(int x){*i = x;} int return_value()const{return *i;}private: int * i;//私有的成员指针变量};int main (void){/*创建栈中对象,调用类中定义的堆中变量*/ Human Mike; cout << Mike.return_value() << endl; Mike.get(120); cout << Mike.return_value() << endl;/*创建堆中对象,调用类中定义的堆中变量*/ Human * p = new Human; cout << p->return_value() << endl; p->get(102); cout << p->return_value() << endl; delete p; return 0;}
运行结果:
构造函数执行中... 99 120 构造函数执行中... 99 102 析构函数执行中... 析构函数执行中... Press any key to continue
两段程序方法不同,但是运行结果是一样的。
四、总结:
1、析构函数就是用来释放为对象分配的内存的。
2、而对象在栈中创建时,只要函数执行完毕系统即会自动执行析构函数。
3、当对象在堆中创建,只有执行delete时才会调用析构函数(程序员自行控制)。
4、如果对象(栈中对象或堆中对象)调用了类中的堆中变量,那么对象释放(系统释放或自行释放)之前,必须提前在类中释放申请的堆中变量,否则会造成内存泄漏。
5、记住一句话:堆中内存只要申请,就必须自行释放。
1 0
- javascript创建对象学习笔记
- 学习笔记:创建JSONObject对象:
- C++学习笔记--对象创建
- 【C++】【学习笔记】【014】对象
- DirectSound学习笔记(2):创建设备对象
- JavaScript学习笔记,创建对象,属性访问
- Ajax学习笔记-XMLRequest对象的创建
- 【js学习笔记-028】-- 对象的创建
- JS学习笔记01-创建对象
- JavaScript学习笔记之创建对象
- JavaScript学习笔记二十一:创建对象
- ToLua学习笔记,创建一个游戏对象
- EffictiveJava学习笔记--创建和销毁对象
- JavaScript学习笔记-02对象创建方式
- js学习笔记:对象——创建对象
- JavaScript学习笔记6 面向对象之创建对象
- Object-c学习笔记十一-----对象初始化
- Objective-C 学习笔记 01 - 对象
- C# 创建和写入文件
- Penetration testing checklist based on OWASP Top 10 Mobile
- 链表反转算法
- eclipse查看jar包源代码乱码问题解决
- 大数据系列修炼-Scala课程68
- C++学习笔记--对象创建
- hdu 2098 素数打表
- Android 微信分享与QQ分享功能
- 代理模式
- sizeof与strlen用法详解(结构体对齐)
- 【C/C++】BOOST 线程完全攻略 - 基础篇
- socket编程接口介绍
- 原型模式(Prototype)
- 杭电ACM2001题-------C语言