C++学习笔记04

接上一篇

问题,如何在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;
}

 

posted @ 2016-05-03 00:23  Visions  阅读(151)  评论(0编辑  收藏  举报