科锐课堂笔记:2017/4/12 单例模式与运算符重载

来源:互联网 发布:java权限管理如何实现 编辑:程序博客网 时间:2024/06/05 19:53

  单例模式是一种设计模式,一般应用在资源操作、配置信息等,所有方法都共享使用一个实例进行同步维护。
  以C++为例子,如何让单例类产生并且只有一个对象?首先把类的构造与析构函数声明成私有,这样一来外部就无法直接实例化该单例类,想要创建或得到该类惟一的对象必须调用类的创建接口——一个公有的静态成员函数。函数中使用静态变量存放已创建的类对象指针,如果初次调用就新建一个否则返回已创建的。有创建接口对应的也应该有释放接口,这样使用类接口创建/得到的对象都是同一个对象,类似一个全局对象。


  类对象作为函数参数传递,同其他基本类型一样将实参赋值到栈上的形参(形参新建对象),将发生拷贝构造。类对象作为函数返回值,编译器会在调用者里分配一块对象大小的局部空间,当调用函数返回时其实就是向此局部空间里进行赋值操作(同样可以看作是新建一个局部类对象,发生拷贝构造),调用者对返回对象的传值或引用使用的就是这块空间,从上层抽象理解是一个隐藏的局部对象变量,然后编译器会在调用该语句结束后对隐藏局部对象进行析构。
  编译器DEBUG版自作多情的奇怪优化支持:
  1.如果调用返回值是类的函数,并把返回值赋值给一个初始化类对象(定义时赋值),编译器不会分配隐藏局部对象空间,把初始化对象和隐藏对象合并了,把初始化对象看作隐藏对象,编译器只生成调用隐藏对象的拷贝构造函数(没有初始化对象的拷贝构造,合并成一次了),调用语句结束后也没有隐藏对象的析构函数代码(两者一体了肯定不能调析构)。
  2.函数返回值是类的话,如果函数返回一个基本类型,等于是返回了一个调用该基本类型为参数的构造函数的无名对象。
  3.函数返回无名对象会与隐藏局部对象合并,合并后不会调用隐藏局部对象的拷贝构造。


  C++支持自定义类型(类)的运算符重载,除了“.”、“.*”、“::”、“?:”这几个运算符无法重载外,其他的运算符都能实现重载操作,但无法改变运算符原有的优先级及目数。为自定义类型重载运算符时,一般不去改变运算符原有的语义,运算符重载语法:返回类型 operator运算符(目数参数列表)。本质上重载运算符函数也是一个成员函数。




0 0
原创粉丝点击