zoukankan      html  css  js  c++  java
  • Effective C++总结

    条款1:尽量用const和inline而不用#define

    本质是你想编译时就检查出错误,还是运行时出错。

    const inline是编译期执行,有参数检查等动作,而#define是预编译时执行。

    但是不能完全抛弃#define,它可以控制是否编译某段代码。

    条款2:尽量用<iostream>而不用<stdio.h>

    为什么呢,一个简单的原因是stdio的控制格式实在够烦人的,还有什么原因呢?

    作者给出的原因很有深度“iostream具有类型安全和可扩展的特点,而stdio则没有此特点,类型安全和扩展性是C++的基石”。

    什么是类型安全——类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。

    (一篇谈类型安全的不错的博文http://blog.csdn.net/btwsmile/article/details/6693178

    1. int main()  
    2. {  
    3.     printf("%f\n",10);  
    4.     system("pause");  
    5.     return 0;  

    上面代码输出0.000000,这就是类型不安全!

    那么扩展性指的是什么?——重载!

    条款3:尽量用new和delete而不用malloc和free

    malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。

    条款4:尽量使用c++风格的注释

    该条款没多大意思,要注意的是/* */形式的注释不能嵌套。

    C++风格的注释,指的是行注释。

    条款5:对应的new和delete要采用相同的形式

    new数组对应delete [].

    string *stringptr1 = new string;
    string *stringptr2 = new string[100];
    
    ...
    
    delete stringptr1;// 删除一个对象
    delete [] stringptr2;// 删除对象数组
    

    如果你在stringptr1前加了"[]"会怎样呢?答案是:那将是不可预测的;

    如果你没在stringptr2前没加上"[]"又会怎样呢?答案也是:不可预测。而且对于象int这样的固定类型来说,结果也是不可预测的,即使这样的类型没有析构函数。

    所以,解决这类问题的规则很简单:如果你调用new时用了[],调用delete时也要用[]。如果调用new时没有用[],那调用delete时也不要用[]。

    条款6:析构函数里对指针成员调用delete

    new和delete是一一对应的,可用auto_ptr智能指针解决忘记释放申请的内存问题。

    条款7:预先准备好内存不够的情况

    使用set_new_handler是处理内存不够情况下一种方便,简单的方法。

  • 相关阅读:
    CF251D
    P6914
    CF1100F
    双连通 / 圆方树 胡扯笔记
    P4082
    SparkSql使用Hive中注册的UDF函数报类找不到问题解决
    Oracle 查询时使用时间作为where报错hour must be between 1 and 12
    【面试-python】
    Linux和Git
    AMBA初探
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3133926.html
Copyright © 2011-2022 走看看