栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > C++面试题库

C++笔试题(十六)

C++笔试题(十六)

一、
已知类string的原型为
class String
{
public:
String(const char *str = NULL); //普通构造函数
String(const String &); //拷贝构造函数
~String(void); //析构函数
String & operator = (const String &); //赋值构造函数
private:
char * m_data; //用于保存字符串
};
请编写String的上述4个函数。
答案:
// String 的析构函数
String::~String(void) // 3 分
{
delete [] m_data;
// 由于m_data 是内部数据类型,也可以写成delete m_data;
}
String::String(const char *str)
{
if(str==NULL)
{
m_data = new char[1]; // 若能加NULL 判断则更好
*m_data = ‘{post.content}’;
}
else
{
int length = strlen(str);
m_data = new char[length+1]; // 若能加NULL 判断则更好
strcpy(m_data, str);
}
}
// 拷贝构造函数
String::String(const String &other)
{
int length = strlen(other.m_data);
m_data = new char[length+1]; // 若能加NULL 判断则更好
strcpy(m_data, other.m_data);
}
// 赋值函数
String & String:operate =(const String &other)
{
// (1) 检查自赋值
if(this == &other)
return *this;
// (2) 释放原有的内存资源
delete [] m_data;
// (3)分配新的内存资源,并复制内容
int length = strlen(other.m_data);
m_data = new char[length+1]; // 若能加NULL 判断则更好
strcpy(m_data, other.m_data);
// (4)返回本对象的引用
return *this;
}
二:改错题,只能在原来的基础上增加代码,不能删除代码
#include
#include
void foo(int age,char *b)
{
b = (char *)malloc(64);
sprintf(b,”Your Age is %d”,age);
}
int main()
{
char *f;
foo(23,f);
printf(“%sn”,f);
}
答案
#include
#include
void foo(int age,char **b)
{
*b = (char *)malloc(64);
sprintf(*b,”Your Age is %d”,age);
}
int main()
{
char **f;
foo(23,f);
printf(“%sn”,**f);
return 0;
}
请问该程序用的是进程方式还是线程方式,并说明进程与线程的区别:
请问该程序输出什么结果?
无参考答案
四、constant pointer points for String
pointer points for constant string
答案:
1、constant pointer points for String,指向字符串的静态指针,即该指针只能指向该字符串,但字符串内容可以改变;
2、pointer points for constant string,指向静态字符串的指针,字符串内容不得改变,但指针可以移动。

五、下面等价的是:
A int i=0
if(i)
{
printf(“hello,world”);
}
B int i=1;
int j=2;
if(i==1 || j==2)
{
printf(“hello,world”);
}
C Boolean b1=true;
Boolean b2=true;
if(b1==b2)
{
printf(“hello,world”);
}
D int i=1;
int j=2;
if(i==1 &| j==2)
{
printf(“hello,world”);
}
个人不太明白&| 的含义,对此题保持沉默,欢迎大家给出答案。
六、排序二叉树插入一个节点或双向链表的实现
四~六为IBM面试题。
七、指针++的含义和用法
答案:
根据指针所指向的类型,移向下一个单元。如:字符串指针++,意为指向下一个元素。
八、stack 和heap的分配,rt-os的特点、同步的方式
九、怎样避免内存泄漏的问题
答案:
动态分配的内存使用完毕之后及时回收。
十、编程实现十进制数转化为十六进制输出,不准用任何已经定义的库函数,比方说String ,Math。int toHex(int )
参考答案:
#include
void main()
{
int n,i=0;
char glam[17]=”0123456789ABCDEF”; //定义字符表
char hex[20]=””; //用于存储转换之后的十六进制数
printf(“please enter n(dec):n”);
scanf(“%d”,&n);
do{
hex[i++]=glam[n%16];
n=n/16;
}while(n>0);
printf(hex);
}
十一、编程实现大于100的两个数值相乘的结果输出,同样不准使用任何已定义函数,Math,string,convert等。比方说12345*32534677 ,输入为两个string int toPlus(12345′,’32434677′) 输出为一个长型的
大数相乘原理。模仿人手工列竖式。result[i+j]+=a[ i]*b[j]%10;result[i+j+1]+=result[i+j]/10;
十二、int delete(node * head)
{
free(head);
head=head->link;
return(0);
}
指出程序的错误,并且写出正确的程序
参考答案:
错误:首先释放了head,再使用时已经不起作用。应使用临时指针变量。
int delete(node * head)
{
node *temp=head->link;
free(head);
head=temp;
return(0);
}

