接上一篇
问题,如何在Main函数之前/之后执行某个动作?
答案,可以用全局对象的构造函数和析构函数来实现
对象本身占用的空间会在超出作用范围时或者delete时自动释放,如果对象还额外分配了资源,可以在析构函数中释放额外资源。
#include<iostream> using namespace std; #include <string> class Buffer{ string name; public: Buffer(const string& filename):name(filename){ cout<<"为"<<filename<<"分配缓冲区"<<endl; } ~Buffer(){ cout<<"清理"<<name<<"的缓冲区"<<endl; } }; class File{ string path; Buffer* bf; public: File(const string& path="无名"):path(path),bf(0)//第一个path是成员,第二个是形参 { cout<<this<<"创建文件:"<<path<<endl; } ~File(){ cout<<this<<"释放对象:"<<path<<endl; } void open(){ bf = new Buffer(path);//分配缓冲区资源 } void close(){ delete bf;bf = NULL;//释放缓冲区资源 } }; int main() { File a("a"); File* p2 = new File("D:\My Documents\Visual Studio 2010"); a.open(); p2->open(); delete p2;p2=NULL; system("pause"); return 0; }
匿名对象
直接定义一个对象但不给提供名字,这个对象会在这个语句之后就立即释放,而且编译器能对匿名对象做最大限度的优化性能。提倡使用匿名对象,前提是它是一次性的对象。
常规定义对象方式:类名 变量名(参数);匿名对象没有变量名:类名 (参数) 对象只能当场使用。
只有一个参数时,匿名对象可以看成类型转换。
如果要禁止自动用匿名对象实现类型转换,可以用explicit来修饰构造函数
#include <iostream> using namespace std; class R{//分数类 int n;//分子 int d;//分母 public: explicit R(int n,int d=1):n(n),d(d){//初始化列表 加了explicit禁止本构造函数用于自动类型转换 cout<< "R(" <<n << ‘/‘ << d<< ")" <<endl; } ~R(){ cout << "~(" << n << "/" << d<< ")" <<endl; } R add(const R& r2){ int nd = d * r2.d; int nn = d*r2.n + n*r2.d; return R(nn,nd); //匿名对象 } void show(){ cout << n << "/" << d << endl; } }; int main() { R a(2,5), b(3,8); a.add(b).show(); cout << "-----------------"<<endl; a.add(R(3,8)).show();//匿名对象 cout << "-----------------"<<endl; a.add(R(3)).show();//匿名对象 cout << "================="<<endl; a.add((3)).show();//通过匿名对象自动类型转换R(3) 构造函数没加explicit可以编译 //构造函数加了explicit 后: //错误 1 error C2664: “R::add”: 不能将参数 1 从“int”转换为“const R &” cout << "================="<<endl; system("pause"); return 0; }
时间: 2024-09-30 04:19:52