面试题

这是一组C++编程的面试题目,涉及位域操作、内存拷贝、构造函数、析构函数、类型转换、类的继承与访问权限、运算符重载、多态性等多个方面。题目中包含了位域结构的定义和使用,如结构体内的位域长度限制、位域的内存对齐,以及位域变量的访问。还讨论了C++中struct和class的区别、指针与数组的关系、内联函数、友元函数的使用、类的继承和访问权限、动态内存管理、构造函数与析构函数的调用时机。此外,题目还涵盖了面向对象编程中的多态性、抽象基类、函数重载、运算符重载、类的静态成员和静态成员函数,以及程序设计中的错误检查和处理。
摘要由CSDN通过智能技术生成

1.想想结果是如何出来的:
 int main()  
{
   unsigned   char   i=1;  
   i-=3;  
   printf("the   value   of   i   is:%d",i);  
}  
结果:the   value   of   i   is:254
答案:

    0000   0001  
-   0000   0011  
------------------  
    1111   1110         而     1111   1110       化为十制进正好是254! 

2.看看下列的程序有什么问题
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test函数会有什么样的结果?为什么?
答案:1.内存泄漏 2.str仍然是空指针
3.
int n = 10;
为什么sizeof ( n ) = 4?
 答案:sizeof(x)返回x的类型占用的字节数,该机器是在32位下
4.请问C++的类和C里面的struct有什么区别?
5.请讲一讲析构函数和虚函数的用法和作用?
6.全局变量和局部变量有什么区别?是怎么实现的?
7.设计函数 int atoi(char *s)。
8.int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 输出是多少?
9.解释局部变量、全局变量和静态变量的含义
10.解释堆和栈的区别。
11.论述含参数的宏与函数的优缺点。
12.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数。
13.写一个函数,将其中的 都转换成4个空格。
14.Windows程序的入口是哪里?写出Windows消息机制的流程。
15.如何定义和实现一个类的成员函数为回调函数?
16.C++里面是不是所有的动作都是main()引起的?如果不是,请举例。
17.C++里面如何声明const void f(void)函数为C程序中的库函数?
18.下列哪两个是等同的
  int b;
  A const int* a = &b;
  B const* int a = &b;
  C const int* const a = &b;
  D int const* const a = &b;
19.内联函数在编译时是否做参数类型检查?
  void g(base & b)
      {
   b.play;
  }
  void main()
      {
   son s;
            g(s);

            return;

}
20.请你分别划划OSI的七层网络结构图,和TCP/IP的五层结构图?
21.请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用? TCP与UDP呢?
22.请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的? 

头文件中<>  和“”的区别?

4、定义一个宏,输入两个参数,输出积。


1. 以下三条输出语句分别输出什么?[C易] (视编译器而定)
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?
cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?
cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?

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


12. 以下代码中的两个sizeof用法有问题吗?[C易]
void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母
{
for( size_t i=0; i
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;

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


[color=#DC143C]13. 非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A?[C++中等]
答:
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& ); // 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个[/color]


4. 以下代码有什么问题?[C++易]
struct Test
{
Test( int ) {}
Test() {}
void fun() {}
};
void main( void )
{
Test a(1);
a.fun();
Test b();
b.fun();
}

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


5. 以下代码有什么问题?[C++易]
cout << (true?1:"1") << endl;
答:三元表达式“?:”问号后面的两个操作数必须为同一类型。


8. 以下代码能够编译通过吗,为什么?[C++易]
unsigned int const size1 = 2;
char str1[ size1 ];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp;
char str2[ size2 ];
答:str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量。


2. 以下反向遍历array数组的方法有什么错误?[STL易]
vector array;
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;
}

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


[color=#DC143C]9. 以下代码中的输出语句输出0吗,为什么?[C++易]
struct CLS
{
int m_i;
CLS( int i ) : m_i(i) {}
CLS()
{
CLS(0);
}
};
CLS obj;
cout << obj.m_i << endl;

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

[color=#DC143C]10. C++中的空类,默认产生哪些类成员函数?[C++易]
答:
class Empty
{
public:
Empty(); // 缺省构造函数
Empty( const Empty& ); // 拷贝构造函数
~Empty(); // 析构函数
Empty& operator=( const Empty& ); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const; // 取址运算符 const
};[/color]


[color=#DC143C]3. 以下两条输出语句分别输出什么?[C++难]
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么?
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
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<<及==选择正确的重载版本。
[/color]

6. 以下代码有什么问题?[STL易]
typedef vector In

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值