C++
文章平均质量分 71
CodingQK
Learning By Doing .
展开
-
<Effective Mordern C++>笔记:Item 1: Understand the template type deduction.
写在前面: 基础的东西学完之后,最好的进阶方式就是项目+啃书了,项目也在准备当中,啃书还是绝对不能落下的。现在C++11/14已经成为主流,正好在图书馆借到了《Effective Mordern C++》,以读书笔记的形式做一个记录。而且这本书还没有中文版,所以也能当做是提高自己英文阅读能力的有效手段。Item 1: Understand the template type deduction原创 2017-05-02 22:54:03 · 373 阅读 · 0 评论 -
<Effective C++>:Item25:考虑写出一个不抛出异常的swap函数
本文转载,原文见:原博 ①如果 std::swap 对于你的类型来说是低效的,请提供一个 swap 成员函数,并确保你的 swap 不会抛出异常。 ②如果你提供一个成员 swap,请同时提供一个调用成员swap的非成员swap。对于类(非模板),还要特化 std::swap。 ③调用swap时,请为std::swap使用一个using声明式,然后在调用 swap时不使用任何na转载 2017-06-20 12:16:01 · 303 阅读 · 0 评论 -
<Effective C++> Item 29:争取异常安全的代码
异常安全(Exception safety)有点像怀孕(pregnancy)……但是,请把这个想法先控制一会儿。我们还不能真正地议论生育(reproduction),直到我们排除万难渡过求爱时期 (courtship)。(此段作者使用的 3 个词均有双关含义,pregnancy 也可理解为富有意义,reproduction 也可理解为再现,再生,courtship 也可理解为争取,谋求。为了与后面转载 2017-06-20 23:38:36 · 323 阅读 · 0 评论 -
[C++] 类的"实现"与"接口"分离
C++这门语言囊括了多种语言范式,并不是严格的OOP语言,所以在“实现与接口的分离”这一方面做得并不算好。 这里简述C++的类设计中把实现与接口分离的方法.在C++的某个class的定义中,不仅声明了接口,还可以看到实现的具体细节,当然这个视角是针对类内部的,通常是在私有域private中,比如下面这个类:class Person {public:Person(const std::原创 2017-06-25 17:58:55 · 3985 阅读 · 0 评论 -
<Qt> QWidget派生类setStyleSheet方法无效问题
最近在做一个基于Qt的桌面应用,准备总结一下开发过程中遇到的一些问题。我需要创建一个继承自QWidget的类来设计自己的窗口,使用StyleSheet无疑能方便快捷地配置窗口的一些风格,但是我在应用继承自基类的setStyleSheet的方法时发现,设置的style sheet并不能在最终的页面上生效,查阅了官方文档之后发现只需要在派生类中重写一下paintEvent方法。 具体如下: 官方文原创 2017-09-06 23:02:26 · 4566 阅读 · 1 评论 -
<Qt> 在connect中使用lambda实现高效的信号/槽关联
。原创 2017-09-07 21:39:27 · 15476 阅读 · 9 评论 -
<Qt> 应用单例模式时重复delete pointer导致_CrtIsValidHeapPointer(block)错误
前景:在写Qt桌面应用时,有一个场景是TabWidget管理四个子窗口,每个子窗口都只能有一个实例方便窗口的切换,自然而然就想到要用singleton-pattern,但是我应用时能正常启动,但是关闭main window的时候每次都弹出_CrtIsValidHeapPointer(block) …既然是关闭窗口的时候弹出的错误,那么肯定是main window析构的时候发生了错误,根据错误信息也原创 2017-09-24 23:23:57 · 1934 阅读 · 0 评论 -
<Effective Modern C++>Item 15: Use constexpr whenever possible.[constexpr 表达式]
学习+使用C++已经有挺长一段时间了,时间越长越是感叹C++语法之多之深,所以那些简历上会写精通C++的人权当是不懂事了。 constexpr是C++11新加入的一个关键字,我一直对它的用法有些困惑,所以平时写项目的时候从来不敢乱加这个关键字,在这一个Item的开头,作者也写着: If there were an award for the most confusing原创 2017-09-09 17:11:09 · 275 阅读 · 0 评论 -
<Effective Mordern C++>笔记:Item 3:Understand decltype .
这个decltype相对于前面的template和auto就更高级一点了,它不仅可以推断出一个变量的类型,还能推断出一个表达式的类型。像这样:const int i=0;//decltype is const intbool f(const CLASS& w);//decltype is bool(const CLASS&)if(f(w))//decltype is boolvector<t原创 2017-05-03 20:03:08 · 351 阅读 · 0 评论 -
<Effective Modern C++>Item 18: Use std::unique_ptr for exclusive-ownership resource management.
When you reach for a smart pointer, std::unique_ptr should generally be the one closest at hand. It’s reasonable to assume that, by default, std::unique_ptrs are the same size as raw pointers, and f原创 2017-09-27 18:03:31 · 353 阅读 · 0 评论 -
<C++>shared_ptrs利用std::enable_shared_from_this()实现安全管理this指针
智能指针大法好,但是坑儿免不了,不要哭来不要闹,C艹面前谁敢diao利用RAII来管理资源自然是高效,但是对于一些比较特殊的类型,还是会有不得不注意的地方,没错说的就是std::shared_ptr和this指针的搭配。 shared_ptr的内部实现包括一个指向目标对象的raw pointer和一个包含reference count等其他维护sp状态的数据结构,称之为控制块(control b原创 2017-10-15 10:16:12 · 597 阅读 · 0 评论 -
<C++> 基于C++11/14/17的线程池实现
线程池,顾名思义就是预先启动一些线程,集中管理,需要的时候直接拿来用,无需用时再创建。尤其是在Windows平台,线程是稀缺资源,线程的创建和销毁都是十分耗时的,所以利用线程池来提升并发场景下的性能,是十分有必要的。C++11首次对并发进行了支持,这使得我们利用STL编写多线程应用程序成为了可能,不过STL的thread比较简陋,并没有提供更多的强大特性,只是一个最基础的多线程解决方案,定位应该是原创 2017-11-23 11:11:35 · 4110 阅读 · 0 评论 -
<Effective C++>:Item 20:以pass-by-reference-to-const替代pass-by-value .
aa原创 2017-06-07 22:58:54 · 435 阅读 · 0 评论 -
<Effective C++> (Item 13-15): 以对象管理资源
在以前的C++用法中,new是非常常见的用来动态分配内存的方式,但是有new必须有delete,将内存还给系统,否则就会造成内存泄露,这是很危险的一件事情,而以对象管理资源这一思想就能比较好的解决这一问题通常情况下,对于一个对象,如果是built-in类型,我们就直接new了,如果是自定义类型,一般使用工厂函数返回其指针,生成对象之后肯定需要释放对象吧,对于内置类型,就是成对的使用delet原创 2017-06-02 22:59:16 · 370 阅读 · 0 评论 -
<Effective Mordern C++>笔记:Item 8:prefer nullptr to 0 and NULL.
虽然如果C++看到一个指针类型被定义为0,它会把0解析为一个空指针,但是0终究只是个int类型并不是个指针。 NULL也是一样的,它也被允许解析为非int型的整形,但不是一个指针类型。 在一些接受不同参数类型的重载函数中,如下:void f(int); void f(bool);void f(void*);f(0); // 调用f(int), 而不是f(void*)f(NULL)原创 2017-05-11 19:32:58 · 340 阅读 · 0 评论 -
<Effective Mordern C++>笔记:Item 9:prefer alias declarations to typedefs.
转载自原博:原博C++11中引入的std::unique_ptr智能指针是个好用的东西,在我们使用unique_ptr的时候往往会写出这样的类型std::uniqeu_ptr<std::unordered_map<std::string,std::string>>,看上去很臃肿,因此大多数的时候我们会选择使用typedef进行类型的重定义,简化类型名称。可是在C++11中引入了一个using别名的转载 2017-05-11 19:43:34 · 373 阅读 · 0 评论 -
<Effective Mordern C++>笔记:Item 2:Understand auto type deduction.
首先声明,在大部分情况下,auto的类型推断和Item 1中Template的推断是一致的,所以重复部分不再赘述,可以参考上一篇。变量声明为auto,auto在此处就是扮演template中T的角色。auto也遵守template的三种情况分类,详情看上一篇。在C++11中,变量的声明有四种方式int x=27;int x(27);int x={27};int x{27};//四种方式的原创 2017-05-03 19:14:27 · 560 阅读 · 0 评论 -
<Effective Mordern C++>笔记:Item 4:Knowing how to view deduced types .
本篇为转载,转自原博在Item3中学习了C++11新特性decltype,decltype可以获取变量或者表达式的类型,但是获取到的类型只能用于定义其他的变量和类型,不能打印出来,也不能用来操作。毕竟是编译期实现,用来做类型反射就算了,那么至少也应该可以打印输出下吧,毕竟书中得来终觉醒。那么本文就介绍几种方法来得到decltype的返回类型的名字。IDE Editors 最简单的就是依靠C+转载 2017-05-03 20:24:41 · 305 阅读 · 0 评论 -
【转】<C++ Primer 5th>Template模板笔记
1.模板实例化:C++中的模板是一个函数或者类的蓝图,编写了不局限于类型的通用代码。模板定义本身不参与编译,而是编译器根据模板的用户使用模板时提供的类型参数生成代码,再进行编译,这一过程被称为模板实例化。用户提供不同的类型参数,就会实例化出不同的代码。 2.函数模板:编译器可以根据用户使用函数模板时提供的实参,推断出函数模板的类型参数,这被称为模板实参推断。template<typename T>转载 2017-04-14 10:37:10 · 480 阅读 · 0 评论 -
<Effective Mordern C++>笔记:Item 5:Prefer auto to explicit type declarations.
很多时候我们定义一个变量,都是直接的int x;根据编译器的不同,没有初始化的变量往往会有不同的未定义结果,进而产生各种各样的问题,在《Effective C++》中也有建议要养成初始化变量的习惯,使用auto可以省去判断各种变量类型的麻烦,但是auto是根据初始化值来判断的,所以变量必须初始化。除此之外,很多时候为了声明一个变量的类型,往往需要很长很啰嗦的前缀,比如在一个模板中,声明一个迭代器指向原创 2017-05-06 15:56:49 · 414 阅读 · 0 评论 -
<Effective Mordern C++>Item 6:UseTheExplicitlyTypedInitializerIdiomWhenAutoDeducesUndesiredTypes
啊…别人总结的精简干练,那么…再怒转一篇??? 原博在Item5中提到了使用auto所带来的诸多优点,在Item2中提到了auto的类型推导规则和模板类型推导基本一致,推导出来的类型有的时候并不是我们所想要的类型(会忽略CV限制符和引用),那么本文继续探究auto的其它缺点。std::vector<bool> features();auto ret = features();上面的ret是转载 2017-05-06 16:06:25 · 332 阅读 · 0 评论 -
<Effective Mordern C++>笔记:Item 7:Distinguish () and {} when creating objs.
从C++11开始,初始化有三种方式:括号,=赋值和列表(也可=后接列表)。先看如下例子开个头://Widget是个自定义类Widget w1; // 调用默认构造函数Widget w2 = w1; // 创建w2时调用`=`,不是赋值操作,调用了复制构造函数w1 = w2; // 赋值操作,调用重载的赋值运算符为了解决多种初始化方式引起的困扰,C++11引入了列表初始化。 例如对于一个vec原创 2017-05-08 19:39:56 · 377 阅读 · 0 评论 -
<Effective C++>:Item 6 :明确拒绝不想编译器自动生成的函数
引言:觉得这一Item挺重要的所以特地拿出来说一说。之前在知乎看到过陈硕大大的某回答中有这么一句话让我印象深刻,大致是“想知道一个项目靠不靠谱(编码者基础扎不扎实),只要点开一个文件看看自己设计的类,有没有禁用或者正确实现constructor,copy assignment,copy constructor”,可见这一细节在具体工程实践中的重要性。如果你设计的类,每一个实例都有其独立性,比如书中原创 2017-05-27 15:50:11 · 345 阅读 · 0 评论 -
<Effective C++> Item 9:绝不在构造和析构过程中调用虚函数
这个应该是C++面试的经典题了,所以值得拿出来说一说比如在一个继承体系中,基类的构造函数中调用了一个基类的成员函数,你把它声明为virtual,至少你在设计的时候是认为它有virtual属性的。class Base{public: Base(); virtual void someFunction()=0; ... }Base::Base(){ ...原创 2017-05-30 16:31:53 · 409 阅读 · 0 评论 -
网易2017春招实习生笔试编程题集合(C++方向)
挺早之前做好一直想写一篇博客分享一下,但是后来给忘了…C++方向一共十二道编程题,可能和别的方向有一些出入。题目总体的难度不大,有些题有些小坑,适合进阶者练练手。代码都扔在Github了 -> Code 题目列表:分饼干双核处理堆砖块奇怪的表达式求值小易记单词工作安排凃棋盘消除重复元素调整队列赶去公司集合魔力手环[Problem 1]原创 2017-06-17 10:35:51 · 2814 阅读 · 0 评论 -
[C++] 不要在构造函数里调用std::shared_from_this()
前段时间在用std::shared_ptr/std::weak_ptr实现thread-safe和memory-safe的观察者模式(Observer Pattern)的时候,调试总给我报错,最后排查了很久,发现是一个非常tricky的小错误。最开始的版本大概是这样子的:class Observer;class Subject {public: void regi...原创 2018-05-05 11:56:41 · 2314 阅读 · 0 评论