编译和调试C/C++程序编译过程进行宏展开和宏替换处理条件编译指令, 如#ifdef, #endif等去掉注释添加行号和文件名标识保留#编译器指令(#命令将设定编译器的状态或者是指示编译器完成一些特定的动作)编译程序所要作的工作就是通过词法分析, 语法和语义分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。代码优化重点关注函数压栈方式的编译处理是C 的缩写, 表示C语言默认的函数调用方法: 所有参数从右到左依次入栈. 这些参数由调用者清除,称为手动清栈. 被调用函数不需要求调用者传递多少参数, 调用者传递过多或者过少的参数. 甚至完全不同的参数都不会产生编译阶段的错误。 是的缩写, 是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话, 最后一个入栈的是this指针。这些堆栈中的参数由被调用的函数在返回后清除, 使用的指令是 retnX,X表示参数占用的字节数. CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈. 函数在编译的时候就必须确定参数个数. 并且调用者必须严格地控制参数的生成,不能多, 不能少, 否则返回后会出错。汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程对于被翻译系统处理的每一个C语言源程序, 都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。目标文件由段组成. 通常一个目标文件中至少有两个段: 代码段和数据段将所有的目标文件代码拼接且重定位符号地址, 生成可执行文件两种链接方式: 动态链接和静态链接动态链接和静态链接区别在编译时静态库和程序链接一般命名为:.a运行时,可执行目标文件已经装载完毕,速度快但是多个程序需要静态库时每个都会复制一份,造成内存浪费更新后需要重新编译在运行时链接一般命名: .so运行时加载链接, 速度相对慢运行时多个程序共享同一份动态库, 不会造成内存浪费易更新, 无需重新编译内存管理new/和/free区别C++中有几种类型的new

  char *p=new(nothrow) char[10e11]

  #include 
  #include 
  using namespace std;
  class ADT{
      int i;
      int j;
  public:
      ADT(){
          i = 10;
          j = 100;
          cout << "ADT construct i=" << i << "j="<<j <<endl;
      }
      ~ADT(){
          cout << "ADT destruct" << endl;
      }
  };
  int main()
  {
      char *p = new(nothrow) char[sizeof ADT + 1];
      if (p == NULL) {
          cout << "alloc failed" <ADT::~ADT();//显示调用析构函数
      delete[] p;
      return 0;
  }

原理C++内存分区面向对象面向对象编程的三大特征纯虚函数和虚函数构造函数中能调用其他成员函数吗构造函数和析构函数中能用虚函数吗构造函数和析构函数能成为虚函数吗重载, 覆盖和隐藏区别C++编译器对函数名的处理: 作用域+返回类型+函数名+参数列表参数列表必须不同(个数, 类型或参数排列顺序)仅仅返回值不同不足以称为函数重载C语言不支持函数重载, 因为C语言在编译过程会保留原始的函数名两个函数参数相同, 但是基类函数不是虚函数两个函数参数不同, 无论基类函数是不是虚函数, 都会被隐藏C++多态如何实现非空虚基类

  class A
  {
  public:
     int a;
     virtual void v();
  };
  sizeof(A ) = 16  ,align=8

单继承

  class A {
  public:
    int a;
    virtual void v();
  };
  class B : public A {
  public:
    int b;
  };
  sizeof(B) = 16, align = 8

简单多继承1

  class A {
  public:
    int a;
    virtual void v();
  };
  class B {
  public:
    int b;
    virtual void w();
  };
  class C : public A, public B {
  public:
    int c;
  };
  sizeof(C) = 32 ,align = 8

简单多继承2

  class A {
  public:
    int a;
    virtual void v();
  };
  class B {
  public:
    int b;
    virtual void w();
  };
  class C : public A, public B {
  public:
    int c;
    void w();
  };
  sizeof(C) = 32 ,align = 8

多重继承

  class A {
  public:
    int a;
    virtual void v();
  };
  class B : public A {
  public:
    int b;
    virtual void w();
  };
  class C : public A {
  public:
    int c;
    virtual void x();
  };
  class D : public B, public C {
  public:
    int d;
    virtual void y();
  };
  sizeof(D)  = 40 align = 8

虚继承

  class A {
  public:
    int a;
    virtual void v();
  };
  class B : public virtual A {
  public:
    int b;
    virtual void w();
  };
  class C : public virtual A {
  public:
    int c;
    virtual void x();
  };
  class D : public B, public C {
  public:
    int d;
    virtual void y();
  };
  sizeof(D) = 48,align = 8

C++有几种构造函数标准模板库list和区别底层实现:数组两倍容量增长查询时间复杂度为O(1), 插入删除平均时间复杂度为O(n)插入删除时间复杂度O(1), 查询时间复杂度O(n)底层实现: 双向链表迭代器失效的情况扩容原理set和map区别set和区别迭代器和指针区别基础作用指针和引用区别结构体对齐区别一下指针类型

int *p[10]   //指针数组, 强调数组概念, 是一个数组, 每个元素都是指向int*
int (*p)[10] //数组指针, 强调指针概念, 只有一个变量, 指向int数组
int *p(int)  //函数,返回值为int*
int (*p)(int)//函数指针,返回值为int

什么情况必须使用初始化成员列表和区别常量指针和指针常量区别数组名和指针区别野指针和悬空指针C和C++区别”C”用法内联函数和宏定义区别const和指针和const区别#和##在中的作用其他C和C++的类型安全

  #include
  int main(){
      printf("%dn",10);//正常
      printf("%fn",10);//输出错误
      printf("%sn",10);//运行时segmentation
  }

操作符new返回的指针类型严格与对象匹配,而不是void*C中很多以void*为参数的函数可以改写为C++模板函数,而模板是支持类型检查的;引入const关键字代替# ,它是有类型、有作用域的,而# 只是简单的文本替换一些#宏可被改写为函数,结合函数的重载,可在类型安全的前提下支持多种类型,当然改写为模板也能保证类型安全C++提供了关键字,使得转换过程更加安全,因为比涉及更多具体的类型检查。关键字关键字C++异常处理内存泄漏

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666

声明:1、本内容转载于网络,版权归原作者所有!2、本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。3、本内容若侵犯到你的版权利益,请联系我们,会尽快给予删除处理!