c++学习笔记(二)

1. c++单例模式为什么不在析构函数中释放静态的单例对象,而要加一个内嵌类
你自己试试,析构函数里delete单例对象跟delete this有什么区别?
你知道delete不仅仅是释放内存,还要先调用要释放对象的析构函数吗?
所以析构函数里delete自己,那不是就会造成析构函数无限递归下去吗?
而你写进去发现,根本没有死递归的话,建议你放句输出在析构函数里试试,看看这个单例析构函数有没有被执行?
这就是为什么要内嵌一个类来进行安全析构单例对象的原因。
2.stringstream对象(<sstream>)
如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;
在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。
stringstream 主要是用在將一個字串分割,可以先用 clear( )以及 str( ) 將指定字串設定成一开始的內容,再用 >> 把个別的资料输出。
stringstream通常是用来做数据转换的。
stringstream不会主动释放内存(或许是为了提高效率),但如果你要在程序中用同一个流,反复读写大量的数据,将会造成大量的内存消 耗,因些这时候,需要适时地清除一下缓冲 (用 stream.str("") )
stringstream  提供的转换和/或格式化 
stringstream 对象的一个常见用法是,需要在多种数据类型之间实现自动格式化时使用该类类型。例如,有一个数值型数据集合,要获取它们的 string 表示形式,或反之。sstream 输入和输出操作可自动地把算术类型转化为相应的 string 表示形式,反过来也可以。
3.cin\cout\cerr重定向文件:
#include <iostream>
#include<fstream>
#include<streambuf>

int main(int argc, char** argv) {
 using namespace std;
 
 ofstream fout("t.txt");
 streambuf* old=cerr.rdbuf(fout.rdbuf());
 cerr<<"there is something error"<<endl<<"c++ error"<<endl;
 cout<<"hello error"<<endl;
 cerr.rdbuf(old);
 fout.close();
 
 return 0;
}
将cerr错误输出重定向文件,同理也可以对cout,cin进行重定向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值