- 博客(40)
- 资源 (2)
- 收藏
- 关注
原创 读书笔记《Effective c++》 条款24 若所有参数皆需要类型转换,请为此采用non-member函数
这节的例子很简单,就是类外定义操作符重载,一个二元操作符,对于本身出现在操作符的右边的表达式,是需要定义一个两个参数的non-member重载的,这个和是否是需要类型转换并没有绝对的关系,我还是没有get到本小节的点。结论: 如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member。
2018-01-10 16:34:09
234
原创 读书笔记《Effective c++》 条款23 宁以non-member,non-friend替换member函数
本节的介绍感觉更像是内容与接口的设计实现,书中以浏览器为例,浏览器class提供一系列的功能,并封装一系列的数据,如果要增加其他内容可以在相同的名字空间内独立出不同的头文件,就像stl中的做法,例如,可以有下载头文件、工具头文件、影响头文件,而这些功能都不是直接放在class里,这是封装的另一个含义,让私有变量被更少的函数访问。对这个我现在的理解不深,记住就好了,在实际项目中能想起还有这么一条
2018-01-10 15:58:12
221
原创 读书笔记《Effective c++》 条款22 将成员变量声明为private
本节主要是可见性和封装的问题。结论: a.切记将成员变量声明为private。这可赋予客户访问数据的一致性、可细微划分访问控制、允诺约束条件获得保证,并提供class作者以充分的实现弹性。 b.protected并不比public更具有封装性。
2018-01-10 14:58:17
180
原创 读书笔记《Effective c++》 条款21 必须返回对象时,别妄想返回其reference
本节举例说明了函数返回一个对象的引用有很多坑,尤其是对这种operator*类的函数,因为客户可能会这么写:a*b*c,这样,即使在堆上分配对象,也会陷入用户无法对其调用delete的深坑,所以其实最简单的做法就是直接by value返回一个新对象,这样虽然你可以说效率不高,但是却是最安全的做法。而关于效率的问题就交给编译器吧,编译器会决定是否对你的返回值进行优化(RVO)。不在项目初
2018-01-10 14:51:25
175
原创 读书笔记《Effective c++》 条款20 宁以pass-by-reference-toconst替换pass-by-value
默认情况下,c++以by value方式传递对象(函数参数、返回值),这些副本是由对象的copy构造函数产出。传值有两个问题:a.效率低下。b.可能产生对象切割(slicing)问题class Base{public: virtual void test() const { cout << "base.test()" << endl; }
2018-01-10 14:22:46
144
原创 读书笔记《Effective c++》 条款19 设计class犹如设计type
a.新type的对象应该如何被创建和销毁。new,new[],delete,delete[]b.对象的初始化和对象的赋值该有什么样的差别?c.新type的对象如果被passed by value,意味着什么?copy构造函数用来定义一个type的pass by valued该如何实现。d.什么是新type的“合法值”?限定新type的值集。e.你
2018-01-10 10:58:53
178
原创 读书笔记《Effective c++》 条款18 让接口容易被正确使用,不易被误用
a.提供给客户的接口,最好能在编译器就检查出错误。例如给参数限定有限制的类型。b.自定义类型的接口尽量与内置类型兼容,降低客户理解成本和出错风险。c.接口如果要求客户记住某件事,那么这个接口就有着“不正确使用”的倾向,因为客户很可能会忘记那件事。 例如,指向数组的只能指针的例子,下面的写法有两个要点: 1.返回的是智能指针,不需要客户去delete。 2.
2018-01-09 21:23:33
193
原创 读书笔记《Effective c++》 条款17 以独立语句将newed对象置入智能指针
假设有一个函数:int priority();void processWidget(std::share_ptr pw, int priority1);调用的时候可能会这么写:processWidget(std::share_ptr{ new Widget }, priority());在调用processWidget之前,编译器必须创建代码,做以下三件事:
2018-01-09 19:59:07
173
原创 读书笔记《Effective c++》 条款16 成对使用new和delete时要采用相同形式
这个没什么好说的了,如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。因为数组的内存布局和普通对象的内存布局不同,混用是UB,具体的布局和编译器实现有关,不过多讨论。
2018-01-09 17:58:35
147
原创 读书笔记《Effective c++》 条款15 在资源管理类中提供对原始资源的访问
结论:a.APIs往往要求访问原始资源,所以每一个RAIIclass应该提供一个取得其所管理的资源的办法,例如智能指针的get()方法。b.对原始资源的访问可能经由显示转换或隐式转换。一般而言显式转换比较安全,但隐式转换对客户比较方便,当然比较常见的做法是显示转换。
2018-01-09 17:43:03
141
原创 读书笔记《Effective c++》 条款14 在资源管理类中小心copying行为
当持有资源的类进行copying动作的时候要注意,指向资源的指针(假定是指针)也被复制了,也就是指向资源的指针数量又1个变为2个,那么资源什么时候释放就是个必须关心的问题了。还好shared_ptr可以解决这个问题,将指向资源的指针换成是shared_ptr指针,这样,我们不需要关心具体什么时候释放资源,因为在所有shared_ptr都失效之后资源会自动释放。而且,shared_p
2018-01-09 17:27:26
169
原创 读书笔记《Effective c++》 条款13 以对象管理资源
所谓资源就是,一旦用了它,将来必须还给系统。本书出版较早,所以书中介绍的是auto_ptr和tr1::shared_ptr,而在现在c++11中完善了原来的auto_ptr,增加了几种智能指针,这方面资料很多,这里只引用别人的一篇文章:http://blog.csdn.net/zy19940906/article/details/50470087智能指针就是所谓的RAI
2018-01-09 16:39:16
190
原创 读书笔记《Effective c++》 条款12 复制对象时勿忘其每一个成分
名词: copying函数 = 拷贝构造函数 + 赋值操作符重点是:当你自己要编写一个copying函数时,请确保: a.复制所有local成员变量 b.调用所有base class内的适当的copying函数。(拷贝构造函数是在初始化列表调用base class的函数,赋值操作符是在函数体调用Base::operator=(rhs))另外,这两个co
2018-01-09 13:40:36
145
原创 读书笔记《Effective c++》 条款11 在operator= 中处理“自我赋值”
例如:*px = *py 而px和py指向同一个对象,就出现了自我赋值class Bitmap{};class Widget{ //...private: Bitmap* pb;};//下面是operator=的实现代码Widget& Widget::operator=(const Widget& rhs){ // 通常是在这里加一个“证同测试”,但是这还是不具备“异常安
2018-01-09 10:39:21
170
原创 读书笔记《Effective c++》 条款10 令operator= 返回一个reference to *this
这个主要的点是,赋值可以写成连锁形式:int x, y, z;x = y = z =15;class Widget{public: Widget& operator+=(const Widget& rhs) { //... return *this; } Widget& operator=(int rhs) { //... return *this; }
2018-01-09 09:49:26
124
原创 读书笔记《Effective c++》 条款09 绝不在构造和析构函数中调用virtual函数
这点确实要注意,这个和delphi中是不一样的,不过也可以理解成delphi的create函数并不等同于c++的构造函数。using std::cout;using std::endl;using std::string;class A{public: A() { test(); }protected: virtual void test() const {
2018-01-08 21:56:57
172
原创 读书笔记《Effective c++》 条款08 别让异常逃离析构函数
析构函数抛出异常会导致后面的清理资源语句得不到机会执行,会导致资源泄漏。结论:a.析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下(不传播)他们或者结束程序。b.如果客户需要对某个操作函数运行期间抛出异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作,例如:对于一个连接对象DBConnect他应该公开
2018-01-08 21:30:34
165
原创 读书笔记《Effective c++》 条款07 为多态基类声明virtual析构函数
这个其实不用多说,用过OO类的语言应该都要这样。这么看来简单的对象和delphi的对象结构差不多。书中说c++不支持final,在c++11中已经支持了,所以如果不希望类被继承,可以加上finalc++的final有两个用途:1.阻止类被继承2.组织虚函数被overridestl中的容器类之类的按说应该都是final的,他们没有虚析构函数,所以不应该继承他们
2018-01-08 21:07:38
132
原创 读书笔记《Effective c++》 条款06 若不想使用编译器自动生成的函数,就应该明确拒绝
如果不希望编译器自动生成一些函数,例如树叶类不喜欢有赋值构造函数,因为“世界上没有完全相同的两片叶子”,有两个方法:a.本书中介绍的,将其声明为private而且不提供函数实现。 只声明成private还是不够,因为其他成员函数和friend函数还是能调用,所以好的做法还要不提供函数实现,当然,声明中最好也不写参数名。 当然,可以声明一个base cla
2018-01-08 17:29:51
163
原创 读书笔记《Effective c++》 条款05 了解c++默默编写并调用哪些函数
编译器会案子为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数。但是,如果此类的成员类型会导致编译器比较难以理解生成构造函数的样子的时候,编译器会拒绝为其生成默认的成员函数。例如:class Test{private: std::string& nameValue; const int objectValue;};
2018-01-08 17:16:03
125
原创 读书笔记《Effective c++》 条款04 确定对象被使用前已经被初始化
a.对于内置类型,必须手工完成初始化,对于除此以外的东西,初始化的责任落在构造函数上。 (疑问:书上说如果在带参构造函数中给成员赋值而不是使用初始化列表的话,会首先调用default构造函数为成员设初始值,然后立刻对他们赋予新值,但在我只的测试代码中,default构造函数并没有被调用,这里我的理解是,可能并不是调用default构造函数,而是调用了和default构造函数相同的底层
2018-01-08 16:58:37
179
原创 读书笔记《Effective c++》 条款03 尽可能使用const
const是一种约束,告诉编译器和其他程序员,这个值不要被修改。a.函数返回值是常量: 例如有理数的乘法重载:const Rational operator* (const Rational& lhs, const Rational& rhs);这样写可以避免一些暴行,例如 Rational a, b, c;(a * b) = c;b.const成员函数将const实
2018-01-08 15:35:59
192
原创 读书笔记《Effective c++》 条款02 尽量用const,enum,inline代替#define
1.尽量用const,enum,inline代替#define以编译器代替预处理器。a.使用#define可能导致编译器错误信息不明显,而常量会进入符号表。b.#define没有作用域的限定。c.当编译器不支持类内静态常量初始化,而又必须使用此常量来定义数组时(编译器要求编译期就能计算出数组的长度),可以使用the enum hack,enmu{MAX_LEN = 50};the
2018-01-08 11:21:28
156
转载 初学者应该知道的关于StdAfx.h的方方面面 fd
这篇文章是为了那些将要在VS下编译C++的初学者而写的。在一个不熟悉的环境中,所有东西看起来都是奇怪且复杂的,对于初学者来说,StaAfx.h这个会在编译期导致奇怪错误的文件会让他们特别愤怒。到最后,结局就是他们会在每一个项目中删掉预编译头文件。我们写这个文章的目的是帮助VS新手彻底解决这问题。预编译头的目的预编译头文件的目的是为了提示项目的构建速度。当使用VC++时,程序员通常是写一个很
2017-11-27 23:22:54
981
原创 [读书笔记]《一本书读懂财报》
企业一辈子的三件事:经营、投资、融资。经营活动:生产产品,销售产品,回收货款,这些企业每天都在做的事情就叫经营活动;投资活动:开展新业务,设计新产品,都需要进行投资;融资活动:跟银行借钱,找别人来投资自己;资产: 流动资产:在一年或者超过一年的一个营业周期内变现或者运用的资产(按转换为现金的速度来排序) 货币资金:现金、银行存款等,有专门用途的货币资金不算。
2017-09-25 16:43:41
3557
原创 [delphi] windows消息
windows消息的结构 TMsg = packed record hwnd: HWND;//窗口句柄 message: UINT;//消息标识 wParam: WPARAM;// lParam: LPARAM;// time: DWORD;//消息创建的时间 pt: TPoint;//消息创建时鼠标所在位置 end;
2016-12-18 18:11:20
308
转载 MySQL explain执行计划解读
感谢作者分享 http://blog.csdn.net/xifeijian/article/details/19773795本文我们主要介绍了MySQL性能分析以及explain的使用,包括:组合索引、慢查询分析、MYISAM和INNODB的锁定、MYSQL的事务配置项等,希望能够对您有所帮助。1.使用explain语句去查看分析结果 如explain select
2016-10-23 14:15:11
185
转载 mysql字符集编码设置与查看命令
在mysql对字符编码的查看我们使用SHOW VARIABLES LIKE character即可,修改我们需要修改my.ini中的配置方法了,下面我一起来看看。最近,在项目组使用的mysql数据库中,插入数据出现乱码,关于这个问题做了下总结,我们从最基本的地方说起,到错误产生的深层次原因和解决办法。基本概念:• 字符(Character)是指人类语言中最小的表义符号。
2016-10-09 15:41:21
6840
原创 FastMM相关
1.使用了FullDebugMod后,不显示行号? 要显示行号需要在delphi中勾上"Debug Information","Reference Info" "Use Debug DCUs"2.使用borlndmm.dll替换了IDE自带的以后,双开IDE然后关闭其中一个时会报错 编译DLL时要设置“NeverUninstall”3.使用了FullDebugMode后,报$8
2016-09-18 19:59:08
548
转载 操作系统 /3GB /PAE 参数详解
问题描述:在 Windows®32 位系统上,当Domino® 服务器负载很大或者运行很复杂的应用程序时,可能会由于占用内存太多而意外宕机。具体的说,某个特定的进程占用的内存可能会达到用户地址空间的上限。在默认状况下,Windows 32位系统上用户地址空间是 2 GB。在 Domino 服务器负载过大时,进程占用的内存可能很快就达到了上限。原因:所有的32位应用程序都有4
2016-01-27 14:31:37
2532
原创 关于重叠io完成例程中的sleepEx()
写完成例程demo时发现一个问题,在这里记录一下。对完成例程的介绍中,一般书上还有网上的资料代码都会说在投递完成例程后要调用SleepEx()或者类似的函数使线程处于一种警觉的等待状态,这样线程就会去处理自己apc队列里的apc请求,所以我在我的demo中也是这样做的,测试了一下没有问题。但是后来我试着把SleepEx删掉结果也是正常的,这就奇怪了,如果不调用sleepex之类的函数,
2015-09-24 18:03:09
917
原创 重叠ioWSARecv函数10014错误
这几天心血来潮想自己再动手写写各个网络io模型,以前只是写过简单的demo,实际工作中也没用过,基本忘的也差不多了,现在想重新写一下,没想到还是有收获的,这里记录其中一点。今天写到重叠io-完成例程模型,WSARecv函数一直返回10014错误,错误码解释是:Bad address.The system detected an invalid pointer address i
2015-09-18 09:34:55
2026
转载 Windows Socket IO 模型
谢谢原作者分享:http://www.cppblog.com/huangwei1024/archive/2010/11/22/134205.htmlWindows Socket IO 模型套接字架构应用程序使用Winsock与传输协议驱动沟通时AFD.SYS负责缓冲区的管理。这就意味着当一个程序调用send或者WSASend发送数据时,数据将被复制到AF
2015-09-11 20:18:33
381
转载 listen()的backlog参数和未完成队列、已完成队列的关系
listen函数是网络编程一个基本的函数,而且它的backlog参数却是和TCP协议息息相关的。我们来看一下一个backlog参数到底有多少秘密。一、 为了理解backlog参数,我们必须首先认识listen函数。点击(此处)折叠或打开#includesys/socket.h>int listen(int sockfd, int backlog)
2015-09-11 14:28:55
1453
转载 webserver com+遇到的问题
最近正在Delphi2007开发一个Web Service,由于系统不仅要在Intranet中使用,还要在Internet中使用,如果服务端用COM+的话客户端的分发、防火墙的透过、安全部署等等都是非常难以解决的问题,而如果单纯使用Web Service又不能使用MS SQL Server的Pooling,用户数一多的话服务器的负荷可能会很大,而且很有可能当机,如果真发生这种的情况的话,基本上这个
2015-08-28 18:28:20
489
转载 BloomFilter——大规模数据处理利器
本文转自:http://www.cnblogs.com/heaad/archive/2011/01/02/1924195.html,谢谢原作者分享。 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。 一. 实例 为了说明Bloom Filter
2015-08-24 11:01:31
298
原创 [读书笔记]crt静态链接注意模块间内存传递
谁申请,谁释放。VOID ExeFunc(){ PVOID pv = DLLFunc(); // do somtehing via pv free(pv);}PVOID DLLFunc(){ return(malloc(100));}上面的代码表示,在DLL的函数DLLFunc申请内存,而在Exe的函数ExeFunc()中释放,有问题吗?不一定。结果
2015-08-21 17:31:21
582
原创 c/c++对数组取地址
没怎么用过c/c++,今天偶然碰到一个问题,记录一下。int a[3] = {1, 2, 3};cout cout 输出的结果一样吗?答案是一样,不一样我也不用写了。初看起来有点奇怪,因为数组名是指针,那直觉上&a应该是对a这个指针变量取地址,所以结果应该是不一样,这是为什么?原来实际上,a是指向a[0]的指针,而&a是指向整个数组的指针。
2015-07-28 23:23:39
3344
原创 [读书笔记] 关于Windows的结构化异常处理SEH(二)
上篇说的是终止处理程序,这篇接着看异常处理。也就是:__try{ // 被保护的代码}__except(exception filter/*异常过滤程序*/){ // 异常处理程序}与终止处理程序不同,异常过滤程序与异常处理程序主要是操作系统负责执行的,另外,在try块中的return,goto等语句不会导致像在终止处理程序中的那种局部展开,所以不会有额外的开销,其实
2015-04-24 16:58:43
423
原创 [读书笔记] 关于Windows的结构化异常处理SEH(一)
结构化异常处理(一下简称SEH),实际上包含两方面的功能:终止处理(termination handling)和异常处理(exception handling),这篇笔记主要是关于终止处理,异常处理以后再看。终止处理程序确保不管一个代码块是如何退出的,另一个代码块(终止处理程序)都能被执行。*其实用代码表示就是 __try { // 受保护代码 } __finally {
2015-04-24 10:33:52
625
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人