![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++的碎碎念念
文章平均质量分 74
一个小猴子`
天道酬勤-厚积薄发。
展开
-
C++设计模式
文章目录工厂方法模式抽象工厂模式单例模式代理模式外观模式适配器模式模板方法模式策略模式命令模式观察者模式装饰模式桥模式设计的7大原则:开闭原则:软件实现应当对扩展开放,对修改关闭。里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立。依赖倒置原则:高层模块不应该依赖低层模块,两则都应该依赖其抽象;抽象不应该依赖细节, 细节应该依赖抽象。单一职责原则:一个类应该有且仅有一个引起他变化的原因,否则类应该被拆分接口隔离原则:一个类对另一个类的应该建立在最小的接口上迪米特法则:最少知识原则合原创 2024-06-26 14:10:24 · 1120 阅读 · 0 评论 -
TCP:传输控制协议
除非我们在实行半关闭,否则将等待另一端的应用层意识到它已收到一个文件结束符说明,并向我们发一个FIN来关闭另一方向的连接。当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了TCP的接受缓存时。拥塞窗口cwnd的维护原则:只要网络没有出现拥塞,拥塞窗口就再增大一些;也有的快恢复实现是把快恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh + 3。,就将相应的报文段立即重传,而不是等待该报文段的超时重传计数器超时再重传。原创 2024-05-28 11:37:06 · 1465 阅读 · 0 评论 -
Effective C++(6)
非虚函数执行的是静态绑定又称前期绑定,early binding),由对象类型本身(称之静态类型)决定要调用的函数;而虚函数执行的是动态绑定又称后期绑定,late binding),决定因素不在对象本身,而在于“指向该对象之指针”当初的声明类型(称之动态类型)。l’;k前面我们已经说过,public继承意味着 is-a 关系,而在基类中声明一个非虚函数将会为该类建立起一种不变性(invariant),凌驾其特异性(specialization)。原创 2024-05-23 15:44:31 · 663 阅读 · 0 评论 -
Effective C++(5)
当变量定义出现时,程序需要承受其构造成本;当变量离开其作用域时,程序需要承受其析构成本。因此,避免不必要的变量定义,以及延后变量定义式直到你确实需要它。// 效率低// 效率高这种做法产生的开销:1 个构造函数 + 1 个析构函数 + n 个赋值操作Widget w;i < n;++i) {w = 取决于 i 的某个值;...这种做法产生的开销:n 个构造函数 + n 个析构函数i < n;++i) {Widget w(取决于 i 的某个值);...原创 2024-05-22 20:21:15 · 1020 阅读 · 0 评论 -
Effective C++(4)
注意,虽然成员函数和非成员函数都可以完成我们的目标,但此处更建议使用非成员函数,这是为了遵守一个原则:越少的代码可以访问数据,数据的封装性就越强。此处在传参时,调用了基类Window的拷贝构造函数而非派生类的拷贝构造函数,因此在函数种使用的是一个Window对象,调用虚函数时也只能调用到基类的虚函数Window::Display。这个原则对于友元函数也是相同的,因为友元函数和成员函数拥有相同的权力,所以在能使用非成员函数完成任务的情况下,就不要使用友元函数和成员函数。原创 2024-05-22 15:04:34 · 711 阅读 · 0 评论 -
Effective C++(3)
以对象管理资源对于传统的堆资源管理,我们需要使用成对的new和delete,这样若忘记delete就会造成内存泄露。因此,我们应尽可能以对象管理资源,并采用RAII(Resource Acquisition Is Initialize,资源取得时机便是初始化时机),让析构函数负责资源的释放。原书此处提到的auto_ptr的内容已经过时,在 C++11 中,通过专一所有权来管理RAII对象可以使用std::unique_ptr,通过引用计数来管理RAII对象可以使用std::shared_ptr。原创 2024-05-21 19:44:31 · 1152 阅读 · 0 评论 -
C++智能指针
在C++11中通过引入智能指针的概念,使得C++程序员不需要手动释放内存智能指针的种类3)weak_ptrauto_ptr已经被废弃。原创 2024-05-21 16:25:56 · 381 阅读 · 0 评论 -
Effective C++(2)
当派生类对象经由一个基类指针被删除,而该基类指针带着一个非虚析构函数,其结果是未定义的,可能会无法完全销毁派生类的成员,造成内存泄漏。在派生类对象的基类构造和析构期间,对象的类型是基类而非派生类,因此此时调用虚函数会被编译器解析至基类的虚函数版本,通常不会得到我们想要的结果。在创建派生类对象时,基类的构造函数永远会早于派生类的构造函数被调用,而基类的析构函数永远会晚于派生类的析构函数被调用。虚析构函数的运作方式是,最深层派生的那个类的析构函数最先被调用,然后是其上的基类的析构函数被依次调用。原创 2024-05-21 09:33:38 · 814 阅读 · 0 评论 -
Effective C++(1)
1)#define 修饰的记号,在预处理的时候,已经全部被替换成了某个数值,如果出错,错误信息可能会提到这个数值,而不会提到这个记号。但是有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员应该被mutable来修饰。需要注意的是,反向做法:令const版本调用non-const版本以避免重复——并不被建议,一般而言const版本的限制比non-const版本的限制更多,因此这样做会带来风险。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。原创 2024-05-20 16:02:21 · 660 阅读 · 0 评论 -
静态局部变量、全局变量和局部变量
当变量只在某个特定作用域内有效,并且不需要其他作用域访问时,可以使用局部变量。当多个函数需要共享相同的数据时,可以使用全局变量。原创 2024-04-27 08:26:38 · 172 阅读 · 0 评论 -
C++ 中的 struct 和 Class
【代码】C++ 中的 struct 和 Class。原创 2024-04-26 21:07:43 · 229 阅读 · 0 评论 -
函数指针 和 指针函数
它可以用于存储函数的地址,允许在运行时动态选择要调用的函数。,用于返回指向某种类型的数据的指针。函数指针是指向函数的。原创 2024-04-26 20:58:08 · 225 阅读 · 0 评论 -
直接初始化和拷贝初始化
直接初始化:使用普通的函数匹配即可完成初始化,也就是说直接调用类的构造函数或拷贝构造函数的初始化就是直接初始化。拷贝初始化:将对象拷贝到正在创建的对象当中,如果还需要还要进行类型转换。原创 2024-01-22 11:03:14 · 399 阅读 · 0 评论