首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

More Effective C++:35个改善编程与设计的有效方法

条款 2:最好使用 C++转型操作符 static_cast 基本上拥有与 C 旧式转型相同的威力与意义,以及相同的限制。 const_cast 最常见的用途就是将某个对象的常量性去除掉。...- 在指定的内存上创建对象; 数组的 new operator : eg, new string[10] 条款 9:利用 destructors避免泄漏资源 将“一定得执行的清理代码”移到processAdoptions...一个exception specification 通常会招致与 try 语句块相同的成本。...是的,80%的执行时间花在大约 20%的代码身上,80%的内存被大约 20%的代码使用,80%的磁盘访问动作由 20%的代码执行,80%的维护力气花在 20%的代码上面。...然而更重要的是,如何训练出锐利的眼力,看出可能产生临时对象的地方。任何时候只要你看到一个 reference-to-const 参数,就极可能会有一个临时对象被产生出来绑定至该参数上。

69910

sed & awk 第二版学习(五)—— 高级 sed 命令

为了修正第二个问题,按如下方式使用 N 命令应该是安全的: $!N 但这样又会多引入一次第一个问题。最好的解决方案就是当这个模式能在一行上匹配时避免读取下一行。...执行的流程是: 1. 用 h 命令将当前输入行复制到保持空间,之后模式空间和保持空间的内容完全相同。...因为没有为 b 命令提供标签,所以跳转到脚本的结尾。 通过使用 ! 并组合一组命令可以实现类似的效果。在应用中对分支命令使用 ! 的优点是,可以更容易地指定要避免的多个情况。!...与 grep 一样,该程序的一个必不可少的部分是只打印匹配模式的行,但它不是使用 -n 选项来抑制默认的行输出,而是构建了一个输入/输出循环,用来控制何时输出或不输出。...使用 sed 的正常控制流,下一个输入行被读入模式空间,并且控制返回到脚本的顶端。每次尝试匹配模式时,都可以用相同的方式使用分支。

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

    学过 C++ 的你,不得不知的这 10 条细节!

    ,应避免使用宏定义。...---- 在 const 和 non-const 成员函数中避免代码重复 假设 MyString 内的 operator[] 在返回一个引用前,先执行边界校验、打印日志、校验数据完整性。...构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,其排列次序应该和它们在 class 中的声明次序(顺序)相同。...---- 细节 05:若不想使用编译器自动生成的函数,就该明确拒绝 在不允许存在一模一样的两个对象的情况下,可以把复制构造函数和赋值操作符函数声明为 private,这样既可防止编译器自动生成这两个函数...---- 方式二:精心周到的语句顺序 把代码的顺序重新编排以下就可以避免此问题,例如一下代码,我们只需之一在赋值 pb 所指东西之前别删掉 pb : A& A::operator=(const A& rhs

    75520

    Java 断言 assert 你真的会用嘛?

    1.2 断言的作用断言的主要作用是在开发和调试阶段快速定位和解决问题,有效避免因为程序中存在非预期的逻辑错误而导致程序崩溃或产生误判的情况。...1.3 断言的优点 提高代码的健壮性:使用断言可以检查程序中存在的非预期情况,有效避免程序中可能存在的潜在错误,提高代码的健壮性。...2.3 关闭断言在生产环境中,为了避免因为断言失败而导致程序异常退出或产生不必要的开销,可以使用命令行参数关闭断言功能,此时所有的 assert 断言语句将不会执行。...3.1 编译器阶段在编译 Java 代码时,编译器会通过检查 assert 断言语句的语法和语义来生成相应的字节码指令。...3.2 运行时阶段当程序在运行时执行到 assert 断言语句时,如果条件表达式为 true,则跳过该语句并继续执行程序;否则抛出 AssertionError 异常,并输出指定的错误信息。

    1.7K30

    C++类自动提供的特殊成员函数

    浅复制仅浅浅地复制指针信息,⽽不会深⼊“挖掘”以复制指针引⽤的结构。 赋值运算符: ANSI C允许结构赋值,⽽C++允许类对象赋值,这是通过⾃动为类重载赋值运算符实现的。...浅复制将导致相同地址重复删除,造成数据受损 如果操作结果是不确定的,则执⾏的操作将随编译器⽽异,包括显⽰独⽴声明 (Declaration of Independence)或释放隐藏⽂件占⽤的硬盘空间。...当 然,编译器开发⼈员通常不会花时间添加这样的⾏为。 如果成员本⾝就是类对象,则程序将使⽤为这个类定义的赋值运算符来复制该成员,但静态数据成员不受影响。...通过返回⼀个对象,函数可以像常规赋值操作那样,连续进⾏赋 值,即如果S0、S1和S2都是StringBad对象,则可以编写这样的代码: S0=S1=S2; //使用函数表示法时,转换为;...⾸先检查⾃我复制,这是通过查看赋值运算符右边的地址 (&s)是否与接收对象(this)的地址相同来完成的。

    72410

    详解 C++ 11 中的智能指针

    std::auto_ptr 真正让人容易误用的地方是其不常用的复制语义,即当复制一个 std::auto_ptr 对象时(拷贝复制或 operator = 复制),原对象所持有的堆内存对象也会转移给复制出来的对象...由于 std::auto_ptr 这种不常用的复制语义,我们应该避免在 stl 容器中使用 std::auto_ptr,例如我们绝不应该写出如下代码: std::vector代码无法通过编译 //std::unique_ptr sp2(sp1); std::unique_ptr sp3; //以下代码无法通过编译 //sp3 = sp1; 禁止复制语义也存在特例...上述代码 33 行表示 DeletorPtr 有点复杂,我们可以使用 decltype(deletor) 让编译器自己推导 deletor 的类型,因此可以将 33 行代码修改为: std::unique_ptr...陷阱一:不应该共享栈对象的 this 给智能指针对象 假设我们将上面代码 main 函数 25 行生成 A 对象的方式改成一个栈变量,即: //其他相同代码省略...

    2.8K31

    8. Groovy 运算符 条件运算符,对象运算符学习

    如果你不使用运算符,也可以纯粹使用代码来实现效果。 3.1 安全导航符(Safe navigation operator) 安全导航运算符用于避免NullPointerException。...通过这个控制符避免NullPointerException异常 3.2 对象直接获取运算符(Direct field access operator) 我们常见的Groovy中的对象创建示例代码如下:...上面的示例展示了,我们使用属性的时候会通过调用该属性的get方法获取返回值。 而我们如果想获取纯粹的属性值,不经过get方法那么该怎么办?可以通过@关键字,直接获取属性值。...为了与Java8 在方法引用上保持一致,在Groovy3.0 之后我们可以使用new获取指定类的构造函数的方法指针。示例代码如下: def foo = BigInteger....但实际上两者是有差别的, 对于动态Groovy,方法引用运算符只是方法指针运算符的别名,两种功能等效。对于静态Groovy,方法引用运算符产生的字节码类似于Java为相同上下文生成的字节码。

    2.1K10

    深拷贝与浅拷贝

    在浅拷贝中,如果对象中存在指针成员变量,那么只会复制指针的值,而不会复制指针所指向的实际数据。 具体来说,浅拷贝仅复制指针的值,使目标对象和源对象共享相同的内存块。...这种情况下,当其中一个对象被析构并释放了内存后,另一个对象的成员指针就会成为悬空指针,指向已释放的内存。使用悬空指针可能导致程序出错、崩溃或产生不可预测的行为。...为了避免这种情况,需要实现深拷贝,确保每个对象都有自己独立的内存副本。 代码示例 浅拷贝 在MyClass类中,使用了默认的移动构造函数、复制构造函数、移动赋值函数和复制赋值函数。...0; } 这段代码的运行结果如下,可知对val2中的data的修改影响了val1 10 20 深拷贝 下面的代码实现了自定义的复制构造函数和赋值运算符重载函数,以执行深拷贝并避免共享数据。...0; } 这段代码的运行结果如下,可知对val2中的data的修改没有影响val1 10 10 -----本页内容已结束,喜欢请分享------

    14010

    “C++的90个坑”-阅读笔记

    (a(), b()),有些环境的执行顺序是a->b->func,有的是b->a->func shared_ptr和auto_ptr可以让动态链接库产生的对象在产生的模块中销毁,但是带来的问题是该智能指针无法升级...答案是会执行a.operator&&(b),结果显而易见,是先执行了b,然后执行&&操作符函数。这样就无法达到我们一般的思维。...+ c 或 a = b + 10的情况,非常危险 建议重载操作符时,使用op=来实现op,这样可以减少比如 a = b + c + d + e …操作时编译器优化后产生的临时对象数量 运行时类型检查(RTTI...)比较耗费性能,无论是dynamic_cast还是typeid 这条是我觉得应该避免的,禁止对象产生在堆之中的方法是把new操作符private了,而强制对象产生在堆里的方法是把构造或析构函数private...或protected了,然后通过另外的函数来产生对象,但是这不能解决继承关系下的产生位置限定,所以我觉得非常应该避免 如上第26所述,缓式评估很NB,但是,在实现的时候要注意写时复制的共享问题,要管理好可共享状态

    1.1K10

    (译) Understanding Elixir Macros, Part 3 - Getting into the AST

    最后, 由于宏在编译期间运行, 因此可以通过将计算转移到编译时来优化一些代码. 因此, 肯定会有适合宏的情况, 您不应该害怕使用它们....然后, 在 quoted 的代码中, 我们通过分别计算左边和右边重新解释 == 操作(第 4 行和第 5 行), 然后是整个结果(第 7 行)....我还引入(实际上, 是从 Elixir 源代码中复制粘贴了)guard 语句指定了宏能处理的运算符集(第 3 行). 这个检查有一个特殊原因....所以, 当我们想生成一个二进制操作代码时, 我们需要注入一个正确的 AST, 它(如前所述)与双参数的函数调用相同....因此, 我们可以简单地使用函数调用的方式 unquote(operator)(left, right). 这一点讲完了, 今天的这一章也该结束了. 它有点短, 但略微复杂些.

    15550

    Visual C++ 中的重大更改

    若要避免难以检测和诊断的运行时错误,我们建议你永远不静态链接到使用不同编译器版本编译的二进制文件。 此外,当你升级 EXE 或 DLL 项目时,请确保升级它所链接的库。...通过值捕获异常还要求异常对象可复制。...重大更改为,如果你之前使用的是具有相同签名的运算符 delete(以与 placement new 运算符对应),你将收到编译器错误(C2956,在使用 placement new 的点位置出现,因为在代码中的该位置...如果你使用的是默认项目设置,则此更改不会对你产生影响,因为链接器将自动使用新的默认库。...此外,这些函数现在遵循舍入模式(可通过 fesetround 控制)。  这可能是重大的行为更改,因为这些函数可能会输出不同的结果。 新版本的结果始终比旧版本的结果更准备。

    4.8K00

    Visual C++ 中的重大更改

    若要避免难以检测和诊断的运行时错误,我们建议你永远不静态链接到使用不同编译器版本编译的二进制文件。 此外,当你升级 EXE 或 DLL 项目时,请确保升级它所链接的库。...通过值捕获异常还要求异常对象可复制。...重大更改为,如果你之前使用的是具有相同签名的运算符 delete(以与 placement new 运算符对应),你将收到编译器错误(C2956,在使用 placement new 的点位置出现,因为在代码中的该位置...如果你使用的是默认项目设置,则此更改不会对你产生影响,因为链接器将自动使用新的默认库。...此外,这些函数现在遵循舍入模式(可通过 fesetround 控制)。  这可能是重大的行为更改,因为这些函数可能会输出不同的结果。 新版本的结果始终比旧版本的结果更准备。

    5.3K10

    Redis Lua脚本中学教程(上)

    这意味着我们要尽量避免脚本的执行时间过长。 脚本整体复制 当脚本进行传播或者写入AOF文件时,Redis通常会将脚本本身进行传播或写入AOF,而不是使用它产生的若干命令。...这个复制整个脚本的方法有以下属性: 如果输入相同,脚本必须输出相同的结果。...可以通过修改lua-time-limit变量来控制最大执行时间。 当脚本执行时间超过最大执行时间时,并不会被自动终止,因为这违反了脚本的原子性原则。...另一方面,如果使用特殊命令或者通过redis.conf来定义命令会有以下问题: 不同实例有不同的实现方式 发布将会很困难,特别是分布式环境,因为要保证所有实例都包含给定的命令 读应用程序代码时,由于它调用了服务端命令...,会不清楚代码的语义 为了避免这些问题,同时避免浪费带宽,Redis实现了EVALSHA命令。

    85120

    深度总结了类的相关知识)(中)

    4.拷贝构造函数 4.1 拷贝构造函数的定义与特点 拷贝构造函数是用来通过已有对象来初始化新对象的特殊构造函数。它的主要作用是复制一个对象的所有成员,从而创建一个新的与原对象相同的对象。...浅拷贝 vs 深拷贝: 浅拷贝:默认拷贝构造函数执行浅拷贝,即简单地复制对象的成员变量。如果对象包含指针成员,浅拷贝只会复制指针的地址,而不会复制指针指向的内容。...运算符重载使得自定义类可以使用与内置类型相同的运算符进行操作,提高了代码的可读性和一致性。 在C++中,赋值运算符的重载允许你定义如何将一个对象的值赋给另一个对象。...const Date& d: 这是一个常量引用类型的Date对象。使用const确保函数在输出时不会修改传入的Date对象,使用引用避免传递对象时的拷贝,提高效率。...const成员函数的作用: 提高代码安全性,确保某些操作不会意外修改对象的状态。 使得const对象可以调用这些函数,保持接口的一致性。

    9810

    C++内存管理(建议收藏)

    动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,否则肯定有错误(new/delete同理)。 * 释放了内存却继续使用它。...标准容器(standard containers)是一个优秀的例子。它们不是通过你而是自己为元素管理内存,从而避免了产生糟糕的结果。...通过使用函数对象和标准算法(standard algorithm),我可以避免使用指针——例如使用迭代子(iterator),不过对于一个这么小的程序来说有点小题大作了。...这些技巧并不完美,要系统化地使用它们也并不总是那么容易。但是,应用它们产生了惊人的差异,而且通过减少显式的内存分配与重新分配的次数,你甚至可以使余下的例子更加容易被跟踪。...另外,相比于栈空间,堆的容量要大得多。实际上,当物理内存不够时,如果这时还需要生成新的堆对象,通常不会产生运行时错误,而是系统会使用虚拟内存来扩展实际的物理内存。 接下来看看static对象。

    3.3K41

    你知道 Chrome 专门为调试提供的这些函数吗?

    当我在第一次看到这些函数时非常兴奋,把它们直接写到了自己的代码中,结果当然是跳出了各种 Uncaught ReferenceError:xxx is not defined 错误。...用到很多不能 Chain 的 Function 時能利用 _ 來避免游標來回修改:用到很多不能Chain的功能时能利用 _来避免游标来回修改: ?...顺带提一句,将来也有可能会出现 Pipeline operator 来做到任意的函数链接,一次来促进提升性或避免修改内建原型。...Function 被行時印出 Function 名和, 用法和 debug 类似,monitor 函数被执行时会输出函数名称和参数,可用 unmonitor(function) 来停止,不过不能用于箭头函数...,不过我的理解是:返回所有原型链中包含该原型的对象。

    1.5K11

    C ++ 中不容忽视的 25 个 API 错误设计!

    从而: 如果你编写/禁用复制构造函数或复制赋值运算符,您可能需要对另一个执行相同操作:如果执行“special”工作,则另一个可能也应如此,因为这两个函数应该具有相同的效果。...我们可以这样一些事情: 为创建底层资源的深层副本的类提供复制构造函数,例如(int *)就是这种情况。 通过删除复制构造函数和复制赋值运算符使类不可复制。 最后,在API头文件中提供该信息。...因此,如果你没有在API中将MOVE CONSTRUCTOR和MOVE ASSIGNMENT OPERATOR标记为noexcept,则如果客户计划使用STL容器,则可能会对你的客户产生严重的性能影响。...错误#8:通过const引用返回API的内部 为什么这是一个错误? 从表面上看,通过const引用返回一个对象似乎是双赢的。这是因为: 避免不必要的复制。...我如何以及在何处使用此代码,这对产生了极大的影响。例如如果这是一个同步调用,我永远不会在像游戏场景渲染循环这样的时间关键代码路径中使用它。 如何解决这个问题?

    1.6K20
    领券