临时对象

来源:互联网 发布:苹果8连不上数据 编辑:程序博客网 时间:2024/05/15 04:31

//临时对象是在堆栈中形成的,析构函数执行后,但是对象仍在那个地方,而且你的指针还指向那里.
//任何时候我们都可以通过指针来调用成员函数,即使是强制类型转换的也可以.
//比如说这样 ((Point *)0)->f();

//上面的解释:非成员函数,与普通的C全局函数一样,存放在代码段里,所以就像普通函数一样,所有Point类的对象或者指针都可以使用,
#include<iostream>
#include<string>
using namespace std;

class Point{
public:
 Point() { cout<<"Point()"<<endl;}
 ~Point() { cout<<"~Point()"<<endl;}
 f() {cout<<"f()"<<endl;}
};

int main()
{
   string* p=& string();  //临时对象,在将地址赋给P后随即析构,但P还指向原来的地址,但已经无效
   Point* p2=& Point();   //与上面的情况相同
   ((Point*)0)->f();
   p2->f();              
   return 0;
}


/*output*/
/* Point()
   ~Point()
   f()
 */

 

//通过析构函数我们可以释放资源,那么你再访问这些资源就会无效.
//实例代码如下,程序会崩溃.
//关键【资源】二字
/*#include <iostream>
#include <string>
using namespace std;

class Point{
public:
    Point() { cout <<"Point()" <<endl;p="123";}
    ~Point() { cout <<"~Point()" <<endl;p=NULL;}
    void f() {cout <<"f()" <<endl;cout<<p<<endl;}
private:
    char *p;
};

int main()
{
    string* p=& string();
    Point* p2=& Point();
    p2->f();            
    return 0;
}*/