转:http://blog.csdn.net/lanxuezaipiao/article/details/41557307

    • char c = '\72'; 中的\72代表一个字符,72是八进制数,代表ASCII码字符“:”。

    • 10*a++ 中a先进行乘法运算再自增(笔试中经常喜欢出这类运算符优先级容易混淆的输出问题)。

    • const和static的作用 
      太常见的问题了,下面给出一个较详细的参考答案:

      static关键字:

      1)函数体内static变量的作用范围为函数体。不同于auto变量。该变量的内存只被分配一次。因此其值在下次调用时仍维持上次的值。

      2)在模块内的static全局变量可以被模块内的所有函数访问。但不能被模块外的其他函数访问。

      3)在模块内的static函数只可被这一模块内的其它函数调用。这个函数的使用范围被限制在声明它的模块内。

      4)在类中的static成员变量属于整个类所有,对类的所有对象只有一份复制。

      5)在类中的static成员函数属于整个类所有,这个函数不接受this指针,因而只能访问类的static成员变量。

      const关键字:

      1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化。因为以后就没有机会再改变它了。

      2)对指针来说,可以指定指针的本身为const,也可以指定指针所指向的数为const。或二者同时为const。

      3)在一个函数的声明中,const可以修饰形参,表明它是一个输入参数。在函数内不能改变其值。

      4)对于类的成员函数,若指定其为const类型。则表明其是一个常量函数。不能修改类的成员变量。

      5)对于类的成员函数,有时候必须指定其返回值为const类型。以使得其返回值不为“左值”。

    • 注意sizeof不是函数而是运算符,所以在计算变量所占用空间大小时,括号是可以省略的,但在计算类型大小时括号则不能省略,比如int i = 0; 则sizeof int是错误的。

    • 有1,2,…,n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数。

       #include <stdio.h>
      int main() {     int a[] = {10, 6, 9, 5, 2, 8, 4, 7, 1, 3};     int i, tmp;     int len = sizeof(a) / sizeof(a[0]);     for(i = 0; i < len;) {         tmp = a[a[i] - 1];         a[a[i] - 1] = a[i];         a[i] = tmp;         if(a[i] == i + 1) i++;     }     for(i = 0; i < len; ++i)         printf("%d ", a[i]);     printf("\n");     return 0; }
    • 易误解:如果int a[5], 那么a与&a是等价的,因为两者地址相同。 
      解答:一定要注意a与&a是不一样的,虽然两者地址相同,但意义不一样,&a是整个数组对象的首地址,而a是数组首地址,也就是a[0]的地址,a的类型是int[5],a[0]的类型是int,因此&a+1相当于a的地址值加上sizeof(int) * 5,也就是a[5],下一个对象的地址,已经越界了,而a+1相当于a的地址加上sizeof(int),即a[1]的地址。

    • 如何将一个小数分解成整数部分和小数部分? 
      要记得利用头文件中的库函数modf,下面是函数原型(记住一些实用的库函数,避免自己重写):

      double modf(double num, double *i); // 将num分解为整数部分*i和小数部分(返回值决定)
    • 可作为函数重载判断依据的有:参数个数、参数类型、const修饰符; 
      不可以作为重载判断依据的有:返回类型。

    • 程序输出题:

       int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  int *p = &(a + 1)[3];  printf("%d\n", *p);

      输出:5 
      说明:因为a+1指向a的第二个元素,[3]表示再向后移动3个元素。

    • 程序输出题:

       char str1[] = "abc";  char str2[] = "abc";  const char str3[] = "abc";  const char str4[] = "abc";  const char *str5 = "abc";  const char *str6 = "abc";  char *str7 = "abc";  char *str8 = "abc";  cout << (str1 == str2) << endl;  cout << (str3 == str4) << endl;  cout << (str5 == str6) << endl;  cout << (str7 == str8) << endl;

      输出:0 0 1 1 
      说明:输出str1~str8的地址为:

      0x23aa80 
      0x23aa70 
      0x23aa60 
      0x23aa50 
      0x23aa48 
      0x23aa40 
      0x23aa38 
      0x23aa30

      输出str1~str8内容“abc”的存储地址为:

      0x23aa80 
      0x23aa70 
      0x23aa60 
      0x23aa50 
      0x100403030 
      0x100403030 
      0x100403030 
      0x100403030

      可以发现str1~str4中的内容是存在栈上,地址各不相同,而str5~str8的内容都是存储在常量区,所以地址都相同。

      注意:

      char *str = "abc"; printf("%p\n", str1);   cout << &str1 << endl;

      上面打印的是字符串 “abc”的地址,下面打印的是 str1 变量的地址。

    • C的结构体和C++结构体的区别

      (1)C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。 
      (2)C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。 
      (3)C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。

      以上都是表面的区别,实际区别就是面向过程和面向对象编程思路的区别:

      C的结构体只是把数据变量给包裹起来了,并不涉及算法。 
      而C++是把数据变量及对这些数据变量的相关算法给封装起来,并且给对这些数据和类不同的访问权限。 
      C语言中是没有类的概念的,但是C语言可以通过结构体内创建函数指针实现面向对象思想。

    • 如何在类中定义常量成员并为其初始化? 
      解答:只能在初始化列表里对const成员初始化,像下面这样:

      class CBook { public:     const double m_price;     CBook() :m_price(8.8) { } };

      下面的做法是错误的:

      class CBook { public:     const double m_price;     CBook() {         m_price = 8.8;     } };

      而下面的做法虽未报错,但有个warning,也不推荐:

      class CBook { public:     const double m_price = 8.8; // 注意这里若没有const则编译出错     CBook() { } };
    • 在定义类的成员函数时使用mutable关键字的作用是什么? 
      解答:当需要在const方法中修改对象的数据成员时,可以在数据成员前使用mutable关键字,防止出现编译出错。例子如下:

      class CBook { public:     mutable double m_price;  // 如果不加就会出错     CBook(double price) :m_price(price) { }     double getPrice() const; // 定义const方法 }; double CBook::getPrice() const {     m_price = 9.8;     return m_price; }
    • 构造函数、拷贝构造函数、析构函数的调用点和顺序问题,如下面这个例子输出是什么?

      class CBook { public:     CBook() {         cout << "constructor is called.\n";     }     ~CBook() {         cout << "destructor is called.\n";     } };
      void invoke(CBook book) { // 对象作为函数参数,如果这里加了个&就不是了,因为加了&后是引用方式传递,形参和实参指向同一块地                                       // 址,就不需要创建临时对象,也就不需要调用拷贝构造函数了     cout << "invoke is called.\n"; }
      int main() {     CBook c;     invoke(c); }

      解答:注意拷贝构造函数在对象作为函数参数传递时被调用,注意是对象实例而不是对象引用。因此该题输出如下:

      constructor is called. invoke is called. destructor is called.  // 在invoke函数调用结束时还要释放拷贝构造函数创建的临时对象,因此这里还调用了个析构函数 destructor is called.  

      引申:拷贝构造函数在哪些情况下被调用? 
      (1)函数的参数为类对象且参数采用值传递方式; 
      (2)将类对象做为函数的返回值。

    • C++中的explicit关键字有何作用? 
      解答:禁止将构造函数作为转换函数,即禁止构造函数自动进行隐式类型转换。 
      例如CBook中只有一个参数m_price,在构建对象时可以使用CBook c = 9.8这样的隐式转换,使用explicit防止这种转换发生。

    • 在C++中,如果确定了某一个构造函数的创建过程,在该构造函数中如果调用了其它重载的构造函数,它将不会执行其它构造函数的初始化列表部分代码,而是执行函数体代码,此时已经退化成普通函数了。例子说明如下:

      class CBook { public:     double m_price;     CBook() {         CBook(8.8);     }     CBook(double price) : m_price(price) { } }; int main() {     CBook c;     cout << c.m_price << endl;  // 此时并不会输出理想中的8.8 }
    • 静态数据成员只能在全局区域进行初始化,而不能在类体中进行(构造函数中初始化也不行),且静态数据成员不涉及对象,因此不受类访问限定符的限制。 
      例子说明如下:

      class CBook { public:     static double m_price; }; double CBook::m_price = 8.8;  // 只能在这初始化,不能在CBook的构造函数或直接初始化
    • C++中可以重载的运算符:new/delete、new[]/delete[]、++等。 
      不可以重载的运算符:、.、::、?:、sizeof、typeid、.、**、不能改变运算符的优先级。

      引申:重载++和–时是怎么区分前缀++和后缀++的? 
      例如当编译器看到++a(先自增)时,它就调用operator++(a); 
      但当编译器看到a++时,它就调用operator++(a, int)。即编译器通过调用不同的函数区别这两种形式。

    • C++的多态性分为静态多态和动态多态。 
      静态多态性:编译期间确定具体执行哪一项操作,主要是通过函数重载和运算符重载来实现的; 
      动态多态性:运行时确定具体执行哪一项操作,主要是通过虚函数来实现的。

    • 虚函数原理考点,例如下面程序的输出是什么?

      class A { public:     virtual void funa();     virtual void funb();     void func();     static void fund();     static int si; private:     int i;     char c; };

      问:sizeof(A) = ?

      解答: 
      关于类占用的内存空间,有以下几点需要注意: 
      (1)如果类中含有虚函数,则编译器需要为类构建虚函数表,类中需要存储一个指针指向这个虚函数表的首地址,注意不管有几个虚函数,都只建立一张表,所有的虚函数地址都存在这张表里,类中只需要一个指针指向虚函数表首地址即可。 
      (2)类中的静态成员是被类所有实例所共享的,它不计入sizeof计算的空间 
      (3)类中的普通函数或静态普通函数都存储在栈中,不计入sizeof计算的空间 
      (4)类成员采用字节对齐的方式分配空间

      答案:12(32位系统)或16(64位系统)

    • 虚继承的作用是什么? 
      在多继承中,子类可能同时拥有多个父类,如果这些父类还有相同的父类(祖先类),那么在子类中就会有多份祖先类。例如,类B和类C都继承与类A,如果类D派生于B和C,那么类D中就会有两份A。为了防止在多继承中子类存在重复的父类情况,可以在父类继承时使用虚函数,即在类B和类C继承类A时使用virtual关键字,例如: 
      class B : virtual public A 
      class C : virtual public A 
      注:因为多继承会带来很多复杂问题,因此要慎用。

C/C++求职宝典21个重点笔记的更多相关文章

  1. C/C++求职宝典21个重点笔记(常考笔试面试点)

    这是我之前准备找工作时看<C/C++求职宝典>一书做的笔记,都是一些笔试面试中常考的重点难点问题,但比较基础,适合初学者看. 1. char c = '\72'; 中的\72代表一个字符, ...

  2. C/C++求职宝典重点笔记

    这是我之前准备找工作时看<C/C++求职宝典>一书做的笔记,都是一些笔试面试中常考的重点难点问题,但比较基础,适合初学者看. 1. char c = '\72'; 中的\72代表一个字符, ...

  3. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  4. C++编程思想重点笔记(下)

    上篇请看:C++编程思想重点笔记(上) 宏的好处与坏处 宏的好处:#与##的使用 三个有用的特征:字符串定义.字符串串联和标志粘贴. 字符串定义的完成是用#指示,它容许设一个标识符并把它转化为字符串, ...

  5. JavaScript 重点笔记

    JavaScript 重点笔记 ## 数组 // 必须掌握 - arr.length:获取数组元素的长度 - arr.splice(起始位置,长度):从数组中添加或删除元素. - arr.indexO ...

  6. Elasticsearch入门学习重点笔记

    原文:Elasticsearch入门学习重点笔记 必记知识点 Elasticsearch可以接近实时的搜索和存储大量数据.Elasticsearch是一个近实时的搜索平台.这意味着当你导入一个文档并把 ...

  7. 清北学堂—2020.3NOIP数学精讲营—Day 1 morning 重点笔记

    qbxt Day 1 morning 重点笔记 --2020.3.8 济南 主讲:钟皓曦 1 正数%负数==正数 负数%正数==负数 负数%负数==负数 a%b的答案的符号取决于a的符号. 2 快速幂 ...

  8. 《C#求职宝典》读书笔记

    王小科 电子工业出版 第一篇 面试求职第一步 一个例子:一支行军中的队伍长100米,一个传令兵从队尾跑至队头,再立即返回队尾,队伍正好前进了100米.假设队伍 和传令兵行进的速度恒定,问传令兵跑了多少 ...

  9. C++ Primer Plus第6版18个重点笔记

    下面是我看<C++ Primer Plus>第6版这本书后所做的笔记,作为备忘录便于以后复习. 笔记部分 C++的const比C语言#define更好的原因? 首先,它能够明确指定类型,有 ...

随机推荐

  1. 利用DIV+CSS制作网页过程中常用的基本概念及标签使

    CSS主要用于对HTML文件功能的补充及扩展,其作用就是对HTML文件中各种排版进行设置,达到对网页中字体.颜色.背景.图片等的控制,使网页能够完全依照设计者的想法来显示. CSS可以控制网页的显示, ...

  2. mutex 简单介绍

    “mutex”是术语“互相排斥(mutually exclusive)”的简写形式,也就是互斥量. 当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源.M ...

  3. 一个特别不错的jQuery快捷键插件:js-hotkeys

    这其实不是什么新技术,这个插件在很早前就已经发布了,之前有项目用到,所以分享出来添加方式的例子 jQuery.hotkeys.add('esc',function (){ //执行函数 }); jQu ...

  4. php字符串截取问题

    希望将一个字符串限长显示,如果该字符串超过一定长数,就截取前n个字符,后加省略号. 但是在英文和汉字混合的情况下会出现如下问题: 如果有这样一个字符串  $str="这是一个字符串" ...

  5. php 判断table 是否存在 根据返回值继续下一步的操作

    根据sql命令创建数据库或者数据表时候,判断库或者表是否存在比较重要. //要创建的表是否已经存在 function isHaveTable( $dbName,$tableN, $con)  //数据 ...

  6. delphi启动 EditLineEnds.ttr 被占用问题

    碰到这个问题我也是无语了,每次关掉Delphi后就不能打开了,折腾了半天,网上的方法也没有搞定.最后,找到这个链接(网页如下所示),下载里面的东西就搞定了.打不开的可以向我要.895569369@qq ...

  7. [转]pro*c/c++编译错误 ” error: sqlca.h: No such file or directory “ 的解决办法

    $ gcc -o test test.c 出现错误:error: sqlca.h: No such file or directory [解决方法]知道 sqlca.h 在 $ORACLE_HOME/ ...

  8. 苹果内付费 IAP

    创建app内购买项目 消耗型项目:对于消耗型App内购买项目,用户每次下载时都必须进行购买.一次性服务通常属于消耗型项目,例如钓鱼App 中的鱼饵. 非消耗型项目:对于非消耗型App内购买项目,用户仅 ...

  9. RMAN - "丢失控制文件的恢复"

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...

  10. 管理员必备的20个Linux系统监控工具

    需要监控Linux服务器系统性能吗?尝试下面这些系统内置或附件的工具吧.大多数Linux发行版本都装备了大量的监控工具.这些工具提供了能用作取得相关信息和系统活动的量度指标.你能使用这些工具发现造成性 ...