C++需要记住的一些点

来源:互联网 发布:用友软件单机版 编辑:程序博客网 时间:2024/04/29 20:23
  1. 常引用声明方式: const int &ra = a;
  2. 在使用虚函数的类,析构函数也声明成虚函数
  3. explicit的作用: 当一个类的构造函数像这样时 A(int i), 可以 这样构造一个对象A a; a = 10; 这一语句调用了默认的单参数构造函数,而explicit 则是用来禁止这种行为的。
  4. 应该使用 extern”C” 来引用C代码,因为C没有重载,可以只用函数名来标识一个函数,而C++则需要加上参数。
  5. 当类中含有const、reference 成员变量;基类的构造函数都需要初始化表。
    int &ref_; Test(int &val):ref_(val){}
  6. 针对类指针的问题,C++特别设计了更加细致的转换方法,分别有:
    static_cast (expression)
    dynamic_cast (expression)
    reinterpret_cast (expression)
    const_cast (expression)

    • static_cast强制转换,但无关的转换会报错, 不能转换掉expression的const、volatile、或者__unaligned属性。

    • dynamic_cast 确保类指针的转换是合适完整的,它有两个重要的约束条件,其一是要求new_type为指针或引用,其二是下行转换时要求基类是多态的(基类中包含至少一个虚函数)。 dynamic_cast可以识别出不安全的下行转换,但并不抛出异常,而是将转换的结果设置成null(空指针)

    • reinterpret_cast用在任意指针(或引用)类型之间的转换;以及指针与足够大的整数类型之间的转换;从整数类型(包括枚举类型)到指针类型,无视大小。reinterpret_cast通常为操作数的位模式提供较低层的重新解释,比如将浮点数转int, static_cast取整,reinterpret_cast则按内存数据组织成int

    • const_cast转换符是用来移除变量的const或volatile限定符, const_cast可以将常量转成非常量,但不会破坏原常量的const属性,只是返回一个去掉const的变量。。 int* modifier = const_cast<int*>(const_p); const_cast就可以直接使用显示转换(int*)来代替。。但是绝对不对const数据进行重新赋值,即使改了,const也不会变。在什么时候使用,可能调用了一个参数不是const的函数,而我们要传进去的实际参数却是const的,但是我们知道这个函数是不会对参数做修改的。于是我们就需要使用const_cast去除const限定,以便函数能够接受这个实际参数。

  7. 类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是1, 那是被编译器插进去的一个char ,使得这个class的不同实体(object)在内存中配置独一无二的地址。 也就是说这个char是用来标识类的不同对象的.

  8. 当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。 sizeof得不到容量

  9. 用_onexit 注册一个函数,它会在main 之后执行。
    (1)使用格式:_onexit(int fun()) ,其中函数fun()必须是带有int类型返回值的无参数函数;
    (2)_onexit() 包含在头文件cstdlib中,cstdlib为c语言中的库函数;

  10. T& 指向lvalue, const T&即可以指向lvalue也可以指向rvalue。

  11. 一个命名空间的各个组成部分可以分散在多个文件中, 可以嵌套(引用外层空间时,内层的也可用),using std::cout; 只引入cout

  12. 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

  13. #define M(x) #x #运算符会把x转换为用引号引起来的字符串。
    #define M(a,b) a##b ## 运算符用于连接a和b。例子:

    #define concat(a, b) a##bint xy = 100;cout << concat(x, y);  //能替代变量xy
  14. 预定义宏

    • __LINE__ 这会在程序编译时包含当前行号。
    • __FILE__ 这会在程序编译时包含当前文件名。
    • __DATE__ 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。
    • __TIME__ 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。
    • Constant Explanation
    • SIGTERM termination request, sent to the program
    • SIGSEGV invalid memory access (segmentation fault)
    • SIGINT external interrupt, usually initiated by the user
    • SIGILL invalid program image, such as invalid instruction
    • SIGABRT abnormal termination condition, as is e.g. initiated by abort()
    • SIGFPE erroneous arithmetic operation such as divide by zero

    int raise (signal sig); 手动触发信号
    void (*signal (int sig, void (*func)(int)))(int); 注册信号

  15. POD stands for Plain Old Data - that is, a class without constructors, destructors and virtual members functions.

  16. 匿名namespace 是防止命名冲突,与加static的作用大致相同。但匿名namespace可以用于实例化模板。虽然在不同 translation unit都是匿名, 但其实是拥有独特的命名的。

  17. tr1起源:C++03之后的版本计划称为C++0x,又因为计划延迟,改称为C++11,C++0x有很新特性以标准库的形式扩充,这些特性被详细描述于一份称为TR1的文档中,TR1代表“Technical Report 1”。TR1中的14个组件中有10个奠基于Boost,其中包括shared_ptr。TR1本身只是一份文档,具体实现由编译器完成。GCC于4.0版本中加入了TR1的实现,通过 #include <tr1/memory> 使用它,所有组件处于std::tr1命名空间下。在GCC4.3之后,在通过添加编译选项-std=c++0x 并#include <memory> 后,可以在std::下找到shared_ptr。

  18. 使用shared_ptr管理数组时,需要定义其删除器,因为默认使用的是delete,而不是delete []。如果不需要共享管理对象,则使用unique_ptr更合适,因为它对数组作了处理。http://stackoverflow.com/questions/13061979/shared-ptr-to-an-array-should-it-be-used

  19. 前置++比后置++效率高,因为后置的需要返回一个临时对象。 http://blog.csdn.net/weiwangchao_/article/details/4644597

  20. 当只需要知道某个class是一个class而不需要知道其定义时,比如,SomeClass *sc; 就可以使用前置声明(forward declaratine),即class SomeClass;

0 0
原创粉丝点击