C++笔试题

简介:

来源:http://www.nowamagic.net/librarys/veda/detail/519

1. 以下三条输出语句分别输出什么?

1 char str1[] = "abc";
2 char str2[] = "abc";
3 const char str3[] = "abc";
4 const char str4[] = "abc";
5 const char* str5 = "abc";
6 const char* str6 = "abc";
7 cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?
8 cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?
9 cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?

答:分别输出false,false,true。str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。

2. 以下代码中的两个sizeof用法有问题吗?

01 void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母
02 {
03 forsize_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
04 if'a'<=str[i] && str[i]<='z' )
05 str[i] -= ('a'-'A' );
06 }
07 char str[] = "aBcDe";
08 cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;
09 UpperCase( str );
10 cout << str << endl;

答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。

3. 非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A?

答:a. class B : public A { ……} // B公有继承自A,可以是间接继承的

b. class B { operator A( ); } // B实现了隐式转化为A的转化

c. class A { A( const B& ); } // A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数

d. A& operator= ( const A& ); // 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个

4. 以下代码有什么问题?

01 struct Test
02 {
03 Test( int ) {}
04 Test() {}
05 void fun() {}
06 };
07 void main( void )
08 {
09 Test a(1);
10 a.fun();
11 Test b();
12 b.fun();
13 }

答:变量b定义出错。按默认构造函数定义对象,不需要加括号。

5. 以下代码有什么问题?

cout << (true?1:"1") << endl;

答:三元表达式“?:”问号后面的两个操作数必须为同一类型

6. 以下代码能够编译通过吗,为什么?

1 unsigned int const size1 = 2;
2 char str1[ size1 ];
3 unsigned int temp = 0;
4 cin >> temp;
5 unsigned int const size2 = temp;
6 char str2[ size2 ];

答:str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量。

7. 以下反向遍历array数组的方法有什么错误?

1 vector array;
2 array.push_back( 1 );
3 array.push_back( 2 );
4 array.push_back( 3 );
5 for( vector::size_type i=array.size()-1; i>=0; --i ) // 反向遍历array数组
6 {
7 cout << array[i] << endl;
8 }

答:首先数组定义有误,应加上类型参数:vector<int> array。其次vector::size_type被定义为unsigned int,即无符号数,这样做为循环变量的i为0时再减1就会变成最大的整数,导致循环失去控制。

8. 以下代码中的输出语句输出0吗,为什么?

01 struct CLS
02 {
03 int m_i;
04 CLS( int i ) : m_i(i) {}
05 CLS()
06 {
07 CLS(0);
08 }
09 };
10 CLS obj;
11 cout << obj.m_i << endl;

答:不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。

9. C++中的空类,默认产生哪些类成员函数?

答:

01 class Empty
02 {
03 public:
04 Empty(); // 缺省构造函数
05 Empty( const Empty& ); // 拷贝构造函数
06 ~Empty(); // 析构函数
07 Empty& operator=( const Empty& ); // 赋值运算符
08 Empty* operator&(); // 取址运算符
09 const Empty* operator&() const// 取址运算符 const
10 };

10. 以下两条输出语句分别输出什么?

1 float a = 1.0f;
2 cout << (int)a << endl;
3 cout << (int&)a << endl;
4 cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么?
5 float b = 0.0f;
6 cout << (int)b << endl;
7 cout << (int&)b << endl;
8 cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么?

答:分别输出false和true。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。 注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。 通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。

11. 以下代码有什么问题?

01 typedef vector IntArray;
02 IntArray array;
03 array.push_back( 1 );
04 array.push_back( 2 );
05 array.push_back( 2 );
06 array.push_back( 3 );
07 // 删除array数组中所有的2
08 for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
09 {
10 if( 2 == *itor ) array.erase( itor );
11 }

答:同样有缺少类型参数的问题。另外,每次调用“array.erase( itor );”,被删除元素之后的内容会自动往前移,导致迭代漏项,应在删除一项后使itor--,使之从已经前移的下一个元素起继续遍历。

12. 写一个函数,完成内存之间的拷贝。[考虑问题是否全面]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void * mymemcpy(  void  *dest,  const  void  *src,  size_t  count )
{
     char * pdest =  static_cast < char *>( dest );
     const  char * psrc =  static_cast < const  char *>( src );
     if ( pdest>psrc && pdest<psrc+count )  //能考虑到这种情况就行了
     {
         for size_t  i=count-1; i!=-1; --i )
             pdest[i] = psrc[i];
     }
     else
     {
         for size_t  i=0; i<count; ++i )
             pdest[i] = psrc[i];
     }
 
     return  dest;
}

 

