上一页 1 2 3 4 5 6 7 8 9 ··· 27 下一页
摘要: 传引用更加高效 缺省情况下,C++ 以传值方式将对象传入或传出函数。除非你特别指定其它方式,否则函数的参数就会以实际参数的拷贝进行初始化,而函数的调用者会收到函数返回值的一个拷贝。这个拷贝由对象的拷贝构造函数生成。这就使得传值成为一个代价不菲的操作。 例如,考虑下面这个类层级结构: 考虑以下代码,在 阅读全文
posted @ 2020-02-08 16:55 刘-皇叔 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 类设计时的思考 实际上每一个类都需要你面对下面这些问题: 新的类型的对象应该如何创建和销毁? 影响构造函数,析构函数的设计。 影响内存分配和回收函数(operator new,operator new[],operator delete,operator delete[])的设计。 对象的初始化和对 阅读全文
posted @ 2020-02-08 16:12 刘-皇叔 阅读(117) 评论(0) 推荐(0) 编辑
摘要: 正确地构造一个 Date Date 对象的构造函数需要传入月、日、年。但客户在调用时常常传错顺序,这时可以将参数封装为对象来提供类型检查: 即使这样,用户的 Month 构造函数仍然会传入一个不合理的参数(例如 32),或者搞不清楚下标从0还是1开始。 解决方案是预定义所有可用的 Month: 可以 阅读全文
posted @ 2020-02-07 10:41 刘-皇叔 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 在单独的语句中将new的对象放入智能指针 在单独的语句中将new的对象放入智能指针,这是为了由于其他表达式抛出异常而导致的资源泄漏。 因为C++不同于其他语言,函数参数的计算顺序很大程度上决定于编译器。 上述代码中,在 函数被调用之前参数会首先得到计算。可以认为包括三部分的过程: 执行 。 构造 。 阅读全文
posted @ 2020-01-15 09:44 刘-皇叔 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 成对的使用 new/delete 和 new[]/delete[] 当你使用了一个 new 表达式,有两件事情会发生: 分配内存(通过一个被称为 operator new 的函数)。 一个或多个构造函数在这些内存上被调用。 当你使用一个 delete 表达式,有另外的两件事情会发生: 一个或多个析构 阅读全文
posted @ 2020-01-15 09:27 刘-皇叔 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 在一个完美的设计中,所有的资源访问都应通过资源管理对象来进行,资源泄漏被完美地克服。然而世界是不完美的, 很多API会直接操作资源,尤其是一些C语言的API。总之,你会时不时地发现有需要直接访问资源, 所以资源管理对象需要提供对原始资源访问。获取资源的方式有两类:隐式地获取和显式地获取。 通常来讲, 阅读全文
posted @ 2020-01-15 09:18 刘-皇叔 阅读(76) 评论(0) 推荐(0) 编辑
摘要: 版本介绍 QT的版本为:5.14.0。 海思型号:3516。 QT界面无法显示中文 在 Windows PC 上C盘搜索 .ttf 会出现很多以此为后缀的字体,在这里我选择的是 simkai.ttf。 将其拷贝到板子上, 并且设置环境变量: export QT_QPA_FONTDIR=$QT_ROO 阅读全文
posted @ 2020-01-14 17:19 刘-皇叔 阅读(1201) 评论(0) 推荐(0) 编辑
摘要: RAII 类的拷贝 例如,假设你使用 C API 提供的 lock 和 unlock 函数去操纵 Mutex 类型的互斥体对象: 为了确保你从不会忘记解锁一个被你加了锁的 Mutex,你希望创建一个类来管理锁。RAII 原则规定了这样一个类的基本结构,通过构造函数获取资源并通过析构函数释放它: 客户 阅读全文
posted @ 2020-01-12 19:30 刘-皇叔 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 使用对象管理资源 假设我们和一个投资(例如,股票,债券等)模型库一起工作,各种各样的投资形式从一个根类 Investment 派生出来: 进一步假设这个库使用了通过一个 factory 函数为我们提供了特定的 Investment 对象的的方法: 考虑一个 f 函数来履行以下职责: 有可能在这个函数 阅读全文
posted @ 2020-01-12 19:04 刘-皇叔 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 拷贝函数 在设计良好的面向对象系统中,封装了对象内部的配件,仅留两个函数用于对象的拷贝,它们统称为拷贝函数:拷贝构造函数和拷贝赋值运算符。 考虑一个象征消费者的类,这里的拷贝函数是手写的,以便将对它们的调用记入日志: 这里的每一件事看起来都不错,实际上也确实不错——直到 Customer 中加入了另 阅读全文
posted @ 2020-01-12 13:51 刘-皇叔 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 自赋值是不安全的也是异常不安全的 当一个对象赋值给自己的时候就发生了一次自赋值。 这看起来很愚蠢,但它是合法的,所以应该确信客户会这样做。另外,赋值也并不总是那么容易辨别。例如, 如果两个对象来自同一个继承体系,甚至不需要公开声明,它们就是相同的类型,因为一个基类的引用或者指针也能够引向或者指向一个 阅读全文
posted @ 2020-01-12 13:12 刘-皇叔 阅读(313) 评论(0) 推荐(0) 编辑
摘要: 赋值运算符应该返回自身的引用 赋值运算符可以穿成一串使用: 并且赋值运算符是右结合的,所以,上面的赋值串可以解析为: 这里的实现方法是让赋值返回一个引向它左侧参数的引用,而且这就是设计类时应该遵守的惯例: 这个惯例适用于所有的赋值运算符,而不仅仅是上面的标准形式: 总结 让赋值运算符返回一个引向 的 阅读全文
posted @ 2020-01-12 12:12 刘-皇叔 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 类构造和析构期间不会发生向下转换 假设你有一套模拟股票交易的类继承体系,例如,购入订单,出售订单等: 调用: 输出: 基类要先于子类构造,基类构造期间,虚拟函数从来不会向下匹配到派生类。取而代之的是,那个对象的行为好像它就是基类型。在一个派生类对象的基类构造期间,对象的类型是基类的类型。不仅虚拟函数 阅读全文
posted @ 2020-01-07 10:11 刘-皇叔 阅读(101) 评论(0) 推荐(0) 编辑
摘要: 析构函数中发生异常是件棘手的事 由于析构函数常常被自动调用,在析构函数中抛出的异常往往会难以捕获,引发程序非正常退出或未定义行为 当 v 被析构时,它有责任析构它包含的所有 Widgets。假设 v 中有十个 Widgets,在第一个的析构过程中,抛出一个异常。其它 9 个 Widgets 仍然必须 阅读全文
posted @ 2020-01-04 10:31 刘-皇叔 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 多态基类应该声明虚拟析构函数 有很多方法取得时间,所以有必要建立一个基类,并为不同的计时方法建立派生类: getTimeKeeper 返回一个指向派生类对象的指针(比如 AtomicClock),那个对象经由一个基类指针也就是一个 TimeKeeper pointer 被删除,而且这个基类非虚拟析构 阅读全文
posted @ 2020-01-02 22:57 刘-皇叔 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 拒绝编译器自动提供的机制 将拷贝构造函数和拷贝赋值运算符声明为私有的。通过显式声明一个成员函数,可以防止编译器生成它自己的版本,而且将这个函数声明为私有的,可以防止别人调用它。 通常,这个方案并不十分保险,因为成员和友元函数还是能够调用你的 private 函数。换句话说,除非你十分聪明地不定义它们 阅读全文
posted @ 2020-01-02 09:42 刘-皇叔 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 编译器默认为一个类生成的函数 如果你自己不声明一个拷贝构造函数,一个拷贝赋值运算符和一个析构函数,编译器就会为这些东西声明一个它自己的版本。此外,如果你自己根本没有声明构造函数,编译器就会为你声明一个缺省构造函数。所有这些函数都被声明为 public 和 inline。作为结果,如果你写: 在本质上 阅读全文
posted @ 2020-01-02 09:28 刘-皇叔 阅读(238) 评论(0) 推荐(0) 编辑
摘要: C++'s most vexing parse 是 Scott Meyers 在其名著《Effective STL》中创造的一个术语。Scott 用这个术语来形容 C++ 标准对于 declaration 语句的消歧义(ambiguity resolution)约定与常人的认知相悖。 形如 Type 阅读全文
posted @ 2019-12-31 10:10 刘-皇叔 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 对象初始化方法 对于内建类型的非成员对象,初始化手动执行: 除此之外的几乎全部情况,初始化的重任就落到了构造函数的身上。这里的规则很简单:确保所有的构造函数都初始化了对象中的每一样东西。 这个规则很容易遵守,但重要的是不要把赋值和初始化搞混。考虑下面这个表现一个通讯录条目的类的构造函数: C++ 的 阅读全文
posted @ 2019-12-31 09:42 刘-皇叔 阅读(226) 评论(0) 推荐(0) 编辑
摘要: const 与指针 const 出现在 左边,则指针指向的内容是 const。 const 出现在 右边,则指针本身是 const。 const 出现在 两边,两者都是 const。 当指针指向的内容是常量时,将 const 放在类型前和放在类型后是没有区别的: 变与不变 当指针指向的内容是常量时, 阅读全文
posted @ 2019-12-31 09:32 刘-皇叔 阅读(183) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 ··· 27 下一页