首页
学习
活动
专区
圈层
工具
发布

【C++】基础:Effective C++高效编程建议

在资源管理类中准备访问裸资源(raw resources) API 经常需要访问裸资源,所以每一个 RAII 类都应该提供取得它所管理的资源的方法。 访问可以通过显式转换或者隐式转换进行。...通常,显式转换更安全,而隐式转换对客户来说更方便。 16. 使用相同形式的 new 和 delete 如果在 new 表达式中使用了 [],就必须在对应的 delete 表达式中使用 []。 17....使接口易于正确使用,而难以错误使用 好的接口易于正确使用,而难以错误使用。你应该在你的所有接口中为这个特性努力。 使易于正确使用的方法包括在接口和行为兼容性上与内建类型保持一致。...预防错误的方法包括创建新的类型,限定类型的操作,约束对象的值,以及消除客户的资源管理职责。 tr1::shared_ptr 支持自定义 deleter。...避免返回对象内部构件的“句柄” 避免返回对象内部构件的句柄(引用,指针,或迭代器)。这样会提高封装性,帮助 const 成员函数产生 const 效果,并将空悬句柄产生的可能性降到最低。 29.

44110

Effective c++ 小结

举例,operator *(Class &lhs, Class &rhs)这种声明,2*obj2的调用,需要对2进行型别转换(构造函数声明为explicit可以阻止隐式型别转换),这样就必须为non-member...类的转换,一是拷贝构造方式可以隐式转换,一是operator Class()方式,当需要型别转换时,就会有模棱两可 语言标准转换,6.02可以转换成int也可以转换成char 多继承也是如此 当遇到模棱两可情况时...条款27: 如果不想使用隐式生成的函数就要显式地禁止它 使用private修饰防止公开调用 不定义防止friend等调用 private: Array& operator=(const Array...如果类D私有继承于类B,类型D的对象只不过是用类型B的对象来实现而已;类型B和类型D的对象之间不存在概念上的关系 如果是私有继承,编译器不会隐式的将子类对象转化成基类对象 私有继承,基类所有函数在子类都变成私有属性...条款43: 明智地使用多继承 多继承会产生模棱两可,子类调用方法如何两个父类都有,则必须指明使用的是哪个父类 多继承会产生钻石型继承体现,为了使得祖先类只有一份,请在两个父类继承祖先的时候采用虚继承

85750
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java的常见误区与细节

    因为大量使用goto语句会降低程序的可读性和可维护性,所以Java语言取消了goto的使用。...如果变量是byte,short,byte类型,当对其赋予编译时期的常量,而该常量又没有超过变量的取值范围时,编译器就可以进行隐式的收缩转换。...这种隐式的收缩转换是安全的,因为该收缩转换只适用于变量的赋值,而不适用于方法调用语句,即不适用于方法调用时的参数传递。 7 注意char类型,这是一个无符号类型。...所有的数组都继承Object类,并且实现了java.lang.Cloneable与java.io.Serializable接口。数组的成员包括变量length(隐式存在)与从Object类继承的成员。...29 如果两个接口声明了相同的变量x,则当某接口同时继承这两个接口,或者某类同时实现这两个接口时,通过简单名称访问会产生编译错误。

    74030

    Java 常见的 30 个误区与细节!

    因为大量使用goto语句会降低程序的可读性和可维护性,所以Java语言取消了goto的使用。...如果变量是byte,short,byte类型,当对其赋予编译时期的常量,而该常量又没有超过变量的取值范围时,编译器就可以进行隐式的收缩转换。...这种隐式的收缩转换是安全的,因为该收缩转换只适用于变量的赋值,而不适用于方法调用语句,即不适用于方法调用时的参数传递。...所有的数组都继承Object类,并且实现了java.lang.Cloneable与java.io.Serializable接口。数组的成员包括变量length(隐式存在)与从Object类继承的成员。...29   如果两个接口声明了相同的变量x,则当某接口同时继承这两个接口,或者某类同时实现这两个接口时,通过简单名称访问会产生编译错误。

    64130

    《Effective C++》学习笔记

    有显式转换方法(如指针的->和(*)操作,也比如自制一个getXXX()函数),还有隐式转换方法(比如覆写XXX()取值函数)。显式操作比较安全,隐式操作比较方便(但容易被误用)。...虚继承会增加大小、速度、初始化(及赋值)复杂度等成本,如果虚基类不带任何数据,将是最具使用价值的情况。 模板与泛型编程 条款41:了解隐式接口和编译期多态 类和模板都支持接口和多态。...因类型参数造成的代码膨胀(比如int和long有相同的二进制表述,但作为模板参数会产生两份代码),往往可降低,做法是让带有完全相同二进制表述的具体类型共享实现码——使用唯一一份底层实现。...条款46:需要类型转换时请为模板定义非成员函数 模板类中的模板函数不支持隐式类型转换,如果你在调用时传了一个其他类型的变量,编译器无法帮你做类型转换,从而报错。...解决方案是将该模板函数定义为模板类内的友元模板函数,从而支持了参数的隐式转换。

    1.2K20

    Java 常见的 30 个误区与细节!

    因为大量使用goto语句会降低程序的可读性和可维护性,所以Java语言取消了goto的使用。...如果变量是byte,short,byte类型,当对其赋予编译时期的常量,而该常量又没有超过变量的取值范围时,编译器就可以进行隐式的收缩转换。...这种隐式的收缩转换是安全的,因为该收缩转换只适用于变量的赋值,而不适用于方法调用语句,即不适用于方法调用时的参数传递。...所有的数组都继承Object类,并且实现了java.lang.Cloneable与java.io.Serializable接口。数组的成员包括变量length(隐式存在)与从Object类继承的成员。...29 如果两个接口声明了相同的变量x,则当某接口同时继承这两个接口,或者某类同时实现这两个接口时,通过简单名称访问会产生编译错误。

    66110

    C#-面向对象编程、接口、泛型

    : 定义一个类的时候,先思考对外提供什么功能,定义一个对外的接口 5 依赖倒置: 依赖抽象代码,因为具体实现容易改变 6 接口隔离:尽量定义小而精的接口,类实现多个功能,继承多个接口 7 里式替换...命名规范:一般接口的命名以"I"开头 实现方式两种: 隐式实现:通过方法名实现方法,方法前加public 显示实现(少用):通过“接口.方法名”的形式实现。...T:Card { } } 使用接口作为泛型约束的实例 对任意可比较类型数据进行升序排序(冒泡) class MyClass02 : IComparable {...1.引用类型约束 where T:class 引用类型用class表示约束,约束必须为一个类,可以是接口interface 2.值类型约束 where T:struct int、char类型都是...struct 3.构造函数类型约束 where T:new() 指定类型T必须有构造函数 4.转换类型约束 就是我们可以通过装箱或者强制类型转换成目标类型的 类型都可以用于类型参数传入。

    87220

    【笔记】《Effective C++》条款26-55

    使用场景和static_cast类似, 在下转型的时候会进行动态类型检查, 能提早排查出static_cast找不出的错误....函数 非虚函数的继承是静态绑定的, 因此如果我们用基类指针指向派生类对象, 然后调用这个非虚函数, 或者反之操作, 都只会调用指针本身声明的那个类型下的函数, 无关其实际对象的类型 相类似的, 函数中的参数和引用在这类场景下也会产生相似的效果..., 我们提前进行的设计需要尽量满足表达式的输入和返回的类型 不管是显式接口还是隐式接口, 都在编译期完成检查, 因此我们都要好好检查, 可能被传入模板的类型到底能不能满足模板的隐式接口 42 了解typename...45 运用成员函数模板接受所有兼容类型 模板之间并没有什么类似继承关系的固有关系, 无法自动在继承类之间进行隐式转换, 智能指针类通过底层的转型来模拟这种关系 方法是编写用于指针间类型转换的构造模板,...T类型转为了U类型, 从而实现了模板类的隐式类型转换 这类的转换的接口形如下图: 46 需要类型转换的时候请为模板定义非成员函数 模板函数进行实参推导的过程中不会自动考虑模板函数的隐式类型转换, 因为从一开始编译器就看不见这个目标转换函数

    1K30

    Effective C++笔记

    在资源管理类中提供对原始资源的访问 APIs往往要求访问原始资源,所以每一个RAII class应该提供一个“取得其所管理的资源”的办法 对原始资源的访问可能经由显示转换或隐式转换。...一般而言显示转换比较安全,但隐式转换对客户比较方便 16. 成对使用new和delete时,要采取相同形式 如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。...在public继承下从没有人希望如此 为了让被遮掩的名称再见天日,可使用using声明式或转交函数 34. 区分接口继承和实现继承 接口继承和实现继承不同。...了解隐式接口和编译器多态 class和templates都支持接口和多态 对classes而言接口是显示的,以函数签名为中心,多态则是通过virtual函数发生于运行期 对template参数而言,接口是隐式的...需要类型转换时请为模板定义非成员函数 当我们编写一个class template,而它所提供的“与此template相关的”函数支持“所有参数的隐式类型转换”时,请将那些函数定义为“class template

    86620

    C# 学习笔记(15)—— C# 4.0

    我们知道,面向对象的继承中就蕴含可变性,当方法声明返回的类型为Stream时,可以在实现中返回一个FileStream类型,这里就存在一个隐式转换。...C# 2.0 确实是不支持的,但因为有了这样的需求,微软便适应地做出了改进,在 C# 4.0 中引入了泛型的协变性和逆变性 协变性 协变性指的是泛型类型参数可以从一个派生类隐式地转换为基类 C# 4.0...,反之则失败 逆变性 逆变性是指泛型类型参数可以从一个基类隐式地转换为派生类,C# 4.0 引入in关键字来标记泛型参数,以示其支持逆变性,下面以 .Net 类库中的接口public interface...由于IComparer接口泛型参数只支持逆变,不支持协变,所以不能把IComparer类型隐式地转换为IComparer,所以会出现编译错误 协变和逆变的注意事项...协变和逆变只适用于引用类型,值类型不支持协变和逆变(因为可变性存在引用转换的过程,而值类型变量存储的就是对象本身,并不是对象的应用),所以List无法转换为IEnumerable<object

    39620

    C#高级语法之泛型、泛型约束,类型安全、逆变和协变(思想原理)

    ,因为Dog继承了Animal,默认会进行一个隐式转换,但是下面这样写 AnimalHouse dogHouse = new AnimalHouse(); AnimalHouse转换类型的错误。...因为协变只能用在接口或者委托类型中,所以我们将AnimalHouse抽象抽来一个空接口IAnimalHouse,然后实现该接口: //动物房子接口(所有动物的房子必须继承该接口,例如红砖动物房子,别墅动物房...,而逆变就是将父类泛型隐式转换为子类泛型 将接口类型改为使用in关键字 public interface IAnimalHouse where T : Animal,new() { } 逆变就完成了...C#中的类型安全个人理解大致就是:一个对象向父类转换时,会隐式安全的转换,而两种不确定可以成功转换的类型(父类转子类),转换时必须显式转换。解决了类型安全大致就是,这两种类型一定可以转换成功。

    7.3K30

    《Effective C++》读书摘要

    三、const const返回值:避免(a*b)=c的错误; const参数:传递指向常量的引用; const成员函数:允许const属性的重载。 四、对象使用前初始化 构造函数成员初始化列表; ?...十五、资源管理类提供原始资源访问 原始资源获取; 隐式转换——类型转换函数。 十六、new-delete同型成对 []的出现与否要对应起来,即使使用了typedef重命名了数组类型。...三十九、审慎使用private继承 私有继承表达的是实现关系,子类使用父类提供的接口,但是不继承; 能用复合不用私有继承; 如何实现final字段: ?...四十、审慎使用多重继承 使用虚基类导致速度变慢; 多重继承中使用公有继承继承接口,私有继承完成实现关系。...(七)、模板与泛型编程 四十一、隐式接口与编译多态 class是显示接口——函数签名,运行多态——虚函数; template是隐式接口——有效表达式,编译多态——模板具体化与函数重载解析。

    2.1K60

    了解C#的协变和逆变

    前言 在引用类型系统时,协变、逆变和不变性具有如下定义。 这些示例假定一个名为 Base 的基类和一个名为 Derived的派生类。...: 兼容性:.NET2.0就推出了泛型,而从.NET 2.0到.NET 3.5期间不支持对泛型接口中的占位符T支持隐式转换,因此在.NET4.0推出协变和逆变 为了支持更广泛的隐式类型的转换,在这里就是在泛型体系中支持...上述例子则是Foo隐式转为FooBase 逆变(Contravariance) 内置的泛型逆变委托Action、Func 、Predicate,内置的泛型逆变接口IComparable、IEquatable...、方法或者委托的输入参数 当要进行类型转换,占位符T要转换的目标类型也必须是其子类,上述例子则是FooBase转为Foo 总结 协变和逆变只对泛型委托和泛型接口有效,对普通的泛型类和泛型方法无效 协变和逆变的类型必须是引用类型...,因为值类型不具备继承性,因此类型转换存在不兼容性 泛型接口和泛型委托可同时存在协变和逆变的类型参数,即占位符T 参考 泛型中的协变和逆变 | Microsoft Docs 《你必须知道的.NET(第2

    1K10

    【Java 基础篇】Java 类型转换

    引用数据类型显式类型转换 引用数据类型之间的显式类型转换通常涉及到父类和子类之间的转换,以及接口和实现类之间的转换。...通过强制类型转换,我们可以将接口类型的对象转换为实现类类型的对象,并调用实现类特有的方法。 需要注意的是,在进行显式类型转换时,如果转换是不兼容的,会导致ClassCastException异常。...强制类型转换的限制 在进行显式类型转换时,需要注意转换的合法性。只能在类型之间存在继承或实现关系时进行转换。否则,会导致编译错误。 3....引用类型的转换 在进行引用类型的转换时,必须确保对象的实际类型与转换的目标类型兼容。否 则,会导致ClassCastException异常。 4....本篇博客详细介绍了Java中的类型转换,包括隐式类型转换和显式类型转换。隐式类型转换是自动进行的,而显式类型转换需要使用强制转换运算符来明确指定转换的目标类型。

    77530

    2020年Java基础高频面试题汇总(1.4W字详细解析)

    注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行时定。...,但在我们使用的时候通过具体的规则来约束,如我们可以约束集合中只存放Integer类型的元素,如 List iniData = new ArrayList() 使用泛型的好处?...操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型, byte a = 127; byte b = 127; b = a + b; // 报编译错误:cannot...特点 : 和运行时异常一样,编译器也不会对错误进行检查。 当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修复这些错误的。...Map(用Key来搜索的专家): 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。

    62511

    【面试必备】Swift 面试题及其答案

    一般的建议是使用最小的工具来完成你的目标,但是有一个好的经验是多使用结构体,除非你用了继承和引用语义。 想要了解更多,点击这里。...上面的代码达到预想的结果,并且防止了传递不同类型的参数。 问题4- 哪些情况下你不得不使用隐式拆包?...2、解决强引用的循环问题——当两个实例对象相互引用,并且对引用的实例对象的值要求不能为 nil 时候。在这种情况下,引用的一方可以标记为 unowned,另一方使用隐式拆包。...建议:除非必要,不要对 option 类型使用隐式拆包。使用不当会增加运行时崩溃的可能性。...下面的代码实现了一个有符号整型转换的初始化方法: 然而,在下面的代码中,当你给一个负值的时候,它会产生一个编译时错误: let myNegative = UInt(-1) 我们知道负数的内部结构是使用二进制补码的正数

    7.3K30

    32道Java基础面试题,哪些你还不会?(1.4W字详细解析)

    注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行时定。...,但在我们使用的时候通过具体的规则来约束,如我们可以约束集合中只存放Integer类型的元素,如 List iniData = new ArrayList() 使用泛型的好处?...操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型, byte a = 127; byte b = 127; b = a + b; // 报编译错误:cannot...特点 : 和运行时异常一样,编译器也不会对错误进行检查。 当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修复这些错误的。...Map(用Key来搜索的专家): 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。

    45320

    第 15 章 面向对象程序设计

    数据抽象,可以将类的接口与实现分离。 继承,定义相似的类型并对其相似关系建模 动态绑定,在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。...如果把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数。 派生类可以直接继承而不要改变的函数。...所以,不存在从基类向派生类的隐式类型转换,但“存在”派生类向基类的转换(只对指针和引用有效、对象类型的话派生类部分会被切断)。...假定 D继承自 B: 只有当 D公有地继承 B时,用户代码才能使用派生类向基类的类型转换;如果 D继承 B的方式是受保护的或私有的,则用户代码不能使用该转换。...B的默认构造函数 D d2(d); // 错误,D的合成拷贝构造函数是被删除的 D d3(std::move(d)); // 错误,隐式地使用 D的被删除的拷贝构造函数

    1.1K30

    Java泛型是什么?

    对于强制类型转换错误的情况,编译器可能不会提示错误,但是在运行时会出现异常,这是一个安全隐患。为了解决这一隐患,从 Java 1.5 开始提供了泛型。...泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。3、泛型集合泛型本质上是提供类型的“类型参数”,也就是参数化类型。...在获取 Map 集合中的元素时,不需要将books.get(id);获取的值强制转换为 Book 类型,程序会隐式转换。...在创建 List 集合时,同样使用了泛型,因此在获取集合中的元素时也不需要将bookList.get(i)代码强制转换为 Book 类型,程序会隐式转换。...4、泛型方法泛型方法使得该方法能够独立于类而产生变化。如果使用泛型方法可以取代类泛型化,那么就应该只使用泛型方法。另外,对一个 static 的方法而言,无法访问泛型类的类型参数。

    21010

    使用 Swift 提高代码质量

    类型安全 强制类型转换 - 禁止隐式类型转换避免转换中带来的异常问题。同时类型转换不会带来额外的运行时消耗。。 提示:编写ObjC代码时,我们通常会在编码时添加类型检查避免运行时崩溃导致Crash。.../协议关联类型代替Any 使用泛型或协议关联类型代替Any,通过泛型类型约束来使编译器进行更多的类型检查。...属性会在读取时隐式强解包,当值不存在时产生运行时异常导致Crash。...// 错误 提示:建议只在小范围的局部代码段使用!强解包。 避免使用try!进行错误处理 使用try!会在方法抛出异常时产生运行时异常导致Crash。 try!...4.需要在运行时动态转换一个实例的类型。 提示:不是所有struct都会保存在栈上,部分数据大的struct也会保存在堆上。 集合元素使用值类型 集合元素使用值类型。

    5K30
    领券