用法:static_cast < type-id > ( expression )
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。

 

 

本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3305783.html,如需转载请自行联系原作者
目录
相关文章
|
JavaScript 前端开发 安全
15个最佳的代码评审(Code Review)工具
  代码评审可以被看作是计算机源代码的测试,它的目的是查找和修复引入到开发阶段的应用程序的错误,提高软件的整体素质和开发者的技能。代码审查程序以各种形式,如结对编程,代码抽查等。在这个列表中,我们编制了15个最好的代码审查工具,这将有助于开发者节省代码审查时间。
4989 0
|
10月前
|
存储 算法 安全
.NET 平台 SM2 国密算法 License 证书生成深度解析
授权证书文件的后缀通常取决于其编码格式和具体用途。本文档通过一个示例程序展示了如何在 .NET 平台上使用国密 SM2 算法生成和验证许可证(License)文件。该示例不仅详细演示了 SM2 国密算法的实际应用场景,还提供了关于如何高效处理大规模许可证文件生成任务的技术参考。通过对不同并发策略的性能测试,开发者可以更好地理解如何优化许可证生成流程,以满足高并发和大数据量的需求。 希望这段描述更清晰地传达了程序的功能和技术亮点。
1125 14
.NET 平台 SM2 国密算法 License 证书生成深度解析
|
算法 UED
GLTF编辑器的另一个作用
GLTF编辑器的另一个作用就是可以将fbx、dae、gltf等格式的模式转换成glb模型
364 21
|
Python
Python软件包及环境管理器conda实战篇
详细介绍了如何使用conda进行Python软件包管理及环境管理,包括查看、安装、卸载软件包,切换源,管理不同版本的Python环境,以及解决使用过程中可能遇到的错误。
575 2
Python软件包及环境管理器conda实战篇
|
存储 Dart 索引
flutter_鸿蒙next_Dart基础②List
本文介绍了 Dart 编程语言中的列表操作,包括创建、打印、强类型列表、可扩展空列表、填充列表、列表扩展、可选展开操作符、获取列表长度、列表反转、添加和移除元素、插入和清空列表等基本操作。通过代码示例详细解析了每一步的操作方法,帮助读者更好地理解和应用 Dart 列表。
245 2
|
数据处理
MoE再下一城!港大提出AnyGraph:首次开启图大模型Scaling Law之路
近年来,图结构数据因关系数据的广泛应用而备受关注,但现有模型在处理复杂图数据时需大量微调,灵活性受限。香港大学团队提出了AnyGraph,一种基于图混合专家(MoE)架构的统一图模型,有效应对结构与特征异质性、快速适应及规模定律挑战。通过多样化图专家与轻量级路由机制,AnyGraph实现零样本学习和跨领域数据处理。然而,其计算复杂度较高且路由机制仍有待优化。(239字)
202 2
|
关系型数据库 数据处理 数据库
Python中的异步编程:理解asyncio模块及其应用
在现代编程中,异步编程变得越来越重要。Python中的asyncio模块为开发者提供了强大的工具,帮助他们利用异步编程模式来处理高并发和IO密集型任务。本文将深入探讨asyncio模块的核心概念、基本用法以及实际应用场景,帮助读者更好地理解和运用Python中的异步编程技术。
|
关系型数据库 MySQL Linux
Linux 命令 `db_upgrade` 详解与实战
`db_upgrade` 是一个自定义数据库升级命令,用于更新数据库结构和版本。它包括检查当前版本、备份、执行升级、更新版本信息和验证。基本语法是 `db_upgrade [OPTIONS]`,支持 `-b`(备份)、`-f`(强制升级)、`-v`(详细信息)等选项。在实战中,先备份数据库,然后使用 `db_upgrade` 命令升级,并验证结果。注意在生产环境升级前进行测试。虽然不是标准命令,但理解其用法有助于应对数据库升级。
|
监控 关系型数据库 MySQL
实时计算 Flink版产品使用合集之如何开启mysql的binglog
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
域名解析 弹性计算 网络协议
阿里云服务器建站教程来了(十分钟网站上线)
阿里云服务器建站教程来了(十分钟网站上线)阿里云轻量应用服务器怎么使用?阿里云轻量应用服务器使用教程:轻量应用服务器购买、重置密码、远程连接、宝塔面板的Web环境搭建、WordPress网站程序安装到网站上线,阿里云服务器网分享轻量应用服务器从购买、配置建站环境、轻量服务器应用服务器远程连接、开端口到网站上线全流程
482 0
阿里云服务器建站教程来了(十分钟网站上线)