C++11
文章平均质量分 58
歪锅锅
游神哦
展开
-
C++设计模式:单例模式
单例模式的使用相当广泛,当一个类只允许被构造一个对象的时候尤为常见禁止外面直接调用构造器禁止被拷贝和移动// 从设计上禁止行为MyClass a;MyClass *p = new MyClass;MyClass b(a);MyClass c(std::move(a));c++中如果不想因为调用某个函数而产生某种效果,那么你就不应该声明这个函数,但是这个存在5个例外,五大函数如果你不定义它,编译器会默认生成空函数体的五大函数,已完成C++自己的内存管理机制。 MyClass() {}原创 2021-11-13 20:47:28 · 834 阅读 · 0 评论 -
C++ override 虚析构函数 使用技巧
#include <cstdio>class Base {public: ~Base() { ::printf("base\n"); }};class Derived : public Base {public: ~Derived() { ::printf("derived\n"); }};Base *ptr = new Derived;delete ptr;众所周知,上例会造成内存泄漏,子类中的数据成员没法得到释放,最重要的是这种行为并不会被编译器察原创 2021-10-13 20:21:57 · 4324 阅读 · 0 评论 -
C++2.0 右值引用、移动语义、完美转发 自认为详解
# C++2.0 右值引用、移动语义、完美转发抛开以前听过左值和右值的一切传说,投入到我的主观分析里面,看完再做思考,不足或者错误之处,欢迎随时指出!1. 左值左值有自己的名字,不管是真名还是别名。能够使用使用**&或者std::addressof(…)取得地址,左值既能放在=**操作符左边也能在其右边tips: 常见左值有:函数名 [当我们将函数名作为一个值来使用时,该函数名自动转换为指向对应函数的指针] 和具名变量,具名变量如std::cin、std::endl等返回左值引用的函数原创 2021-09-24 20:42:55 · 206 阅读 · 0 评论 -
C++11 多线程模块封装
C++11 多线程模块封装在实现一个通知的时候上网找资料,发现这位大佬的实现跟我极其相似,草哈哈哈哈当然线程模块还有很多实现方式比如在Task中定义线程入口函数,外部去注册函数,然后运行。也可以是不让Task成为抽象类,可以作为外面功能模块的成员,接收外面功能模块的函数注册,然后运行,都可以。不多说了,直接上代码task.hpp#pragma once#include <atomic>#include <memory>#include <mutex&g原创 2021-09-02 17:43:29 · 1067 阅读 · 0 评论 -
从汇编和编译器角度分析C++得this指针和成员函数寻址
(鄙人总结,希望和大家交流,切莫转载,谢谢!)引入先看一段这个代码:#include <cstdio>class Moo { public: void Printf(int a) { ::printf("%p, %d\n", this, a); }};int main() { Moo *p = nullptr; p->Printf(1); p = new Moo; p->Printf(1); delete p;}执行结果是:(nil原创 2021-04-07 23:00:10 · 519 阅读 · 0 评论 -
C++11 成员函数作为回调函数使用示例
前言std::bind()被广泛地应用在新式的回调函数中。C++11以前类的普通成员函数不能作为回调函数去注册,因为将普通成员函数注册给对方,但对方使用这个函数指针时,就会发生参数列表匹配的问题,因为少了隐含的this。静态成员函数不包含this指针,所以一般将静态成员函数注册给对方。C++11推出std::bind()和std::function搭配,前者生成新的调用对象,参数个数可以小于绑定函数的参数个数,少的参数,按位占用。后者保存函数调用类型的函数对象,使用该对象进行设置参数即可。示例1原创 2021-04-14 23:27:53 · 2854 阅读 · 0 评论