首页 > TAG信息列表 > Effective
Effective C++ - 条款3 - 关于const的一切
const与* 符号左侧为所指对象的语义,符号右侧为指针自身语义 const与iterator const iterator(是T* const) != const_iterator 详细原因应参考c++编译和c++设计与演化 const避免将==写成= 运算符的重载函数返回const对象可以避免运算结果被赋值,该赋值可能是由于错误将==写为=导致的《Effective Java》第16条:要在仅有类中使用访问方法而非公有域
《Effective Java》第16条:要在仅有类中使用访问方法而非公有域 一、 问题 有时候我们需要定义一些类用来集中实例域(Java对象中的数据)。经常我们会把这些数据域声明为public,可以被直接访问。这样公有类暴露了它的数据域,有以下两个缺点: 1、要想在将来改变其内部表示法是不可能的,因为【Effective C++】设计与声明——成员变量和成员函数
将成员变量声明为private 为什么成员变量不该是public? (1)从语法一致性来说,如果成员变量不是public,就需要通过成员函数访问成员变量。public接口内的每样东西都是函数的话,客户就不需要在访问class成员时考虑要不要加小括号。(2)如果成员变量是public,任何人都可以读写它,而设为private后Effective C++:把C++看作一个语言联邦
C++曾经是从C with class发展而来的,但是现在随着异常、模板、STL等等的发展,C++已变得相当的多样与庞大,这一方面让C++功能强大无比的多重范式语言,上天入地无所不能;另一方面,也给学习者带来了相当的困难:处处都有繁杂特殊用法,处处又都有例外,怎么办呢? 解决大问题的第一步是分解问题,最简Effective C++:以const、enum和inline来替换define
替换define,也就是“以编译器替换预处理器”。#define是C语言里的利器,但在C++里有很多取代它的理由。 define是预处理的一部分,而不是编译器的一部分,它在编译前就被替换掉,因此不会保留符号信息。 #define ASPECT_RATIO 1.653 //const double ASPECT_RATIO = 1.653; 假设后文里ASPEffective c++ 条款9 绝不在构造和析构过程中调用virtual函数
问题: 当derived class对象调用derived class constructor函数前,会先调用base class constructor函数。如果derived class重写了base class的虚函数vfunc(),base class constructor函数中调用vfunc(),此时derived class对象调用base class constructor,会调用base class版本的vfunEffective c++ 条款8 别让异常逃离析构函数
c++并不禁止析构函数吐出异常,但不鼓励这样做 问题:若两个异常同时存在,程序不是结束执行就是导致不明确行为 class A { public: ··· ~A(){...} //可能抛出一个异常 } void doSomething() { std::vector<A>v; } //v在这被自动销毁并有责任销毁其内含的对Effective c++ 条款7 为多态基类声明virtual析构函数
问题: 当一个base class指针指向子类对象,若base class带着一个non-virtual析构函数,此时delete base class指针时,只会释放掉base class对象的资源,并不会释放drived class对象的资源,最终造成内存泄漏 解决: 任何带有virtual函数的class都应有一个virtual析构函数 虚函数实现原Effective 条款5:了解C++默默编写并调⽤哪些函数
一个empty class编译器会自动声明: default构造函数(没有声明构造函数) copy构造函数 copy assignment运算符 析构函数(non-virtual) 唯有这些函数被调用,才会被编译器创建出来 class中若含有reference/const成员,编译器不会生成copy assignment操作符,而由程序员自己定义 若某个baseeffective c++ 条款4:确定对象被使用前已先被初始化
确保每一个构造函数都将对象的每一个成员初始化 使用member initialization list 替换 assignment: 总是在初值列中列出所有成员变量 base classes比derived classes更早初始化,而class的成员变量总以其声明次序被初始化,即使他们在成员初值列中以不同次序出现,也不会有任何影Effective c++条款2:尽量用const,enum,inline替换#define
#define ASPECT_RATIO 1.653 ASPECT_RATIO可能从未被编译器看见;也可能在编译器开始处理源码前就被预处理器移走。这也就导致其可能没进入symbol table。 且对浮点常量而言,预处理器盲目地将宏名称替换,可能导致object code出现多份 解决之道: 利用const替换define const doubEffective TypeScript All In One
Effective TypeScript All In One 1st edition (November 12, 2019) https://effectivetypescript.com/ https://github.com/danvk/effective-typescript refs https://www.amazon.com/Effective-TypeScript-Specific-Ways-Improve/dp/1492053740 ©xgqfrms 2012-20《Effective C++》阅读总结(五): 继承与面向对象设计&模板&内存&杂项讨论
第六章 继承与面向对象设计 32. 确定你的public继承塑模出is-a关系 public继承意味着要塑模出is-a的关系,所以每一个子类对象也是相应的父类对象,故适用于父类对象的每一个操作也都适用于子类对象。 33. 避免遮掩继承而来的名称 派生类中的名称(包括数据名称和函数名称(不考虑不同传《Effective C++》阅读总结(三):资源管理
C++中的资源管理非常重要,在将资源加载到内存后,便可以使用资源了,当我们不再需要资源时,我们要保证其正确的释放,才能将其占用的内存空间归还给操作系统,不正确的释放很容易造成内存泄漏。本章以资源管理类为基础,提出了以下几条准则,这章内容比较简单,大概总结一下: 13. 以对象管理资源 绝【Effective C++】设计与声明
所谓软件设计,是“令软件做出你希望它做的事情”的步骤和做法,通常以颇为一般性的构想开始,最终演变成十足的细节,以允许特殊接口的开发,这些接口而后必须转换为C++声明式。本章将以接口开始讲解软件设计和声明,主要包括以下几个部分: 接口 类 参数 返回值 成员变量 成员函数 让接口容Effective C++ 总结[条款35 考虑virtual函数以外 的其他选择]
假设写一个原神抽奖的函数,将玩家分为普通玩家、微氪玩家、氪金狂魔等,以下是所有类的基类: class BaseTraveller { public: virtual void lottery(int num); }; 其他玩家分类都可以重写该抽奖函数,以提供不同的抽奖算法。这是用virtual函数来实现的,现在本条款介绍了几种虚函数Effective Modern C++ 条款 11 优先使用 =delete 删除函数 而不是 private 未定义函数
总结自《Effective Modern C++》条款 11 常见场景 单例模式删除复制构造、复制赋值运算符重载 理由 未定义的调用在连接阶段才暴露 =delete 可以支持任何函数的生成,包括非成员函数 =delete 可以阻止模版针对特定类型的实例化 ⚠️ 习惯上,=delete 都是 public 的,因为 C++ 先校验《Effective Python》笔记 第六章-元类与属性
阅读Effective Python(第二版)的一些笔记 目录第44条 用纯属性与修饰器取代旧式的setter与getter方法第45条 考虑用@property实现新的属性访问逻辑,不要急着重构原有的代码第46条 用描述符来改写需要复用的@property方法第47条 针对惰性属性使用__getattr__、getattribute__及__《Effective Python》笔记 第五章-类与接口
阅读Effective Python(第二版)的一些笔记 目录第37条 用组合起来的类来实现多层结构,不要用嵌套的内置类型第38条 让简单的接口接受函数,而不是类的实例hook(钩子函数)第39条 通过@classmethod多态来构造同一体系中的各类对象第40条 通过super初始化超类直接调用父类的``init`使用sEffective HPA:预测未来的弹性伸缩产品
作者 胡启明,腾讯云专家工程师,专注 Kubernetes、降本增效等云原生领域,Crane 核心开发工程师,现负责成本优化开源项目 Crane 开源治理和弹性能力落地工作。 余宇飞,腾讯云专家工程师,专注云原生可观测性、成本优化等领域,Crane 核心开发者,现负责 Crane 资源预测、推荐落地、运营平台建设《Effective Modern C++》概览
第一章 类型推导 1. 理解模板类型推导 在模板类型推导时,有引用的实参会被视为无引用,他们的引用会被忽略 对于通用引用的推导,左值实参会被特殊对待 对于传值类型推导,const和/或volatile实参会被认为是non-const的和non-volatile的 在模板类型推导时,数组名或者函数名实参会退化为指《Effective C++》rule 02: Prefer consts, enums, and inlines to #defines
宏定义的问题 C++ 会在预处理阶段对宏定义进行字符串替换. 因此,如果在一个头文件进行了类似如 #define ASPECT_RATIO 1.653 的宏定义,那么此常量相关的编译错误信息显示的会是 1.653, 而这个宏定义如果不在你写的程序内 (而是它包含的一个头文件内),那么定位问题就会很麻烦. 原因很论文-FlipDA: Effective and Robust Data Augmentation for Few-Shot Learning
论文地址:https://arxiv.org/pdf/2108.06332.pdf 代码地址:https://github.com/zhouj8553/FlipDA 0.摘要 大多数以前的文本数据扩充方法都局限于简单的任务和弱基线。 我们探索了在硬任务(即,few-shot的自然语言理解)和强基线(即,具有超过10亿个参数的预训练模型)上的数据扩充【Effective Java 10.6】覆盖 equals 时请遵守通用约定 —— 写出高质量 equals 方法的诀窍
1. 实现高质量 equals 方法的诀窍 使用 == 操作符检查 ”参数是否为这个对象的引用“。如果是,则返回 true。这只是一种性能优化。引用相同,则必定相等,无需进行后续对值的比较。 使用 instanceof 操作检查 ”参数是否为正确的类型“。如果不是,则返回 false。一般来说,所谓 ”正确的2022Q2-Q4学习计划
# 2022年2th&3th&4th三个季度的计划 # 1. 算法 1.1每周阅读一篇论文, 周日晚上写论文笔记。论文阅读计划 1.2 熟悉Apollo框架及算法实现 2. 计算机基础知识 计算机网络基础 数据库 3. C++ && Python 《Effective C++》 《Effective STL》 《Effective Python》 4.