![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 87
罗伊yc
Notebook
展开
-
GoogleCpp风格指南 9)规则特例 10)结束语
9 规则特例 Exceptions to the Rules前面说明的编程习惯基本都是强制性的mandatory; 但所有优秀的规则都允许例外, 这里探讨这些特例;9.1 现有不合规范的代码 Existing Non-conformant CodeTip 对于现有不符合conform 既定编程风格的代码可以网开一面diverge;当你修改使用其他风格的代码时原创 2015-07-16 11:32:21 · 619 阅读 · 0 评论 -
C++语言的黑客行为
在C++中,利用C++编译器在实现虚函数调用时的某些伎俩,我们可以在类外直接调用到类的私有成员函数!!代码如下,代码中有详细的说明。[cpp] view plaincopy//hacker.cpp: C++语言的黑客行为 #include class Coo{ private: int d; //特意将d放在转载 2014-05-20 13:53:03 · 1056 阅读 · 0 评论 -
[问题记录] 操作符连写
一个容易忽略的错误比较符号连写, vb惹得祸ListItem* MenuListModel::find(int row) const{ if (0 <= row < rowCount()) { ListItem* item = mItemList.at(row); return item; } return NULL;}原创 2014-04-08 13:16:40 · 1453 阅读 · 0 评论 -
三十分钟掌握STL
三十分钟掌握STL这是本小人书。原名是《using stl》,不知道是谁写的。不过我倒觉得很有趣,所以化了两个晚上把它翻译出来。我没有对翻译出来的内容校验过。如果你没法在三十分钟内觉得有所收获,那么赶紧扔了它。文中我省略了很多东西。心疼那,浪费我两个晚上。译者:karycontact:karymay@163.netSTL概述STL的一个重要特点是数据结构和算法的分离。尽转载 2014-04-18 13:49:56 · 760 阅读 · 0 评论 -
什么是d-pointer
什么是d-pointer如果你曾经查看过Qt的源代码文件,例如 这个 [qt.gitorious.com],你会发现里面有很多的 Q_D 和 Q_Q 宏定义。本文就来揭开这些宏使用的目的。Q_D 和 Q_Q 宏定义是d-pointer((也被称为 opaque pointer [en.wikipedia.org]))设计模式的一部分, 它可以把一个类库的实施细节对使用的用户隐藏转载 2014-04-16 17:33:52 · 1099 阅读 · 0 评论 -
Exceptional C++ Style 15)访问权限的使用
第15条 访问权限的使用谁能真正访问类的内部? 关于"伪造者", "骗子"和"偷窃者"以及如何分辨和避开它们;1. 什么样的代码可以访问类的如下区段?a) public公用成员可以被任何代码访问;b) protected保护成员可以被类自身的成员函数访问, 也可以被类的友元访问, 可以被派生类的成员函数与友元访问;c) private原创 2014-02-11 10:49:29 · 1100 阅读 · 0 评论 -
Effective C++ 第二版 48)编译器警告 49)标准库 50)总结
条款48 重视编译器警告不注意编译器警告的后果可能很严重; 12345678class B {public: virtual void f() const;};class D: public B {public: virtu原创 2013-12-25 10:35:53 · 1092 阅读 · 0 评论 -
Effective C++ 第二版 45)幕后行为 46)编译链接和运行时错误 47)非局部静态对象初始化
杂项要写出高效的软件, 必须知道编译器在背后做了些什么, 怎样保证非局部的静态对象在被使用前已经被初始化, 标准库的信息, 如何深入理解语言底层的设计思想;条款45 弄清C++在幕后为你所写, 所调用的函数一个空类什么时候不是空类? C++编译器会自动声明下列函数:一个拷贝构造函数, 一个赋值运算符, 一个析构函数, 一对取址运算符; 如果你没有声明任何构造函数, 它也原创 2013-12-18 11:38:39 · 1639 阅读 · 0 评论 -
Effective C++ 第二版 43)多继承 44)总结
条款43 明智地使用多继承多继承MI; 支持者说它是对真实世界问题进行自然模型化必须的; 批评者说, 它太慢, 难以实现, 功能却不比但继承强大;面向对象编程语言领域在这个问题上一直存在分歧: C++, Eiffel, the Common LISP Object System(CLOS)提供了MI; Smalltalk, Objective C和Object Pascal没有提供; Ja原创 2013-12-16 10:54:34 · 1421 阅读 · 0 评论 -
Effective C++ 第二版 40)分层 41)继承和模板 42)私有继承
条款40 通过分层来体现"有一个"或"用...来实现"使某个类的对象成为另一个类的数据成员, 实现将一个类构筑在另一个类之上, 这个过程称为 分层Layering; e.g.1234567891011class Address { ... }; // 某人居住原创 2013-12-12 10:44:22 · 995 阅读 · 0 评论 -
Effective C++ 第二版 37)不要重定义非虚函数 38)不要重定义缺省参数值 39)避免向下转换
条款37 决不要重新定义继承而来的非虚函数实践依据假设类D公有继承于类B, B中定义了公有成员函数mf; mf的参数和返回类型假设为void;12345678class B {public: void mf();...};class原创 2013-12-06 14:30:43 · 1245 阅读 · 0 评论 -
Effective C++ 第二版 35)公有继承 36)接口继承和实现继承
继承和面向对象设计设计和实现类的层次结构与C语言有根本不同; C++提供了多种面向对象构造部件: 公有, 保护, 私有基类; 虚拟和非虚拟基类; 虚拟和非虚拟成员函数; 这些部件互相联系, 而且和C++其他部分互相作用;C++中很多不同部件好像在做相同的事: e.g. 设计一组具有共同特性的类, 是该使用继承使所有类都派生于一个共同基类, 还是使用模板使得它们都从共原创 2013-11-06 10:05:22 · 1005 阅读 · 0 评论 -
Effective C++ 第二版 33)内联 34)将编译依赖降至最低
条款33 明智地使用内联内联函数: 看起来像函数, 运作起来像函数, 比宏macro要好(条款1), 使用时还不需要承担函数调用的开销;避免函数调用的开销仅仅是一方面; 为了处理那些没有函数调用的代码, 编译器优化程序本身进行了专门的设计; 当内联一个函数时, 编译器可以对函数体执行特定环境下的优化工作; 程序世界和现实生活一样, 没有免费午餐, 内联函数也不例外; 内原创 2013-11-04 13:46:00 · 1492 阅读 · 0 评论 -
成员指针和成员指针逆向引用运算符".*"
指针是指向一些内存地址的变量,既可以是数据的地址也可以是函数的地址。C++的成员指针遵从同样的原则。困难的是所有的指针需要一个地址,但在类内部没有地址;选择一个类的成员意味着在类中偏移。只有把这个偏移和具体对象的开始地址结合,才能得到实际地址。成员指针的语法要求选择一个对象的同时逆向引用成员指针。struct simple { int a ; }simple so;simple* sp转载 2014-08-17 10:13:53 · 1118 阅读 · 0 评论 -
C++你不知道的那些事儿—C++语言的15个晦涩特性
转载自: Alexia的技术小屋http://www.cnblogs.com/lanxuezaipiao/p/3501078.html 转过来先, 回头看这个列表收集了 C++ 语言的一些晦涩(Obscure)特性,是我经年累月研究这门语言的各个方面收集起来的。C++非常庞大,我总是能学到一些新知识。即使你对C++已了如指掌,也希望你能从列表中学到一些东西。下面列举的特性,根据晦转载 2014-03-07 11:21:53 · 858 阅读 · 0 评论 -
GoogleCpp风格指南 8)格式 _part2
8.9 布尔表达式 Boolean ExpressionsTip 如果一个布尔表达式超过标准行宽standard line length; 断行方式要统一一下;下例中, 逻辑与(&&)操作符总位于行尾:12345if (this_one_thing > this_other_thing &&原创 2015-07-16 11:27:43 · 949 阅读 · 0 评论 -
GoogleCpp风格指南 7)注释
7 注释 Comments注释虽然写起来很痛苦, 但对保证代码可读性至关重要; 下面的规则描述了如何注释以及在哪注释; 当然也要记住: 注释固然很重要, 但最好的代码本身应该是文档化self-documenting; 有意义的类型名和变量名, 要远胜过要用注释解释的含糊不清的名字;你写的注释是给代码读者看的: 下一个需要理解你代码的人, 慷慨些吧, 下一个人可能就是你;原创 2015-05-19 11:21:11 · 967 阅读 · 0 评论 -
GoogleCpp风格指南 8)格式 _part1
8 格式 Formatting代码风格和格式确实比较随意, 但一个项目中所有人遵循同一风格是非常容易的; 个体未必同意下述每一处格式规则, 但整个项目服从统一的编程风格是很重要的, 只有这样才能让所有人很轻松地阅读和理解代码;我们写了一个 settings file for emacs [http://google-styleguide.googlecode.com/svn/t原创 2015-06-25 18:01:20 · 831 阅读 · 0 评论 -
GoogleCpp风格指南 6)命名约定
6 命名约定 Naming最重要的一致性规则是命名管理govern naming; 命名风格快速获取名字代表是什么: 类型? 变量, 函数, 常量, 宏, ...甚至不需要去查找类型声明; 大脑中的模式匹配引擎pattern-matching engine可以非常可靠的处理这些命名规则;命名规则具有一定随意性, 但相比按个人喜好命名, 一致性更重要, 所以不管你怎么想, 规则总归是原创 2015-04-20 11:41:21 · 978 阅读 · 0 评论 -
GoogleCpp风格指南 5) 其他特性_part3
[Add]Lambda expressions在合适的时候使用lambda表达式; 不要使用默认的lambda captures, 使用显式的captures;[http://en.cppreference.com/w/cpp/language/lambda ]定义:lambda表达式是一个创建匿名函数对象anonymous function obj原创 2015-04-19 15:02:49 · 897 阅读 · 0 评论 -
GoogleCpp风格指南 5) 其他特性_part2
5.10 前置自增和自减 Preincrement and PredecrementTip 对于迭代器iterator和其他模板对象template object使用前缀形式(++i)的自增, 自减运算符;定义: 对于变量在自增(++i 或 i++)或自减(--i 或 i--)后, 表达式的值没有被用到的情况下, 需要确定到底是使用前置还是后置的自增(自减);优原创 2015-02-27 14:03:15 · 882 阅读 · 0 评论 -
GoogleCpp风格指南 5) 其他特性_part1
5 其他C++特性 Other C++ Features5.1 引用参数 Reference ArgumentsTip 所有按引用传递的参数必须加上 const;定义: 在C语言中, 如果函数需要修改变量的值, 参数必须为指针, 如 int foo(int* pval); 在C++中, 函数还可以声明引用参数 int foo(int& val);优点: 定义引用参数原创 2015-01-04 11:58:30 · 929 阅读 · 0 评论 -
GoogleCpp风格指南 4)Google奇技
4 来自Google的奇技 Google-Specific MagicGoogle用了很多自己的实现技巧/工具使 C++代码更加健壮, 我们使用C++的方式可能和你在其他地方见到的有所不同;[Removed]4.1 智能指针Tip 如果确实需要使用智能指针的话, scoped_ptr完全可以胜任; 你应该只在非常特定的情况下使用 std::tr1::shared原创 2014-12-27 23:15:12 · 877 阅读 · 0 评论 -
[Puzzle] 蚂蚁路线碰撞问题
有这么一道题目, 看下面的图, 假设有一条直线, 每个叉叉上有一只蚂蚁, 它们会随机选择一个方向, 向前或者向后移动, 前进中当两只蚂蚁相遇, 它们会掉头, 问: 全部蚂蚁都走出去的最长和最短步数;最短步数很明显...只要方向一致了, 就是11;最长呢...在看到问题时脑子里第一个反应是: 没有储存对这类问题的算法, 然后开始模拟蚂蚁行进路线, 发现可能性太多, 简直就是一个分子碰撞大原创 2014-12-06 11:42:31 · 1356 阅读 · 0 评论 -
GoogleCpp风格指南 3)类
3 类 Classes类是C++中代码的基本单元; 显然, 它们被广泛使用; 本节列举了写一个类时的主要注意事项;3.1 构造函数的职责 Doing Work in ConstructorsTip 构造函数中只进行那些没什么意义的(trivial 译注: 简单初始化对于程序执行没有实际的逻辑意义, 因为成员变量"有意义"的值大多不再构造函数中确定)初始化, 可能的话, 使用原创 2014-12-09 17:59:33 · 982 阅读 · 0 评论 -
GoogleCpp风格指南 1)头文件 2)作用域
Google开源项目风格指南v3.133 原作: Benjy Weinberger, Craig Silverstein, Gergory Eitzmann, Mark Mentovai, Tashana Landray翻译: YuleFox, brantyoung修改: YCR0 扉页0.1 译者前言Google经常发布一些原创 2014-12-01 15:35:16 · 1101 阅读 · 0 评论 -
Effective C++ 第二版 31)局部对象引用和函数内new的指针 32)推迟变量定义
条款31 千万不要返回局部对象的引用, 不要返回函数内部用new初始化的指针的引用第一种情况: 返回局部对象的引用; 局部对象--仅仅是局部的, 在定义时创建, 在离开生命空间时被销毁; 所谓生命空间, 指它们所在的函数体; 当函数返回时, 程序的控制离开这个空间, 函数内部所有的局部对象被自动销毁; 因此, 如果返回局部对象的引用, 那个局部对象其实已经在函数调用者使用它之前原创 2013-11-01 17:10:37 · 1365 阅读 · 0 评论 -
Effective C++ 第二版 27)函数隐式生成 28)名字空间
条款27 如果不想使用隐式生成的函数就要显式地禁止假设想写一个类模板Array, 它生成的类除了可以进行上下限检查外, 其他行为和C++标准数组一样; 设计中面临的一个问题是怎么禁止Array对象之间的赋值操作;Note 对标准C++数组来说赋值是非法的;123double values1[10];double原创 2013-10-22 11:15:09 · 910 阅读 · 0 评论 -
Effective C++ 第二版 25)避免指针和数字重载 26)二义性
条款25 避免对指针和数字类型重载什么是零?123void f(int x);void f(string *ps);f(0); // 调用f(int)还是f(string*)?>0是一个int, 一个字面上的整数常量, 所以被f(int)调用;Problem:原创 2013-10-21 13:24:48 · 1490 阅读 · 0 评论 -
JNI和Qt通信 (Part 1)
Part1Java Native Interface-JNI-JAVA本地调用JNI标准是Java平台的一部分, 允许Java代码和其他语言进行交互;开始实现->Step 1) 编写Java代码, 编写一个JNI接口HelloJNI.java123456789原创 2013-06-16 13:53:00 · 2194 阅读 · 0 评论 -
重载函数 (C++Primer-9)
9 重载函数函数名字相同, 并且在相同的域中被声明, 但是参数表不同, 称为重载函数overloaded function;9.1 重载函数声明9.1.1 为什么要重载函数名作用在不同类型的参数上的一般性的动作;9.1.2 怎样重载函数名重载: 函数的参数表中参数的个数或类型不同;如果同名函数的参数表精确匹配, 会被视为重原创 2013-05-14 20:27:42 · 1080 阅读 · 0 评论 -
函数模板 Function Template(C++Primer-10)
10 函数模板10.1 函数模板定义template A Func(const B(&rArray)[size]) { return A();}>关键字template后面是用逗号分隔的模板参数表template parameter list, 用模板参数可以为模板类型参数template type parameter,代表一种类型; 也可以是模板非类型参数template原创 2013-05-04 13:46:04 · 2087 阅读 · 5 评论 -
指针和引用(整理)
指针和引用区别>引用在创建的时候需要初始化, 指向有效对象, 必须与合法的存储单元关联, 不能再改变为其他对象的引用;>指针可以在定义以后任意时候再初始化, 指向的地址和地址内存放的数据都可以改变;>引用不可为空, 指针可以为空 (0/NULL);>const指针可以是NULL, 也有可能是野指针;>引用和指针的语义是相似的, 引用是不可改变的指针, 指针是可以改变的引原创 2013-04-24 13:46:50 · 832 阅读 · 0 评论 -
函数模板特化-编译时的重定义错误
Issue:在函数模板特化的过程中, 编译时遇到多重定义的错误; (VC2010和g++)以下是一个特化的例子:template T maxA( T t1, T t2 ) { return (t1 > t2 ? t1 : t2);}//特化 specializetypedef const char *PCC;template( PCC s1, PCC s2 ) {原创 2013-04-28 21:44:00 · 2984 阅读 · 0 评论 -
Inside the C++ Object Model 深度探索对象模型 5-Construction 6-Runtime 7-Object
5构造,解构,拷贝语意学 Semantics of Construction, Destruction, Copy纯虚拟函数的存在 Presence of Pure VF>pure virtual function可以被定义和调用invoke: 只能被静态调用statically, 不能经由虚拟机调用; Ex. inline void Abstract_base::interface()原创 2013-04-01 18:19:19 · 1257 阅读 · 0 评论 -
Templat 模板(整理)
temlate模板函数模板的声明>创建一个通用的函数, 支持多种不同的形参, 避免重载函数的函数体重复设计, 把函数使用的数据类型作为参数;template (参数表) { 函数体 }>template是定义模板函数的关键字; typename(或class)是声明数据类型参数标识符的关键字; 用以说明它后面的标识符是数据类型标识符;>函数模板原创 2013-04-27 16:02:29 · 1188 阅读 · 0 评论 -
异常处理 Exception(C++Primer-11)
11 异常处理>异常处理是一种允许两个独立开发的程序组件在程序执行期间遇到程序不正常的情况时, 相互通信的机制.11.1 抛出异常>异常Exception是程序可能检测到的, 运行时刻不正常的情况. Ex. 被0整除, 数组越界访问, 空闲存储内存耗尽等;>throw表达式后面跟的不能只是一个类型, Ex. class NoData {}; --> throw NoData; //原创 2013-04-04 11:37:55 · 1315 阅读 · 0 评论 -
智能指针 auto_ptr(C++ Primier-8)
8.4.2 auto_ptr>是C++标准库提供的类模板, 帮助自动管理用new表达式动态分配的单个对象; Note 对new表达式分配的数组管理没有支持, 不能用auto_ptr存储数组, 结果是未定义的;>autp_ptr对象被初始化为指向由new表达式创建的动态分配对象, 当auto_ptr对象生命期结束, 动态分配的对象被自动释放;>头文件: #include >三种原创 2013-04-05 14:32:59 · 1144 阅读 · 0 评论 -
Inside the C++ Object Model 深度探索对象模型 1-Object, 2-Constructor
前言摘录 >BarbaraMoo常说 管理一个团队 就像放牧一群骄傲的猫.1 关于对象Object>参数化1234567891011121314151617template class type, int原创 2013-03-03 22:01:05 · 865 阅读 · 0 评论 -
Inside the C++ Object Model 深度探索对象模型 3-DATA 4-Function
3 DATA语意学class X {}; class Y : public virtual X {}; class Z : public virtual X {}; class A : public Y, public Z {};>一个空的class X//sizeof X == 1; 编译器安插了一个char, 记录object在内存中un原创 2013-03-08 17:09:33 · 1534 阅读 · 0 评论