![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 59
林 文
《码农修行:编写优雅代码的32条法则》作者
展开
-
做个广告-新书优惠
本人新书《码农修行》目前当当正在五折优惠。《码农修行:编写优雅代码的32条法则》(林文 著)【简介_书评_在线阅读】 - 当当图书原创 2021-10-23 20:16:40 · 130 阅读 · 0 评论 -
这条编程规范如何?——条件分支超过6个时必须改为接口
前面举过一个面向接口编程的例子。在系统中写日志有3种不同的实现:写到日志文件。 写到数据库。 写到本地的一个日志服务的UDP端口。按照常规的思维逻辑,可以用一种最直接的写法。如下方案一。方案一public class LogController { private LogService logservice; void writeLog(SysLogInfo logInfo){ switch(logType){ case LT_FILE: logservice.writ原创 2021-07-21 00:39:00 · 141 阅读 · 0 评论 -
别把Java写成C++的样子。你真的在正确运用依赖注入吗?
最近发现很多使用Spring框架的Java代码存在依赖注入方式的误用,甚至是滥用。因此整理了这篇文章,欢迎大家一起探讨。先举个例子,从C++说起……C++的诟病C++最遭人诟病的地方就是定义一个类需要写两个文件,一个.h文件和一个.cpp文件。例如定义一个CMainFrame类,mainframe.h内容如下:class CMainFrame : public CFrameWndEx{protected: CMainFrame();public: virtual ~CMainFram原创 2021-05-09 20:53:39 · 1292 阅读 · 20 评论 -
善始善终
互斥锁的加锁解锁,动态内存的申请释放,都较难驾驭且容易出错。所幸我在Z和H公司所写的代码都有意或无意的避免了这两个问题。当时所涉及的是基于VxWorks的嵌入式编程,在进程调度方面系统控制层做了限制,每个进程处理完自己的消息任务后才会调度另一个进程运行,因此避免了进程并发的情况,也就无需对临界资源进行加锁。另一方面,嵌入式系统对实时性要求很高,系统中所需要的内存都在初始化时全部申请完成,并且一直不...原创 2019-09-12 17:49:58 · 165 阅读 · 0 评论 -
用表驱动消除冗余代码
表驱动法最常用的一种场景是用其替代if和case语句,使用查表的方式实现代码逻辑,其可以以使代码更为简单明了,同时可以获得更优的执行效率。但其还有一种运用场景:可以消除冗余代码,使得代码更灵活,方便应对将来需求的变化。假设下面一段代码需要初始化一些ICON图标: m_ImageList.Add(LoadIcon(hResource, MAKEINTRESOURCE(ICON1))); m原创 2017-08-21 18:23:38 · 368 阅读 · 0 评论 -
避免堆栈溢出
案例最近在做一个Windows程序,其中有个消息处理函数,大概是这样的:BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx) ON_MESSAGE(WM_MY_MESSAGE, &CMainFrame::OnMyMessage)END_MESSAGE_MAP()LRESULT CMainFrame::OnMyMessage(WPARAM wp, LPA原创 2017-05-11 16:11:14 · 2500 阅读 · 0 评论 -
C++基本概念总结——构造函数的public/protected/private语义
类的构造函数为 public 时,表明该类的对象可以被任意的创建。例如:class PublicClass{public: PublicClass(){}}; PublicClass *p = new PublicClass();类的构造函数为 protected 时,无法通过上面的方法创建对象。protected 构造函数说明:该类是用于派生的。例如:class Pro原创 2012-11-22 22:15:00 · 1240 阅读 · 1 评论 -
C++基本概念总结——虚函数和非虚函数
虚函数享有面向对象的“多态”性,考虑下面的例子:class Base{public: virtual void VirtualFunc(){ cout << "Base::VirtualFunc" << endl; } void Func(){ cout << "Base::Func" << endl; }};class Derived : public Base{ virtua原创 2012-11-22 21:55:30 · 1047 阅读 · 1 评论 -
C++基本概念总结——静态成员
类的静态成员函数和静态成员变量是类的属性,在该类的所有对象间共享。在使用时,可以直接通过类名来引用,也可以通过对象进行引用。考虑以下代码:class A{public: static void update() {s_cnt++; } static int cnt() {return s_cnt; }private: static int s_cnt;};int A::s_cn原创 2012-11-21 21:08:29 · 463 阅读 · 0 评论 -
C++基本概念总结——引用和指针
相对于C语言,引用是C++新增的概念。引用和指针有点相似,很容易混淆。引用只是被引用对象的一个别名,不管被引用对象的大小是多少,其只占4字节的空间。考虑下面代码,A1包含一个int类型的变量和一个B类型的引用,A2包含一个int类型的变量和一个B类型的变量。class B{ int a[4];};class A1{ int i; B& m_b;};class A2{原创 2012-11-21 20:45:42 · 479 阅读 · 0 评论 -
C++基本概念总结——公有继承和私有继承
公有继承也叫“接口继承”,表示的是“是一个”(IsA)的语义。例如“大雁”类派生于“鸟”类,可以描述为“大雁是一种鸟”。class 大雁 : public 鸟{};一般在基类中提供一个纯虚函数作为接口,在派生类中重写该虚函数,就可以实现基于该接口的动态绑定(即多态)。需要注意,这里的“是”并非“等于”,“是”的含义应该为“属于”,即一种包含关系。因为说“大雁是一种鸟”是成立的,但反原创 2012-11-20 22:06:43 · 775 阅读 · 0 评论 -
C++基本概念总结——重载(overload)和重写(override)
overload翻译为重载。指的是函数名相同,但参数列表不同。代码举例:// 自由函数重载void f1(int a, int b){}int f1(int a){ return 0;}// 类的成员函数重载class A{ void f2(int, int); int f2(int);};上面代码中,自由函数f1有两个函数体,第一个原创 2012-11-18 13:05:17 · 555 阅读 · 0 评论 -
C++基本概念总结——const 和 非const
const成员函数类的成员函数后边增加一个 const 关键字,表示该函数为 const 成员函数。考虑如下类A的定义,f1为 const 成员函数,f2为 非const 成员函数:class A{public: A(int i) : m_id(i) {} void f1() const; // const 成员函数 void f2(); // 非const 成原创 2012-11-19 21:17:06 · 701 阅读 · 0 评论 -
C++基本概念总结——声明(declaration)和定义(definition)
术语“声明”和“定义”的区别,可以简单的归纳为:涉及内存分配的就是“定义”,否则就是“声明”。下面代码是声明和定义的举例:class B; // 声明。仅声明 B 是一个类,不涉及 B 的对象内存分配class A{ // 从这里直到“}”结束,是对类 A 的定义。涉及到 A 的对象的内存大小public: void f1(); // 声明。不涉及函数 f1 的内存分配原创 2012-11-17 23:39:07 · 1393 阅读 · 0 评论