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