c++学习心得

1. c++中类中非静态成员函数 默认访问的时候会有一个this指针指向它,而静态成员函数没有。this 指针的作用就是其实是改对象的一个地址,而静态成员函数因为在全局区域它不属于任何一个对象因此没有this 指针。

2. c++ 中类和结构体的区别,c++中类结构体的区别不像c#中,类是引用类型结构体是值类型.结构体不能继承。由于c++是从c演变而来因此c++中结构体是对c中结构体的保留。c++结构体基本上与类没有任何区别,除了默认结构体中成员是public而类是private,继承的时候c++默认继承后的成员访问权限private(虽然父类是public),而结构体继承后访问权限是public

3. c++多态通过vprt指针指向虚函数表实现 (虚函数表就是存储了很多指向虚函数的指针,vprt指针指向这个虚函数表),在每一个实例化类对象前面会有一个pvrt指针指向该类的虚函数表,当通过基类指针指向一个子类的虚函数的时候,就会调用子类的pvrt指针所指向的虚函数(至于为什么基类的指针怎么找到子类的这个vprt指针,看到网上有人说因为子类的虚函数表也属于基类 我不认同,我觉得应该是基类的指针调用对象的时候先找到这个vprt指针,继而通过这个vprt指针找到子类的虚函数表对应的虚方法,并且这种解释也对应了 pvrt指针是一个存储在对象地址前面的的指针,存储在最前面的目的是为了提高效率 这一说法)。

Typically, the compiler creates a separate virtual method table for each class. When an object is created, a pointer to this table, called the virtual table pointervpointer or VPTR, is added as a hidden member of this object. As such, the compiler must also generate "hidden" code in the constructors of each class to initialize a new object's virtual table pointer to the address of its class's virtual method table.

Many compilers place the virtual table pointer as the last member of the object; other compilers place it as the first; portable source code works either way.[2] For example, g++ previously placed the pointer at the end of the object。

至于为什么基类的指针怎么找到子类的这个vprt指针,著名的wiki也么有解释。

4.当提示找不到连接符号的时候用#pragma comment(lib,"xxx.lib") xxx代表是找不到的库名.

5.用正则表达式搜索方法名比直接通过关键字搜索更精确, 比如需要搜索三个参数的方法:
functionName\((.*?),(.*?),(.*?)\) ,可以扩展成更多

6 静态链接库和动态链接库区别

https://stackoverflow.com/questions/20229364/what-is-the-difference-between-a-static-library-and-a-dynamic-one

This concept might be a little bit too broad to explain, but i will try to give you a basic idea from which you can study further.

Firstly, you need to know what a library is. Basically, a library is a collection of functions. You may have noticed that we are using functions which are not defined in our code, or in that particular file. To have access to them, we include a header file, that contains declarations of those functions. After compile, there is a process called linking, that links those function declarations with their definitions, which are in another file. The result of this is the actual executable file.

Now, the linking as I described it is a static linking. This means that every executable file contains in it every library (collection of functions) that it needs. This is a waste of space, as there are many programs that may need the same functions. In this case, in memory there would be more copies of the same function. Dynamic linking prevents this, by linking at the run-time, not at the compile time. This means that all the functions are in a special memory space and every program can access them, without having multiple copies of them. This reduces the amount of memory required.

As I mentioned at the beginning of my answer, this is a very simplified summary to give you a basic understanding. I strongly suggest you study more on this topic.

7.指针指针存在引用计数,当出现两个智能指针循环引用的时候,就会出现内存泄漏问题,这个时候可以通过弱指针引用来完成 ,因为弱指针没有用引用计数来管理内存的释放,当它最后一个引用被消耗的时候 对象也就被释放了。参考https://blog.csdn.net/Xiejingfa/article/details/50772571

8.const 与 define 区别?

const定义变量有作用域和类型检查编译的时候会替换。 define 预处理的时候替换。

9. 深拷贝和浅拷贝区别

在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅拷贝是可行的;但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象,所以,此时,必须采用深拷贝。
10 深拷贝与浅拷贝的区别就在于深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了指针悬挂的问题。简而言之,当数据成员中有指针时,必须要用深拷贝

 11 对象初始化列表优先与构造函数执行

 12 new 和 malloc 区别
 new 会调用 构造函数 malloc 不会
 delete 会到调用析构函数 free不会
 new delete 是运算符号执行更高效 malloc free是函数 

13 . c++ 静态成员函数里面不能使用普通成员变量 因为静态成员函数是共享的分不清楚是属于谁的普通成员变量

14 友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加 以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
      friend 类型 函数名(形式参数);
      友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
      一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
      友元函数的调用与一般函数的调用方式和原理一致。

    若B类是A类的友员类,则B类的所有成员函数都是A类的友员函数
    友员类通常设计为一种对数据操作或类之间传递消息的辅助类


 15 面向对象子类和父类构造函数析构函数执行顺序:

   1、子类对象在创建时会首先调用父类的构造函数
   2、父类构造函数执行结束后,执行子类的构造函数
   3、当父类的构造函数有参数时,需要在子类的初始化列表中显示调用
   4、析构函数调用的先后顺序与构造函数相反


16 构造函数 中调用虚函数不能实现多态

 17   函数模板 :在编译的时候会根据不同的类型生成不能的函数,之前引擎里面使用了很多模板导致编译时间很长

 18 static_const 除了指针类型不能直接转换
      reinterpret_cast可以在不同类型之前进行转换

19  static 用法

   (1)static 申明的变量为静态全局变量,该变量存储在静态数据区,当整个程序结束时该变量才会被释放,只是生命周期延长,作用域不受影响。 
    (2)static申明的变量定义时如果不初始化默认初始化为0 
    (3)被static修饰的变量只能作用于本文件内,即使被extern修饰也不行

20 extern 介绍好文章 https://www.cnblogs.com/yuxingli/p/7821102.html

21 volatile 关键字作用防止编译器优化造成不必要的错误,使得volatile修饰的变量都不是从寄存器而是从内存读取  https://www.csdn.net/gather_21/MtzaIgwsNzItYmxvZwO0O0OO0O0O.html

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