十三、写一个程序可以算出字节在计算机中的存储是由大到小还是有小到大。
十四、一段程序,写出输出结果
#include
class A
{
public:
void virtual print(){cout<<"A::print()"<print();
ab->print();
ac->print();
print(a);
print(b);
print(c);
}

答案:
A::print()”
B::print()”
C::print()”
A::print()”
B::print()”
B::print()”
A::print()”
A::print()”
A::print()”

十五、给两个变量,如何找出一个带环单链表中是什么地方出现环的。(答案参考expert C programming)。

先判断有环,步长为1的指针和步长为2的指针重合的地方就是环内的一个节点。
以此节点为起点的指针和指向头节点的指针均以步长1一起走,重合的地方就是环出现的节点。
十~十五为MS笔试题。
十六、写一个带参数宏get_struct_addr_from_member_addr(p, stru, m),
能够根据任意结构实体的某一个成员的地址,算出该结构实体的地址,其中参数p是指向该
成员的指针,stru是该结构体,m是该成员。(SUN试题)

return (struct stru*)(p – ( (int)&((struct stru *)0)->p));
十七、给一个函数
int main(){
int i, n=20;
for(i=0;i
int i = 0;
int func();
void main(){
int rst = 0;
rst = func() + i ;
rst += func() + i ;
printf(“%d”, rst);
}
int func() {
static i ;
i++;
return i;
}
参考:其实并不是全局变量被static重载,在函数内如果定义了i,那么,全局变量i
就不起作用了,什么意思,就是说如果i在函数内部定义了,那么函数内部使用的i
是函数自己定义的,而不是全局变量的i。
这里static是一个迷惑,其实不用static,含意也是一样的,只是每次函数里的i的值不能保存了。
全局变量不初始化,那么int的值为0,局部变量不初始化,那么其值不知。
四十、关于typedef和*相组合定义东西
四十一、关于union的使用,比如:
#include
#include
void main() {
union xxx {
struct xx {
long int x;
int y;
} p;
int z;
} a;
a.p.x = 5;
a.p.y = 6;
a.z = 7;
printf(“%d”, a.p.x + a.p.y);
}
打印出来的结果是什么?
参考:结果为13,解释为:
由于union是联合,那么只能存在一个值,所以z的值始终和p.x的值相等
union的存储空间有最大那个单元决定,所以当对p.z赋值时,p.y的值并没有丢失。
四十二、long int i = -2;
那么(int)i的值是多少?
参考:仍然时-2,因为i用补码表示为 fffe 去掉高位,符号位不变,那么应该是fe所以
依然是-2。
三十~四十二为华为/华3的笔试题。―_________―!
四十三、类定义的构造函数提供缺省值与不提供缺省值,有何区别?
四十四、C++主要特性包含哪些?什么是虚函数,主要用处是什么?
四十五、5分钟之内写一个排序算法。
四十六、new/delete对象时,使用堆还是堆栈?
四十三~四十六为朗讯笔试题。
四十七、程序执行的时候怎么分配内存空间,每个部分的作用?
四十八、实时操作系统,在RS-232上面,如何设计才可以保证两个任务送出的命令字符串严格同步?
四十九、实时操作系统中运行多个任务,写出任务可能存在的状态,状态之间的转化,以及转化条件?
四十七~四十九为威盛考题

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/265700.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号