C++笔试面试要点


0.1 C++笔试面试要点 0.1.1 面向过程设计部分(与C类同) 1. 数据类型、数据结构 2. 排序。排序有几种,各种排序的比较,哪些排序是稳定的,快排的算 法,算法复杂度 3. 查找,哈希、二叉树、折半等对比。哈希映射和哈希表的区别 4. 链表和数组的区别 5. 栈和队列的区别 6. 字符串有关的函数。比如写一个拷贝字符串的函数,或者字符串反转 7. static、const 8. 引用与指针 9. 结构体与共同体 0.1.2 面向对象设计部分(重点) 1. 面向对象的特点 2. 举例说明多态。overload 和 override 的区别 3. 静态成员使用,常对象、常成员函数等 4. this 指针 5. 友元函数与友元类 6. 构造与析构函数次序 7. 拷贝构造函数 8. 写程序实现运算符重载 9. 继承、多继承、虚继承。同名覆盖、二义性 10. 虚函数和虚基类 0.1.3 泛型设计部分 1. 模板概念,如何使用模板 2. 简单模板使用 3. STL 概念,容器、算法、迭代器概念 4. 使用 STL 0.2 面试必会题及答案 0.2.1 引用与指针有什么区别? 解答: 1 引用必须被初始化,指针不必。 2 引用初始化以后不能被改变,指针可以改变所指的对象。 3 不存在指向空值的引用,但是存在指向空值的指针。 0.2.2 结合 1 个你认为比较能体现OOP思想的项目,用 UML来描述。 对于自己做的项目要学会表述,该项目中若涉及继承、多态或模板更好。 0.2.3 请说出static和const关键字尽可能多的作用 解答: static 关键字至少有下列 n 个作用: 1 函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分 配一次,因此其值在下次调用时仍维持上次的值; 2 在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访 问; 3 在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限 制在声明它的模块内; 4 在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; 5 在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访 问类的 static 成员变量。 const 关键字至少有下列 n 个作用: 1 欲阻止一个变量被改变,可以使用 const 关键字。在定义该 const 变量时,通常需要对 它进行初始化,因为以后就没有机会再去改变它了; 2 对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二 者同时指定为 const; 3 在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能 改变其值; 4 对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类的 成员变量; 5 对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左 值”。如: const classA operator*(const classA& a1,const classA& a2); 0.2.4 C++特点是什么,如何实现多态?画出基类和子类 在内存中的相互关系。 (自备答案) 0.2.5 打印以下信息 * *.*. *..*..*.. *...*...*...*... *....*....*....*....*.... *.....*.....*.....*.....*.....*..... *......*......*......*......*......*......*...... *.......*.......*.......*.......*.......*.......*.......*....... 解答: #include #define N 8 int main() { int i,j,k; for(i=0;i2->3->4->5 ,通过反转后成为 5->4->3->2->1。 方法 1:最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指 针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面 继续遍历。源代码如下: struct linka { int data; linka* next; }; void reverse(linka*& head) { if(head ==NULL) return; linka *pre, *cur, *ne; pre=head; cur=head->next; while(cur) { ne = cur->next; cur->next = pre; pre = cur; cur = ne; } head->next = NULL; head = pre; } 方法 2:还有一种利用递归的方法。这种方法的基本思想是在反转当前节点之前先调用 递归函数反转后续节点。不过这个方法有一个缺点,就是在反转后的最后一个结点会形 成一个环,所以必须将函数的返回的节点的 next 域置为 NULL。因为要改变 head 指针, 所以用了引用。算法的源代码如下: linka* reverse(linka* p,linka*& head) { if(p == NULL || p->next == NULL) { head=p; return p; } else { linka* tmp = reverse(p->next,head); tmp->next = p; return p; } } 0.2.8 编写类St ring的构造函数、析构函数和赋值函数, 已知类String的原型为: class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String & operate =(const String &other); // 赋值函数 private: char *m_data; // 用于保存字符串 }; 解答: //普通构造函数 String::String(const char *str) { if(str==NULL) { m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的空 //加分点:对 m_data 加 NULL 判断 *m_data = '\0'; } else { int length = strlen(str); m_data = new char[length+1]; // 若能加 NULL 判断则更好 strcpy(m_data, str); } } // String 的析构函数 String::~String(void) { delete [] m_data; // 或 delete m_data; } //拷贝构造函数 String::String(const String &other) // 得分点:输入参数为 const 型 { int length = strlen(other.m_data); m_data = new char[length+1]; //加分点:对 m_data 加 NULL 判断 strcpy(m_data, other.m_data); } //赋值函数 String & String::operate =(const String &other) // 得分点:输入参数为 const 型 { if(this == &other) //得分点:检查自赋值 return *this; delete [] m_data; //得分点:释放原有的内存资源 int length = strlen( other.m_data ); m_data = new char[length+1]; //加分点:对 m_data 加 NULL 判断 strcpy( m_data, other.m_data ); return *this; //得分点:返回本对象的引用 }
还剩8页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

zszh007

贡献于2012-08-20

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf