c++学习

  1. 函数的new ,delete运算符也可以重载。

    void* operator new(size_t size)

    void operator delete(void *memblock),但是注意当类有虚析构函数的时候,delete必须有实现体

  2. 复制构造函数传入的参数必须是引用或者常引用。因为传入副本的话,复制副本的过程会导致无限递归。

  3. struct {int x; int y; int y}Point;

    Point* pPoint = NULL;

    int offset = (int)(&(pPoint)->z);

    结论:offset == 8。&(pPoint)->z表示取point中z的地址。pPoint地址是0,所以加上偏移量8,z的地址就是8.并不需要point的实际地址。改方法可用来求一个变量在对象中的偏移量

  4. 类的函数地址并不存放在对象中,所以在调用成员函数的时候,并不需要对象的地址

  5. class A{

    int value;

    public:

    void print1(){cout<<"print1";};

    void print2(){cout<<value;};

    }

    测试:A* a = nullptr; a->print1();a->print2();

  6. 结果:print1正常打印,因为在调用函数的时候会把对象的this传递给函数,但是在print1并未使用到

    print2崩溃,应为用到this的value变量

  7. 数组和指针的区别

    a 修改数据的区别:如果指针指向的是常量,那么修改会在运行时报错。

    b sizeof数组得到的是数组的长度,sizeof指针得到的是指针变量的长度,通常是4个字节

  8. overload(重载)和overide(重写)

    重载表示函数方法名相同,但是参数表不同。c++通过参数表构建函数的全名

    重写表示子类重写父类的函数

  9. delete 和delete[]区别:

    delete[]表示删除数组,并且调用数组每个元素的析构函数,对于基础类型,2个方法没有区别

  10. 引用作为函数返回值的注意事项

    a 临时变量不能作为返回值。因为临时变量会被销毁

    b new 出来的对象也不能作为返回值,因为函数的返回值往往作为一个临时变量来使用,所以导致new分配的内存无法跟踪,导致内存泄漏

    c 类的成员变量可以作为返回值,但最好是const?

  11. 数组的引用与引用的数组

    数组可以有引用,int a [] = {1,1}; a的引用为 int (&b) [2]= a;

    不可以有引用的数组。因为引用是别名,不暂用存储空间。但是数组用连续空间存储变量,所以不能有引用的数组

  12. c++11新特性,new std::nothrowA()当内存不足时,返回null

  13. volatile。表示获取变量的时候都从地址获取。如果没有这个变量则可能优化为从寄存器中获取

  14. #ifdef __cplusplus

    extern "C" {

    #endif

    xxxxx

    #ifdef __cplusplus

    }

    #endif

    extern "C":告诉c++编译器,以下是c风格写的代码

  15. 可以通过继承模板单例类来实现单例

  16. explicit关键字用来拒绝隐式转换,比如A a2;默认会调用A temp2); atemp);当加了关键之那么编译不能通过。

  17. RTTI 运行时类型信息,运行时识别对象信息,c++只记录类的名字和继承关系链。

    B继承AA * a  new B();const type_info& typeinfo  typeida

    typeinfo.name() class A*




你可能感兴趣的:(c++学习)