笔试4

 

1.static有什么用途?(请至少说明两种)
    1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
    2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
    3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用

2.引用与指针有什么区别?
    1) 引用必须被初始化,指针不必。
    2) 引用初始化以后不能被改变,指针可以改变所指的对象。
    3) 不存在指向空值的引用,但是存在指向空值的指针。

3.描述实时系统的基本特性
       在特定时间内完成特定的任务,实时性与可靠性。

4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
      全局变量储存在静态数据库,局部变量在堆栈。

5.什么是平衡二叉树?
      左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1

6.堆栈溢出一般是由什么原因导致的?
      没有回收垃圾资源。

7.什么函数不能声明为虚函数?
      constructor函数不能声明为虚函数。

8.冒泡排序算法的时间复杂度是什么?
      时间复杂度是O(n^2)

9.写出float x 零值比较的if语句。
      if(x>0.000001&&x<-0.000001)

10.Internet采用哪种网络协议?该协议的主要层次结构?
      Tcp/Ip协议
      主要层次结构为: 应用层/传输层/网络层/数据链路层/物理层。

11.Internet物理地址和IP地址转换采用什么协议?
      ARP (Address Resolution Protocol)(地址解析協議)

12.IP地址的编码分为哪俩部分?
     IP地址由两部分组成,网络号和主机号。不过是要和子网掩码按位与上之后才能区分哪些是网络位哪些是主机位。

13.用户输入M,N值,从1N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。
     循环链表,用取余操作做


14.不能做switch()的参数类型是:
     switch的参数不能为实型。

  

1.写出判断ABCD四个表达式的是否正确若正确写出经过表达式中 a的值(3)
int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);
a = ?
答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;
改后答案依次为9,10,10,11

2.32位系统下, C++程序,请计算sizeof 的值(5).
char str[] = “http://www.ibegroup.com/”
char *p = str ;
int n = 10;
请计算
sizeof (str ) = ?(1
sizeof ( p ) = ?(2
sizeof ( n ) = ?(3
void Foo ( char str[100]){
请计算
sizeof( str ) = ?(4
}
void *p = malloc( 100 );
请计算
sizeof ( p ) = ?(5
答:(117 23) 454

3. 回答下面的问题. (4)
(1).头文件中的 ifndef/define/endif 干什么用?预处理
答:防止头文件被重复引用
(2). i nclude 和 #i nclude “filename.h” 有什么区别?
答:前者用来包含开发环境提供的库头文件,后者用来包含自己编写的头文件。
(3).C++ 程序中调用被 编译器编译后的函数,为什么要加 extern “C”声明?
答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变
量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调
函数。C++提供了一个连接交换指定符号extern“C”来解决这个问题。
(4). switch()中不允许的数据类型是?
答:实型

4. 回答下面的问题(6)
(1).Void GetMemory(char **p, int num){
*p = (char *)malloc(num);
}
void Test(void){
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:输出“hello”
(2). void Test(void){
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL){
strcpy(str, “world”);
printf(str);
}
}
请问运行Test 函数会有什么样的结果?
答:输出“world”
(3). char *GetMemory(void){
char p[] = "hello world";
return p;
}
void Test(void){
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:无效的指针,输出不确定

5. 编写strcat函数(6)
已知strcat函数的原型是char *strcat (char *strDest, const char *strSrc);
其中strDest 是目的字符串,strSrc 是源字符串。
1)不调用C++/C 的字符串库函数,请编写函数 strcat
答:
VC源码:
char * __cdecl strcat (char * dst, const char * src)
{
char * cp = dst;
while( *cp )
cp++; /* find end of dst */
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
return( dst ); /* return dst */
}
2strcat能把strSrc 的内容连接到strDest,为什么还要char * 类型的返回值?
答:方便赋值给其他变量

6.MFCCString是类型安全类么?
答:不是,其它数据类型转换到CString可以使用CString的成员函数Format来转换

7.C++中为什么用模板类。
答:(1)可用来创建动态增长和减小的数据结构
2)它是类型无关的,因此具有很高的可复用性。
3)它在编译时而不是运行时检查数据类型,保证了类型安全
4)它是平台无关的,可移植性
5)可用于基本数据类型

8.CSingleLock是干什么的。
答:同步多个线程对一个数据类的同时访问

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

charstr1[] ="abc";

charstr2[] ="abc";

constchar str3[] ="abc";

constchar str4[] ="abc";

constchar* str5 ="abc";

constchar* str6 ="abc";

cout << boolalpha << ( str1==str2 ) << endl;//输出什么?

cout << boolalpha << ( str3==str4 ) << endl;//输出什么?

cout << boolalpha << ( str5==str6 ) << endl;//输出什么?

 

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

voidUpperCase(char str[] )//将str中的小写字母转换成大写字母

{

    for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )

    {

        if('a'<=str[i] && str[i]<='z' )

        {

             str[i] -= ('a'-'A' );

        }

    }

}

charstr[] ="aBcDe";

cout <<"str字符长度为: "<<sizeof(str)/sizeof(str[0]) << endl;

UpperCase( str );

cout << str << endl;

 

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

 

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

structTest

{

    Test(int ) {}

    Test() {}

    void fun() {}

};

voidmain(void )

{

    Test a(1);

    a.fun();

    Test b();

    b.fun();

}

 

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

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

              

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

unsignedint const size1 = 2;

charstr1[ size1 ];

unsignedint temp = 0;

cin >> temp;

unsignedint const size2 = temp;

charstr2[ size2 ];

 

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

vectorarray;

array.push_back( 1 );

array.push_back( 2 );

array.push_back( 3 );

for( vector::size_type i=array.size()-1; i>=0; --i )//反向遍历array数组

{

    cout <<array[i] << endl;

}

 

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

structCLS

{

    int m_i;

    CLS(int i ) : m_i(i) {}

    CLS()

    {

        CLS(0);

    }

};

CLS obj;

cout << obj.m_i << endl;

 

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

 

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

floata = 1.0f;

cout << (int)a << endl;

cout << (int&)a << endl;

cout << boolalpha << ( (int)a == (int&)a ) << endl;//输出什么?

floatb = 0.0f;

cout << (int)b << endl;

cout << (int&)b << endl;

cout << boolalpha << ( (int)b == (int&)b ) << endl;//输出什么?

 

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

typedefvector IntArray;

IntArrayarray;

array.push_back( 1 );

array.push_back( 2 );

array.push_back( 2 );

array.push_back( 3 );

//删除array数组中所有的2

for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )

{

    if( 2 == *itor )array.erase( itor );

}

 

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

 

答案:

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

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

3. 答:

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. 答:变量b定义出错。按默认构造函数定义对象,不需要加括号。

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

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

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

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

9. 答:

classEmpty

{

public:

    Empty();                //缺省构造函数

    Empty(const Empty& ); //拷贝构造函数

    ~Empty();               //析构函数

    Empty&operator=(const Empty& ); //赋值运算符

    Empty*operator&();                //取址运算符

    const Empty*operator&()const;   //取址运算符const

};

10. 答:分别输出false和true。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。

 注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,以浮点数形式存放在内存中,按ieee754规定,其内容为x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容x0000803F按整数解释,其值正好就是(十进制数)。

 通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。

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

12. 答:

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+cout )//能考虑到这种情况就行了

    {

        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;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值