从优秀源码中学到的两个技巧

优秀,源码,中学,两个,技巧 · 浏览次数 : 114

小编点评

**使用结构体** ```c++ class A { private: struct State { int data; void hello() { std::cout << "Hello World\\"; } void f() { std::cout << "Goodbye World\\"; } void g() { std::cout << "Nothing\\"; } }; public: State state; static void hello() { state.hello(); } static void f() { state.f(); } static void g() { state.g(); } }; ``` **使用命名空间** ```c++ class A { public: void hello() { std::cout << "Hello World\\"; } void f() { std::cout << "Goodbye World\\"; } void g() { std::cout << "Nothing\\"; } }; ```

正文

设计一个不能被using的对象

  在实际开发中为了避免命名空间污染,一般都不会using namespace std。但是如果一个对象写起来比较复杂,用using能大幅度地简化操作。现在假设我们要设计一个函数,它在一个作用域里面,使用它只能以A::B::C()这种形式。思考一下,如果我们放在命名空间下,是可以被using简化的。我们不妨可以试试设计一个结构体。

class A {
    public:
        static void hello() {
            std::cout << "Hello World\n";
        }

        static void f() {
            std::cout << "Goodbye World\n";
        }

        static void g() {
            std::cout << "Nothing\n";
        }

        A() = delete;
        A(const A& other) = delete;
        ~A() = delete;
        A& operator= (const A& other) = delete;
};

  我们可以把构造函数,析构函数,拷贝构造还有拷贝赋值这一类函数都删掉,因为并不打算构造一个对象。除此之外,每个成员函数都用static修饰,因为它与实例化无关。这样,当我们想要调用hello函数的时候,我们可以A::hello(),这样就达到了目的。

 

禁止自己拷贝自己

  这段代码其实是可以通过编译的。

int n = n;

  同样,如果设计的类不经过特殊处理,诸如此类的操作也是可以通过编译的。通过引入assert断言的手段我们可以解决这个问题。

class Base {
    int data;

    public:
        Base(int data) : data(data) {}

        Base(const Base& other) {
            assert(&other != this);
            data = other.data;
        }
};

  只需判断拷贝的地址是否与this指针指向的地址相同即可。

与从优秀源码中学到的两个技巧相似的内容:

从优秀源码中学到的两个技巧

设计一个不能被using的对象 在实际开发中为了避免命名空间污染,一般都不会using namespace std。但是如果一个对象写起来比较复杂,用using能大幅度地简化操作。现在假设我们要设计一个函数,它在一个作用域里面,使用它只能以A::B::C()这种形式。思考一下,如果我们放在命名空间下

APP中RN页面热更新流程-ReactNative源码分析

平时使用WebStorm或VSCode对RN工程中的文件修改后,在键盘上按一下快捷cmd+s进行文件保存,此时当前调试的RN页面就会自动进行刷新,这是RN开发相比于原生开发一个很大的优点:热更新。 那么,从按一下快捷cmd+s到RN页面展示出最新的JS页面,这个过程是怎样发生的呢?下面根据时间顺序来

一次SQL调优 聊一聊 SQLSERVER 数据页

一:背景 1.讲故事 最近给一位朋友做 SQL 慢语句 优化,花了些时间调优,遗憾的是 SQLSERVER 非源码公开,玩起来不是那么顺利,不过从这次经历中我觉得明年的一个重大任务就是好好研究一下它,争取在 SQLSERVER 性能优化上做一些成绩,哈哈! 个人觉得要想深入研究 SQLSERVER,

从原理聊 JVM(五):JVM 的编译过程和优化手段

# **一、前端编译** 前端编译就是将Java源码文件编译成Class文件的过程,编译过程分为4步: ## **1 准备** 初始化插入式注解处理器(Annotation Processing Tool)。 ## **2 解析与填充符号表** 将源代码的字符流转变为标记(Token)集合,构造出`

[转帖]Redis 4.0 自动内存碎片整理(Active Defrag)源码分析

阅读本文前建议先阅读此篇博客: Redis源码从哪里读起 Redis 4.0 版本增加了许多不错的新功能,其中自动内存碎片整理功能 activedefrag 肯定是非常诱人的一个,这让 Redis 集群回收内存碎片相比 Redis 3.0 更加优雅,便利。我们升级 Redis 4.0 后直接开启了a

Kafka多维度调优

优化金字塔 应用程序层面 框架层面(Broker层面) JVM层面 操作系统层面 应用程序层面:应当优化业务代码合理使用kafka,合理规划主题,合理规划分区,合理设计数据结构; 框架层面:在不改动源码的情况下,从kafka参数配置入手,结合业务体量和运行数据进行调优 JVM层面:在出现明显缓慢和可

XCode汇编调试

汇编调试的意义 了解常用的汇编指令和知识,可以知道经过编译器优化后,最终的代码调用,有可能和源码并不相同,如:设置faster,smallest 代码会更短,最终的汇编执行指令与源码不一样。 可以研究代码在二进制层面的执行流程是否和源码的流程一致,从二进制层面研究方法调用的传参,内部调用,方法返回值

[转帖]-O1,-O2,-O3编译优化知多少

1.从.c文件到可执行文件,其间经历了几步? 高级语言是偏向人,按照人的思维方式设计的,机器对这些可是莫名奇妙,不知所谓。那从高级语言是如何过渡到机器语言的呢?这可是一个漫长的旅途呀! 其中,得经历这样的历程:C源程序->编译预处理->编译->汇编程序->链接程序->可执行文件 1.预处理 读取c源

深入Python网络编程:从基础到实践

**Python,作为一种被广泛使用的高级编程语言,拥有许多优势,其中之一就是它的网络编程能力。Python的强大网络库如socket, requests, urllib, asyncio,等等,让它在网络编程中表现优秀。本文将深入探讨Python在网络编程中的应用,包括了基础的socket编程,到

程序员想通过产品挣钱,首先你产品的目标客户得不差钱 (在线客服系统外传1)

在线客服系统我利用业余时间断断续续做了好几年,从一开始的追求完美,到后来的集中精力解决核心问题,从一开始的在每一个用户身上投入大量时间,到后来学会分辨什么是有价值客户,学到很多,成长很多。有许多工程技术上很好,很优秀的产品,甚至一定程度上得到了认可,却无法生存的产品,关门大吉。人们常常说是因为技术人...