zoukankan      html  css  js  c++  java
  • C++学习杂记

    一.函数重载:函数名相同,返回值相同,只有参数不同(注意:float,double类型参数).
    二.模板函数:可以将参数和返回值设置为模板类型,编译时候确定具体类型.
    .当模板函数和同名的非模板函数重载时,首先寻找与参数类型完全匹配的非模板函数,找到了,则调用它,如果没找到,则寻找函数模板,找到后具体化函数模板,而后调用该模板函数.
    四.用new分配的数组,必须delete []清除,确保数组中的对象能够正常的调用析构函数,清理资源.
    五.用new创建的类指针,如果被赋值指针并非类指针类型,则调用delete销毁时,一定要先转换回所分配的类指针类型,然后销毁该指针,否则不能正常完成析构.
       例: void *pClass = (void*)new A();
           //delete pClass;   错误写法
           A *pA = (A*)pClass;  //正确做法
           delete pA; 
    六.私有继承关系中,编译器不会自动将一个派生类对象转换为一个基类对象.
    七.数组作为函数参数传递方式:
       方法 1:
        void func(int arr[], const int size) ;
        因为对数组的处理其实是指针,无法从数组本身获得其长度,所以在参数列表中加入一个size来表示该数组长度

        方法 2:
        void func(int arr* const int size) ;
        同方法一,只不过干脆变成了指针的形式。 这些都是传统的c模式下的函数定义方式

         方法3 :
         void func (int (&arr)[10] ) ;
         使用数组引用作为参数。 这样的好处是数组长度是固定的,实参数组的长度必须与虚参数组的长度一致,否则编译会报错。这样作的坏处是,实参长度被限制,缺少了灵活性。 所以有了方法4

          方法4, 使用函数模版:
          template <int size>
          void func(int (&)arr[size]) ;
          这样在调用模版的时候再以常量指定size值,充分有了灵活性

          方法5, 使用无引用的函数模版
          template <int size>
          void func(int arr[size]) ; //其实在函数参数中的size是不起作用的
    八.观念上每个类都会拥有构造函数,析构函数,拷贝构造函数和赋值操作运算符的重载,即使 你自己没有在类中实现,但是从《深度探索C++对象模型》一书中,我知道并不是每个类都产生以上函数,通过位拷贝的方式进行。
    九.如果一个类作为基类,则析构函数设置为虚函数。
    十. 一个数圆成另一个数的倍数例如10要变成大于或等于8的倍数:(10 + (8 - 1)) &~(8 - 1)
         求索引:例如以8为基准小于等于8的为0,9到2*8的为1,依次类推, (10 + (8 - 1))/8 - 1
    十一.new的三种用法:
        1、new operator 即:new表达式,例:string s = new string("test"); 分配空间,然后初始化对象,调用构造函数。与之对应的是delete operator,调用析构函数,释放对象申请的空   间.
        2、operator new 即:new操作符,例:void *buf = operator new(sizeof(string)); 只是申请一块sizeof(string)大小的内存空间,并不会初始化对象和调用构造函数。与之对应的是 operator delete释放空间,并不会调用析构函数。
        3、placement new 即:在指定的内存空间中初始化对象,并调用构造函数。例:void* buf = operator new(sizeof(string));
        buf = new(buf) string("test");首先申请一块空间,然后在该空间上,初始化string对象。与之对应的就是自己需要调用析构函数,并利用operator delete释放内存空间。
        另:operator new 会多申请sizeof(int)大小的内存用来保存这段空间的大小。placement new 如果在申请一个数据的时候也要多申请sizeof(int)大小的空间用来保存数组的大小。eg,void *ptr = operatro new(sizeof(int)*100);int *iPtr = new(ptr)int[100];//如果这样,那么这里将会出错的,因为你实际上系统是申请了100+sizeof(int)的空间!然而ptr上面只有100*szieof(int)的大小,所以申请空间失败。
         
  • 相关阅读:
    hiveserver2 with kerberos authentication
    python Basic usage
    python Quicksort demo
    Python HeapSort
    mrunit for wordcount demo
    CCDH证书
    Hadoop question list
    Hadoop Yarn core concepts
    Hadoop Resource
    Hadoop could not find or load main class
  • 原文地址:https://www.cnblogs.com/ourroad/p/3078936.html
Copyright © 2011-2022 走看看