C/C++ 笔试、面试题目大汇总


Posted in 面试题 onNovember 21, 2015
1.求下面函数的返回值(微软)
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
假定x = 9999。 答案:8
思路:将x转化为2进制,看含有的1的个数。
2. 什么是“引用”?申明和使用“引用”要注意哪些问题?
答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。
3. 将“引用”作为函数参数有哪些特点?
(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用”*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。
4. 在什么时候需要使用“常引用”? 
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名;
例1
int a ;
const int &ra=a;
ra=1; //错误
a=1; //正确
例2
string foo( );
void bar(string & s);
那么下面的表达式将是非法的:
bar(foo( ));
bar(“hello world”);
原因在于foo( )和”hello world”串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。
引用型参数应该在能被定义为const的情况下,尽量定义为const 。
5. 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?
格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }
好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!
注意事项:
(1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了”无所指”的引用,程序会进入未知状态。
(2)不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。
(3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。
(4)流操作符重载返回值申明为“引用”的作用:
流操作符>,这两个操作符常常希望被连续使用,例如:cout 例3
#i nclude
int &put(int n);
int vals[10];
int error=-1;
void main()
{
put(0)=10; //以put(0)函数值作为左值,等价于vals[0]=10;
put(9)=20; //以put(9)函数值作为左值,等价于vals[9]=20;
cout cout }
int &put(int n)
{
if (n>=0 && n else { cout }

(5)在另外的一些操作符中,却千万不能返回引用:+-*/ 四则运算符。它们不能返回引用,Effective C++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。

6. “引用”与多态的关系?

引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。

例4

Class A; Class B : Class A{...}; B b; A& ref = b;

7. “引用”与指针的区别是什么?

指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。此外,就是上面提到的对函数传ref和pointer的区别。

8. 什么时候需要“引用”?

流操作符>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。
9. 结构与联合有和区别?
1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。
2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。

10. 下面关于“联合”的题目的输出?

a)

#i nclude
union
{
int i;
char x[2];
}a;

void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf(“%d”,a.i);
}
答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)
b)

main()
{
union{ /*定义一个联合*/
int i;
struct{ /*在联合中定义一个结构*/
char first;
char second;
}half;
}number;
number.i=0×4241; /*联合成员赋值*/
printf(“%c%c\n”, number.half.first, mumber.half.second);
number.half.first=’a; /*联合中结构成员赋值*/
number.half.second=’b;
printf(“%x\n”, number.i);
getch();
}
答案: AB (0×41对应’A,是低位;Ox42对应’B,是高位)

6261 (number.i和number.half共用一块地址空间)

11. 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。

答案:
char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest == strSrc)
return strDest ;
char *tempptr = strDest ;
while( (*strDest++ = *strSrc++) != ‘\0’)
;
return tempptr ;
}

12. 已知String类定义如下:

class String
{
public:
String(const char *str = NULL); // 通用构造函数
String(const String &another); // 拷贝构造函数
~ String(); // 析构函数
String & operater =(const String &rhs); // 赋值函数
private:
char *m_data; // 用于保存字符串
};

尝试写出类的成员函数实现。

答案:

String::String(const char *str)
{
if ( str == NULL ) //strlen在参数为NULL时会抛异常才会有这步判断
{
m_data = new char[1] ;
m_data[0] = ‘\0′ ;
}
else
{
m_data = new char[strlen(str) + 1];
strcpy(m_data,str);
}

}

String::String(const String &another)
{
m_data = new char[strlen(another.m_data) + 1];
strcpy(m_data,other.m_data);
}

String& String::operator =(const String &rhs)
{
if ( this == &rhs)
return *this ;
delete []m_data; //删除原来的数据,新开一块内存
m_data = new char[strlen(rhs.m_data) + 1];
strcpy(m_data,rhs.m_data);
return *this ;
}

String::~String()
{
delete []m_data ;
}

13. .h头文件中的ifndef/define/endif 的作用?

答:防止该头文件被重复引用。

14. #i nclude 与 #i nclude “file.h”的区别?

答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。

Tags in this post...

面试题 相关文章推荐
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
Jun 05 面试题
请问如下代码执行后a和b的值分别是什么
May 05 面试题
广州御银科技股份有限公司试卷(C++)
Nov 04 面试题
写出一个方法实现冒泡排序
Jul 08 面试题
采用怎样的方法保证数据的完整性
Dec 02 面试题
你对IPv6了解程度
Feb 09 面试题
开放系统互连参考模型
Jun 29 面试题
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
Nov 10 面试题
Shell如何接收变量输入
Aug 06 面试题
几个Shell Script面试题
Aug 31 面试题
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
Nov 09 面试题
介绍一下Java的事务处理
Dec 07 面试题
统计每一学生的平均成绩
Jun 06 #面试题
文件中有一组整数,要求排序后输出到另一个文件中
Jan 04 #面试题
上海奥佳笔试题面试题
Nov 16 #面试题
将一个文本文件的内容按倒序打印出来
Jan 05 #面试题
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
Aug 04 #面试题
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
Sep 16 #面试题
利用异或运算实现两个无符号数的加法运算
Dec 20 #面试题
You might like
新版PHP将向Java靠拢
2006/10/09 PHP
php你的验证码安全码?
2007/01/02 PHP
初级的用php写的采集程序
2007/03/16 PHP
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
js获取RadioButtonList的Value/Text及选中值等信息实现代码
2013/03/05 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
Python写的服务监控程序实例
2015/01/31 Python
Python脚本实现集群检测和管理功能
2015/03/06 Python
Python中用sleep()方法操作时间的教程
2015/05/22 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
pandas的qcut()方法详解
2019/07/06 Python
python字符串反转的四种方法详解
2019/12/02 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
EJB的激活机制
2013/10/25 面试题
超市实习总结自我鉴定
2013/09/19 职场文书
学校消防安全制度
2014/01/30 职场文书
德语专业求职信
2014/03/12 职场文书
高一新生军训方案
2014/05/12 职场文书
2014年光棍节活动策划方案(创意集锦)
2014/09/29 职场文书
导游词之清晏园
2019/11/22 职场文书
python使用BeautifulSoup 解析HTML
2022/04/24 Python
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android