《c/ C++常见问题剖析》
strcpy 的函数编写,主要考查对基本功的掌握:
(1)字符串以’\0’结尾; (2)对数组越界把握的敏感度; (3)库函数 strcpy 的工作方式
对内存操作的考查主要集中在:
(1)指针的理解; (2)变量的生存期及作用范围; (3)良好的动态内存申请和释放习惯。
数组名的本质如下: (1)数组名指代一种数据结构,这种数据结构就是数组; 例如:
char str[10]; cout << sizeof(str) << endl;
输出结果为 10,str 指代数据结构 char[10]。 (2)数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不 能被修改; char str[10]; str++; //编译出错,提示 str 不是左值 (3)数组名作为函数形参时,沦为普通指针。 windows nt 32 位平台下,指针的长度(占用内存的大小)为 4 字节,故 sizeof( str ) 、sizeof ( p ) 都为 4。
程序员对宏定义的使用要非常小心,特别要注意两个问题: (1)谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。(2)防止宏的副作用。宏定义#define min(a,b) ((a) <= (b) ? (a) : (b))对 min(*p++, b)的作用结果是:
((*p++) <= (b) ? (*p++) : (*p++)) 这个表达式会产生副作用,指针 p 会作三次++自增操作。
为什么标准头文件都有类似以下的结构?
#ifndef __incvxworksh #define __incvxworksh #ifdef __cplusplus
extern "c" { #endif /*……*/ #ifdef __cplusplus }
#endif #endif /* __incvxworksh */ 解答: 头文件中的编译宏
#ifndef __incvxworksh #define __incvxworksh #endif 的作用是防止被重复引用。 作为一种面向对象的语言,c++支持函数重载,而过程式语言 c 则不支持。函数被 c++编译后在 symbol 库中的名字与 c 语言的不同。例如,假设某个函数的原型为:
void foo(int x, int y); 该函数被 c 编译器编译后在 symbol 库中的名字为_foo,而 c++编译器则会产生像_foo_int_int 之类的名 字。_foo_int_int 这样的名字包含了函数名和函数参数数量及类型信息,c++就是考这种机制来实现函数重 载的。 为了实现 c 和 c++的混合编程,c++提供了 c 连接交换指定符号 extern "c"来解决名字匹配问题,函数声 明前加上 extern "c"后, 则编译器就会按照 c 语言的方式将该函数编译为_foo, 这样 c 语言中就可以调用 c++ 的函数了。
编写一个函数,作用是把一个 char 组成的字符串循环右移 n 个。比如原来是“abcdefghi”如 果 n=2,移位后应该是“hiabcdefgh” 函数头是这样的: //pstr 是指向以'\0'结尾的字符串的指针 //steps 是要求移动的 n
void loopmove ( char * pstr, int steps ) { //请填充…… } 解答: 正确解答 1:
void loopmove ( char *pstr, int steps ) { int n = strlen( pstr ) - steps; char tmp[max_len]; strcpy ( tmp, pstr + n ); strcpy ( tmp + steps, pstr); *( tmp + strlen ( pstr ) ) = '\0'; strcpy( pstr, tmp ); } 正确解答 2:
void loopmove ( char *pstr, int steps ) { int n = strlen( pstr ) - steps; char tmp[max_len]; memcpy( tmp, pstr + n, steps ); memcpy(pstr + steps, pstr, n ); memcpy(pstr, tmp, steps ); } 剖析: 这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程 序编写的工作量。
最频繁被使用的库函数包括: (1) strcpy (2) memcpy (3) memset 试题
编写类 string 的构造函数、析构函数和赋值函数,已知类 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; }
//拷贝构造函数 // 得分点:输入参数为 const 型
string::string(const string &other) {
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data, other.m_data); }
//加分点:对 m_data 加 null 判断
//赋值函数
string & string::operate =(const string &other) // 得分点:输入参数为 const 型
{
if(this == &other)
return *this;
delete [] m_data; //得分点:释放原有的内存资源 //加分点:对 m_data 加 null 判断 //得分点:检查自赋值
int length = strlen( other.m_data );
m_data = new char[length+1];
strcpy( m_data, other.m_data );
return *this; //得分点:返回本对象的引用
}
剖析: 能够准确无误地编写出 string 类的构造函数、拷贝构造函数、赋值函数和析构函数的面试者至少已经 具备了 c++基本功的 60%以上! 在这个类中包括了指针类成员变量 m_data,当类中包括指针类成员变量时,一定要重载其拷贝构造函 数、赋值函数和析构函数(内存分配释放等问题),这既是对 c++程序员的基本要求,也是《effective c++》中特别强调的条款。 仔细学习这个类,特别注意加注释的得分点和加分点的意义,这样就具备了 60%以上的 c++基本功!
请说出 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); operator*的返回结果必须是一个 const 对象。如果不是,这样的变态代码也不会编译出错:
classa a, b, c; (a * b) = c; // 对 a*b 的结果赋值
操作(a * b) = c 显然不符合编程者的初衷,也没有任何意义。 剖析: 惊讶吗?小小的 static 和 const 居然有这么多功能,我们能回答几个?如果只能回答 1~2 个,那还真得 闭关再好好修炼修炼。 这个题可以考查面试者对程序设计知识的掌握程度是初级、中级还是比较深入,没有一定的知识广度 和深度,不可能对这个问题给出全面的解答。大多数人只能回答出 static 和 const 关键字的部分功能。
const 常量赋值时,必须同时初始化
分享到:
相关推荐
【TPLINK测试工程师笔试面试总结】 在准备TPLINK测试工程师的笔试和面试过程中,考生需要对公司的主要产品及其功能有深入的理解。TPLINK主要产品包括路由器、交换机、监控系统和hi-fi设备。路由器主要负责数据包的...
### 寻职札记——互联网技术类笔试面试总结 #### 操作系统及Linux ##### 进程与线程 **1. 同步机制** 进程间的同步机制是为了解决多个进程之间相互依赖、协作的问题。典型的同步机制包括信号量(Semaphore)、...
本文将深入探讨“2010最新笔试面试总结”中的关键知识点,帮助求职者提升在这三大领域的技能。 首先,对于C语言部分,笔试通常会考察基本语法、数据类型、运算符、控制结构(如if-else、switch-case、循环)、函数...
【标题】: "web前端笔试面试总结+js+css" 【描述】: "这是一份针对web前端面试的总结,涵盖了js和css的相关知识,特别适合面试准备阶段的小白使用,内容全面" 【标签】: "css 前端 求职面试 范文/模板/素材 ...
Java作为一门广泛使用的编程语言,其面试宝典和经典笔试面试总结是求职者和开发者提升技能、准备面试的重要参考资料。这份资料集包含了丰富的Java基础知识、进阶概念以及常见面试问题,旨在帮助求职者全面了解Java...
下面将根据标题、描述和标签,详细阐述嵌入式软件笔试面试中的关键知识点。 一、数据结构 数据结构是编程的基础,对于嵌入式系统来说,高效的数据组织方式直接影响程序性能。常见的数据结构包括数组、链表、栈、...
在Java的笔试和面试过程中,掌握关键知识点是至关重要的。以下是一些常见的Java面试和笔试题目,以及相关的知识点解析: 1. **基本概念** - **Java语言特性**:了解Java的面向对象特性,如封装、继承、多态,以及...
Java笔试和面试中,涉及到的知识点广泛而深入,主要涵盖了Java技术栈的多个方面,包括设计模式、企业级开发框架和Web服务等。以下是对这些知识点的详细解释: 1. **MVC模式**:MVC全称为Model-View-Controller,是...
3.4 百度终端类校招笔试面试总结 总结了应聘者在笔试和面试中遇到的各种类型的题目,以及对应的解题思路和面试官可能的关注点。 3.5 百度产品运营面试经验分享 介绍了产品运营岗位的面试重点,包括产品知识、市场...
【标题】:“笔试大全面试宝典 自己总结” 这篇资料是作者个人对求职笔试过程中的各类题目和技巧进行的全面总结,旨在帮助求职者更好地准备面试和笔试环节。资料涵盖了多家公司的笔试题,以及JavaScript编程语言的...
互联网校招题库资料笔试面试真题具体面试问题回答技巧腾讯阿里培训资料: C++面试题笔试题 C语言 IQ智力面试题笔试题 JAVA笔试面试资料 NET面试题笔试题 web开发 数据库面试题笔试题 算法 数据结构 计算机基础 计算机...
这份"Java面试+笔试宝典(面试总结)"无疑是准备此类考试的宝贵资源。下面,我们将深入探讨其中可能涵盖的一些关键知识点。 1. **基础语法**:面试往往从Java的基础开始,包括变量、数据类型、运算符、流程控制语句...
各大银行信息科技岗面试笔试题库。建行、工商、农行、平安等银行信息科技岗位的笔试面试题目总结。
Java面试笔试总结主要涵盖了许多Java开发中的核心概念和技术,这些知识点是面试官在评估候选人技能时经常关注的焦点。以下是一些重要的Java知识点,对于准备Java Web开发职位的面试者尤其重要。 1. **Java基础** -...
java最新的笔试和面试题,含总结,推荐面试前先看一下,不要资源分,分享给大家。
《腾讯公司笔试面试题总结》 在竞争激烈的IT行业中,准备一份详尽的腾讯公司笔试面试题库无疑是提升求职竞争力的重要途径。这份资料涵盖了腾讯历年来的笔试和面试题目,旨在帮助求职者更好地理解和掌握腾讯所关注的...
web前端笔试题面试题汇总+前端优化总结 web前端笔试题面试题汇总+前端优化总结 web前端笔试题面试题汇总+前端优化总结 web前端笔试题面试题汇总+前端优化总结 web前端笔试题面试题汇总+前端优化总结 web前端笔试题...
"C语言笔试面试题大全...本文总结了C语言笔试面试题大全,涵盖了多态、虚函数表、函数注册、字符串处理、算法设计、Fabonacci数列、质数、硬币问题等多个方面的知识点。这些知识点对于C语言开发者来说都是非常重要的。
从9月份开始找工作,到10月份找到工作,期间经历的无数公司,笔试、面试无数次,想总结一些题,给想找工作的人一点经验
这篇文档的标题是“软件开发笔试面试题总结精华版”,说明了这是一份汇集了软件开发领域面试和笔试常见问题的资源合集。这个合集来源于CSDN、PUDN等多个在线技术论坛,旨在帮助那些寻找IT开发职位的人准备面试。描述...