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;
}
时间: 2024-09-30 04:19:52

C++学习笔记04的相关文章

Android自定义View学习笔记04

Android自定义View学习笔记04 好长时间没有写相关的博客了,前几周在帮学姐做毕设,所以博客方面有些耽误.过程中写了一个类似wp的磁贴的view,想再写个配套的layout,所以昨天看了一下自定义viewGroup的相关知识-晚上睡觉想了一下可行性不是很高-代码量还不如直接自己在xml上写来得快,速度上也是个问题.今天看了一下张鸿洋老师的Android 自定义View (三) 圆环交替 等待效果这篇博文,再加上前一段时间看到的一幅图,结合之前写的一个圆形imageView的实现博文And

【OpenGL 学习笔记04】顶点数组

通过之前的学习,我们知道,如果要绘制一个几何图形,那就要不断的调用绘制函数,比如绘制一个20条边的多边形,起码要调用22条函数(包含glBegin和glEnd). 所以OpenGL提供了一系列的顶点数组函数减少函数调用的次数来提高性能.而且使用顶点还可以避免顶点共享的冗余处理. 1.简单示例 先来回顾一下之前我们是怎么画直线的: void drawOneLine(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2) { glBegin(GL_LINES); g

SWIFT学习笔记04

1.在实际编译时,Swift 编译器会优化字符串的使用,使实际的复制只发生在绝对必要的情况下,这意味着您将字符串作为值类型的同时可以获得极高的性能. 2.for character in "Dog!" { println(character) } // D // o // g // ! 3.通过标明一个Character类型注解并通过字符字面量进行赋值,可以建立一个独立的字符常量或变量: let yenSign: Character = "¥" 4.计算字符数量 l

HTML学习笔记04

HTML学习笔记04 一.HTML样式 1.外部样式表:例如<link rel="stylesheet" type="text/css" href="mystle.css"> 2.内部样式表:在head部分通过<style>定义内部样式表,如<style type="text/css"> p{margin-left:20px}</style> 3.内联样式:在相关的标签中使用样式

[原创]java WEB学习笔记04:Servlet 简介及第一个Servlet程序

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

scala 学习笔记(04) OOP(上)

一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person { var name: String = _ /** * 从构造器 * @param name */ def this(name: String) = { this //注意:从构造器,必须先调用主构造器 this.name = name; } override def toString = { "

Elasticsearch学习笔记-04修改数据

Elasticsearch提供了近乎实时操作和检索数据的能力.默认情况下,在你新增/更新/删除数据之后,大概只有一秒的延迟即可反应在最新的搜索结果中.和其他的平台例如SQL的及时生效比较起来还是有比较大的区别的. (新建)索引/替换文档我们之前已经知道了如何索引一个文档,咱们再来复习一下: PUT /customer/external/1?pretty { "name": "John Doe" } 上面的命令会在customer索引中创建external类型的ID为

Elasticsearch学习笔记-04.1更新文档

除了创建和替换文档,我们也可以更新文档.需要注意的是Elasticsearch在底层并不会整的更新文档.当我们执行更新操作的时候,Elasticsearch会一次性完成先删除,再新建一个文档.下面的例子示意了如何将我们之前索引的ID为1的文档的name字段修改为"Jane Doe": POST /customer/external/1/_update?pretty { "doc": { "name": "Jane Doe" }

Elasticsearch学习笔记-04.2删除文档

删除文档非常的简单而直观.下面的例子示意了如何删除我们之前创建的ID为2的客户文档: DELETE /customer/external/2?pretty 要删除所有满足检索条件的文档可以参考 [Delete By Query API].不过这个API并没有太大价值,因为删除整个索引要比删除索引中的满足条件的所有的文档来的更高效. 本文系本人根据官方文档的翻译,能力有限.水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸. https://www.elastic.c

一行一行分析JQ源码学习笔记-04

jquery添加方法和属性 jquery.fn=jquery.prototype ={ jquery版本 } construtor  指向修正 js源码中 fun  aaa(){} 会自动生成一句   aaa.prototype.constructor = aaa ; 容易被修改所以需要修正 aaa.prototype= { name:"hello", age:"20", } 与 aaa.prototype= { aaa.constructor :aaa; name