首页 > 技术文章 > C++知识点

Tempt 2018-11-20 10:34 原文

1.new申请对堆空间,方括号里必须是整型,
    int * p =new int [10] ()    加括号全部初始化为0  
    int * p =new int [10] {1,2,3,4,5}    加大括号按位置初始化 
    动态分配一个空数组是合法的    char *p =new char[0]    (合法)
    释放动态数组,delete[]p 是销毁数组中的元素,倒序销毁
    普通类型的释放 加不加 [ ] 都能释放掉,但是在类中 释放对象的时候,不加[ ],只会释放第一个对象
    剩余对象会泄露掉
    总结:new 和 delete 是关键字    malloc和free是函数
               在类中使用new和delete会自动调用构造和析构函数    在释放多个对象的时候注意加 [ ]
 
2.函数重载:a.相同作用域下  
                     b.函数名称相同  
                     c.参数不同           (多态性)        名称粉碎机制,给函数修改成了不同的名字
 
3.默认参数:定义的规则必须是从右到左,连续的赋值
 
4.引用:引用必须初始化,并且不能修改
            引用与指针的区别:
                             引用访问变量是直接访问,而指针是先保存变量地址,间接访问
                             引用是一个变量的别名,它不单独分配自己的内存空间,但是指针有自己的内存空间
 
5.iostream是istream和ostream派生而来
    而cout是ostream类对象    cin是istream的类对象
 
6. 面向对象的三大特性:封装,继承,多态 (考试必考,亲测 :) )
 
7.类的大小有其数据成员所占空间和决定    空对象的大小为1 (也就是所谓的空类,编译器会隐士生成6个成员)
 
8.静态成员变量和静态成员函数:
        静态成员变量属于类共享,不属于对象独有,我们可以通过对象去访问他们
        静态成员函数:首先说明:静态成员函数属于类,不属于任何对象!因此静态成员函数就不能是虚函数   虚函数属于对象所有! 
        成员变量和虚函数都属于对象创建出来,那么既然静态成员函数不是对象所有,那么静态成员函数内部就不能直接去访问类中的成员变量。只能通过在静态成员函数里面通过对象去访问
 
9.构造函数与析构函数,调用顺序:先创建继承的构造,在类中成员变量的构造,最后自己的构造,析构顺序刚好相反
 
10.构造函数赋值顺序,参数列表里面写的顺序没有讲究,但是赋值的顺序,是类中定义的顺序赋值,先给第一个变量赋值,如果第一个变量的值是后面成员变量的值,他就为0ffffff   对象成员的构造顺序只和定义顺序有关,和初始化列表顺序无关
 
11.初始化列表中必须要有的:我们如果定义了成员变量中有const类型的成员,或者引用类型的成员,我们就必须在初始化列表中去初始化它!!因为他们是一经定义则必须初始化的,并且后面不能修改 。类中其他类的对象,如果有构造函数,则必须在初始化列表中出给他们初始化
 
12。如果基类是纯虚类,那么子类中必须去实现基类的纯虚函数,如果没有实现,那么子类也就默认称为纯虚类
 
13.重载,重写,重定义
    重载:相同作用域,函数名相同,参数不同
    重写:不同作用域,函数名相同,参数相同,基类函数必须要有virtual关键字        (虚继承的时候)
    重定义:不同作用域,(函数名相同,参数相同的时候,没有virtual关键字) 函数名相同,参数不同,virtual可有可无
 
14.析构函数为什么能称为虚函数?(必考
         基类指针指向子类对象,是多态常见的做法,那么delete基类指针去释放空间,也是常见的做法,但是在这里,delete基类指针只会调用基类的析构函数,子类的析构函数不会被调用,所以子类的内存可能会发生泄露,所以在这里,将基类的析构函数,设置为虚函数,delete基类指针时,会同时调用派生类的析构函数
 
15.什么函数不能是虚函数:构造函数,内联函数,友元函数,静态函数
                也就是只有是成员函数才能称为虚函数,成员函数怎么来,靠类对象创建出来,这也就说明了 我们如果让构造函数为虚函数,类对象还没有创建出来,我们就让构造函数为虚函数,明显不对,只有调用了构造函数,才会创建出来对象
 
16.函数模板是一组函数的描述,它不是一个实实在在的函数,表示每次它能单独处理在类型形式参数中说明的数据类型,编译器不会为其产生代码
 
17.const问题:int const * p        int  * const p
            const在*的左边就代表我们可以修改指针指向对对象,但是不能修改它的值
            const在*的右边就代表,我们只能指向一个对象,不能更改指向对象,但是我们可以修改它的值
 
18.友元函数的声明只能在类的内部,至于定义可以在类内,也可以在类外,他就是一个普通的函数,它不属于类,也不属于对象
 
19.  运算符重载  自增运算符 前置++ 参数列表中没有值        后置++ 函数的参数列表(int)
        单目运算符为成员函数    双目运算符为友元函数
 
20. C++捕获异常机制,try后面紧跟catch  中间不能有其他语句        一个try可以跟多个catch  但是多个try不能跟一个catch
 
21. 格式控制符 %md 右边对齐数字 不足的位 左边补空格  
        %-md 反之,左边补齐,不足的右边补齐        (m为要输入几位)
        当然%ms 和 %-ms  也遵循上面原则        
 
22.位运算符操作:按位与:  0 & 0  =0              1&0=0        0&1=0        1&1=1
                              按位或:  0 | 0 = 0                1|0=1         0|1=1         1|1=1
                              按位异或  0^0=0                 1^0=1         0^1=1         1^1=0
    正数负数移位的时候
    正数比较简单,左移右移都是补0
    负数:移动之前先对其二进制位取反+1,然后在符号位不变,左移右边补0,右移 左边补1。 移动完后再取反+1
                                   
23.枚举写的时候注意格式
  1. enum DIR
  2. {
  3. up,
  4. down,
  5. left,
  6. right //最后一个不用写逗号
  7. };//不要忘记分号
默认从0开始   所以 up=0,down=1,left=2,right=3
如果 up=45,则 down =46,left=47,right=48
... 如果 up=56  则down =57  但是如果指定left=88,right就是89 (必考)
 
 
 
 
 
 
           

推荐阅读