- 博客(17)
- 收藏
- 关注
原创 Effective C++ 读书笔记(十二)
classD由classB以public继承派生而来,classB定义一个public成员函数mf,其参数和返回值不重要均设为void。...D x;以下行为B* pb=&x;//获得一个指针指向xpb->mf();//由该指针调用mf异于以下行为D* pD=&x;//获得一个指针指向xpD->mf();//由该指针调用mf你可能会相当惊讶,两者都通过对象x调用成员函数mf,其对象相同,函数也相同,所以行为也应该相同?
2025-02-21 21:47:06
700
1
原创 Effective C++ 读书笔记(十一)
为了严守上述规则,需要两个头文件,一个用于声明式、一个用于定义式。这些文件必须保持一致性,如声明式被改变了,两个文件都得改变。因此程序库客户应该总是include一个声明文件而非前置声明若干函数。
2024-11-26 08:51:58
875
原创 Effective C++ 读书笔记(十)
假设你的程序涉及到矩形,每个矩形又左上角和右下角表示。为了让矩形类尽可能小,我们可能需要一个辅助的struct来存放point类,再令Rectangle指向它。Rectangle的使用者必须能计算Rectangle的范围,所以这个类提供upperLeft和lowerRight函数。Point式个用户自定义类型,根据条款二十尽量以引用返回,于是这些函数返回引用。这样的设计尽管呢个通过编译,但是是错误的。一方面这两个函数被声明为const,因为其只是用来获取相关坐标点的方法,而不是修改数据。
2024-11-18 08:50:29
825
原创 Effective C++ 读书笔记(九)
但令我们没想到的是,它调用的并不是当前对象上的函数,而是稍早转型动作所建立的一个*this对象的base class成份的暂时副本上的onResize。进一步假设SpecialWindow的onResize函数要求首先调用Windows的onResize,下面是实现方法之一,它看起来对,实际上是错的。这引出本条款尽可能延后的真正意义,你不只应该延后变量的定义,直到非得使用该变量的前一刻,甚至应该尝试延后这份定义,知道能够给它初值实参为止,这样不知能避免构造析构非必要对象,还能避免无意义的默认构造行为。
2024-11-08 11:00:00
558
原创 Effective C++ 读书笔记(八)
如果你要在成员函数和非成员函数之间做抉择,而两者提供相同的机能,那么非成员函数较好一些,因为其不增加可访问类内private成分的函数数量,这也解释了我们开始的问题。假设一个public成员变量被取消,所有使用它的客户代码都会被破坏,因此,public成员变量没有封装性。c++标准库不是单一的,整体的、庞大的再一个头文件中包含所有东西,而是有数十个头文件<vector><memory>等等,每个头文件声明某些机能,如果客户只想用vector,就没必要包含其他。越多函数可访问它,数据的封装性越低。
2024-10-31 22:31:49
567
原创 Effective C++ 读书笔记(七)
当你定义一个新class,就定义了一个新type。身为一个c++程序员,你的许多时间用来扩张你的类型系统。这意味着你并不只是类的设计者,还是type的设计者。设计优秀的类是一项艰巨的工作,因为设计好的types是一项艰巨的任务。好的types有自然的语法、直观的语义,以及一或多个高效实现品。c++中,一个不良规划下的class无法达到上述任何一个目标。甚至类成员函数的效率都有可能收到他们如何被声明的影响。如何设计高效的class呢?首先你必须了解你面对的问题。
2024-10-31 08:30:00
1035
原创 Effective C++ 读书笔记(六)
看起来好像没有问题,使用了new也使用了delete,但是程序有部分行为未定义,stringArr中有99个不太可能被正当删除。当你使用new,有两件事发生:第一:内存被分配出来。第二针对此内存调用构造函数(一个或多个)。当你使用delete,也有两件事发生:第一,针对此内存调用析构函数(一个或多个)。第二,释放内存。delete最大的问题在于即将被删除的内存中究竟有多少个对象?这决定调用多少次析构。其实很好解决,delete加[],系统就会知道它是一个数组,释放多个对象,未加就只释放一个对象。
2024-10-24 22:52:43
886
原创 Effective C++ 读书笔记(五)
Font类可以提供一个显示转换函数,像get那样。以上程序有何FontHandle对象由Font管理,但这个FontHandle也可通过f2直接获得,那可能会造成很多问题,比如当f1被释放,字体被释放,而f2成为悬吊指针。在条款十三中,我们提到利用智能指针来管理堆资源,然而并非所有资源都是堆上,对于这种情况智能指针往往不太适用,因此,我们往往需要建立资源管理类。为确保createInvestment返回的对象总能被正确的释放,我们需要将资源放进对象内,确保当控制流离开f函数,对象会自动被释放。
2024-10-24 08:30:00
528
原创 Effective C++ 读书笔记(四)
关于赋值我们可以写为以下形式为了实现连锁复制,赋值操作符必须返回一个reference指向操作符左侧实参。这个协议适用于所有赋值相关操作。注意,这只是个协议,并无强制性。但这个协议被所有内置类型和标准库遵守,所以没有特殊原因还是遵守这个协议。
2024-10-15 22:20:19
575
原创 Effective C++ 读书笔记(三)
设计一个time的基类和多种计时方法,许多客户只想使用时间,不关系如何实现时间的细节,我们可以设置一个factor函数根据factor的规则,geTimeKeeper返回的对象必须位于堆区,因此为了避免内存泄漏,我们需要对其进行释放;然而纵使客户把每一件事都做对了,仍然无法知道程序如何行动。问题出在返回的指针指向派生类对象,但那个对象却被基类指针delete,而目前的基类析构函数是非虚函数。
2024-10-12 21:56:09
731
原创 Effective C++ 读书笔记(二)
所谓编译单元是指产出单一目标文件的那些源码,包括源码文件和其所包含的头文件。static对象是指其寿命是从被构造出来到程序结束为止。该对象包括global对象、namespace内的对象、文件内、class内、函数内被声明为static的对象。函数内的static对象称为local static对象,其他均为non-local static对象。
2024-10-09 20:30:58
703
原创 Effective c++读书笔记(1)
将c++视为一个由相关语言组成的联邦c:c++语言包容c的语法以c为基础,在很多时候,c++是c的高级解法。面向对象:c++内包含封装、继承、多态、虚函数等。模板:c++的泛型编程部分。STL:stl是标准模板库。
2024-10-06 15:45:44
692
原创 多线程服务端
创建进程会带来一定开销为了完成进程间通信数据交换、需要用到IPC技术。线程的创建和上下文切换的时间开销要比进程小得多线程交换数据无需其他技术,利用数据区和堆区共享数据。
2024-08-21 13:34:57
551
原创 进程间通信(IPC)(管道)
指在操作系统中,多个进程之间交换数据或信息的机制。由于不同进程的内存空间是相互独立的,因此它们无法直接访问彼此的内存。这就需要通过某些机制来实现进程之间的信息交换,以便协作完成任务。从内存角度:在操作系统中,每个进程都有自己独立的,这意味着一个进程不能直接访问另一个进程的内存数据。因此,进程间通信机制必须通过操作系统提供的中介或内存区域来实现数据交换。
2024-08-20 10:58:01
217
原创 CMake
利用add_definitions命令添加宏,此功能可以控制有些代码是否需要执行(#ifdef DEBUG)。宏的名字前需要加-D宏名。
2024-07-05 15:01:01
1718
原创 Protobuf
Protocol Buffers(简称 protobuf)是一种由 Google 开发的数据序列化协议。它是一种与语言无关、平台无关、可扩展的机制,用于序列化结构化数据。
2024-07-01 13:36:26
2655
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人