2011百度校园招聘笔试题 C++类-附原创答案

最近在看各个公司的笔试面试题,这份题是百度11年的笔试题,答案是自己做的,也许有考虑不周的地方,欢迎各位

朋友指正。

一、选择题

 1.下列关于对象初始化的叙述中,正确的是

 A 定义对象的时候不能对对象进行初始化

 B 定义对象之后可以显式地调用构造函数进行初始化

 C 定义对象时将自动调用构造函数进行初始化

 D 在一个类中必须显式地定义构造函数实现初始化

答案:C. (对象在定义时会自动调用构造函数进行初始化)
2.下列关于基类和派生类关系的叙述中,正确的是

A 每个类最多只能有一个直接基类
B 派生类中的成员可以访问基类中的任何成员
C 基类的构造函数必须在派生类的构造函数体中调用
D 派生类除了继承基类的成员,还可以定义新的成员

答案:D.

 3.下列关于赋值运算符“=”重载的叙述中,正确的是

 A 赋值运算符只能作为类的成员函数重载

 B 默认的赋值运算符实现了“深层复制”功能

 C 重载的赋值运算符函数有两个本类对象作为形参

 D 如果己经定义了复制(拷贝) 构造函数,就不能重载赋值运算符

答案:A

 4.下列选项中,正确的C++标识符是

 A     6_group B      group~6 C    age+3 D  _group_6

答案:D

 5. 下列循环语句中有语法错误的是

 A       int i;for( i=1;i<10;i++)cout<<‘*‘;

 B     int i,j;for(i=1,j=0;i<10;i++,j++)cout<<‘*‘;

 C     int i=0;for(;i<10;i++)cout<<‘*‘;

 D     for(1)cout<<‘*‘;

答案:D. 其他三个都能正常运行

 6. 下列定义语句中,错误的是

 A int px*;   B char *acp[10];C char(*pac)[10];  D int(*p)();

答案:A. A明显编译不过。 B定义了一个数组;C 定义了一个指针pac,它指向含有10个char型元素的数组首地址
        D.定义了函数指针p,这个指针指向的函数无参数且返回一个int值

7. 若MyClass为一个类,执行“MyClass a[4],*p[5];”语句时会自动调用该类构造函数的次数是

A 2 B 5 C 4 D 9
答案:C.  a[4]定义了4个元素的数组,数组里存的是MyClass对象,故要调用默认的构造函数来初始化4个MyClass对象,
        *p[5]定义了5个元素的数组,数组中存放的是指向MyClass对象的指针,故没有实例化MyClass对象。
写个小程序验证一下:
#include <iostream>
using namespace std;
class myClass{
public:
    myClass(){
        cout<<"constructor called..."<<endl;
    }
};
int main(){
    myClass a[4],*p[5];
    cout<<sizeof(a)/sizeof(myClass)<<endl;
    cout<<sizeof(p)/sizeof(myClass)<<endl;
    cout<<sizeof(*p)/sizeof(myClass)<<endl;
    system("pause");
    return 0;
}

输出:

这里a数组的大小其实也是4(因为空类占有大小为1字节),p的大小为20字节,因为每个指针占有4字节,
*p里面是指针,故大小为4字节。
8. 有如下程序:
#include<iostream>
#include<cmath>
using std::cout;

classPoint{

public:

friend double distance(const Point &p); //p距原点的距离

Point(int xx=0,int yy=0):x (xx),Y(YY){}//①

private:

     Int x,Y;
};

double distance(const Point &p) { //②

return sqrt(p.x*p.x+p.Y*p.Y);  

int main(){

Point p1(3,4);
cout<<distance(p1); //③
return 0;  
}  
下列叙述中正确的是
A 程序编译正确   B 程序编译时语句①出错
C 程序编译时语句②出错   D程序编译时语句③出错
答案:A. 经过验证,程序编译正确。
9. 下列哪两个是等同的
  int b;

1.const int *a =&b; 2.const * int a = &b;

  3. const int*const a = &b;  4.int const* const a = &b;

答案:3和4相同。 1定义一个指针a,它指向一个整型的不变量,即不能通过a来修改b的值(但b的值是可以修改的)
           2编译错误。3和4均定义的指针它本身就不可改变(不能再把另外的变量地址赋值给它),它指向的变量也不可通过
          它来修改。
10. 有如下语句序列:
char str[10];cin>>str;
  当从键盘输入”I lovethis game”时,str中的字符串是

A"I love this game"B "I love thi" C"I love" D "I"

答案:D. str的地址是数组的首地址,也就是str[0],故字符串中只有一个字符I

 11. 有函数模板声明和一些变量定义如下:

 template<class Tl,class T2,class T3>T1 sum(T2,T3);

 double dl,d2;

 则下列调用中,错误的是

 A sum<double,double,double>(dl,d2);  B sum<double;double>(d1,d2);

 C sum<double>(d1,d2);   D sum(d1,d2);

答案:D. D会导致编译错误,因为编译器无法去匹配参数列表

 12. 以下程序段完全正确的是

 A int*p; scanf("%d",&p); B int *p; scanf(“%d”,p);

 C int k,*p=&k; scanf("%d",p); D int k,*p:; *p= &k; scanf(“%d”,p);

答案:A,C. A项编译能通过,也能运行,定义了一个指针p,并给这个指针赋值(输入的是地址)

        B项中指针p的值没有定义,此时它没有指向任何内存地址,故通过它来给对应的内存地址输入

        变量是错误的。C正确,通过p来给k赋值。D编译不过,语句*p=&k错误

13. 有定义语句:int *p[4];以下选项中与此语句等价的是
Aint p[4]; B int **p; C int *(p「4」); Dint (*p)「4」;
答案:C.   D项定义了一个指针p,它指向有4个整型元素的数组。
14. 若要重载+、=、<<、=和[]运算符,则必须作为类成员重载的运算符是
A +和= B =和<< C ==和<< D =和[]
答案:D  A中+可以为友元,B中<<可以为友元,C中==和<<均可以为友元
15. 下列说法正确的是( )
A 内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方
B 内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方
C 类的内联函数必须在类体内定义
D 类的内联函数必须在类体外通过加关键字inline定义
答案:B
16. 下面对于友元函数描述正确的是( )
A 友元函数的实现必须在类的内部定义
B 友元函数是类的成员函数
C 友元函数破坏了类的封装性和隐藏性
D 友元函数不能访问类的私有成员
答案:C

17. 在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不正确的是( )
A 派生类的对象可以赋给基类的对象
B 派生类的对象可以初始化基类的引用
C 派生类的对象可以直接访问基类中的成员
D 派生类的对象的地址可以赋给指向基类的指针
答案:C. 其它都是多态的特性
18. 下列关于多态性的描述,错误的是( )
A C++语言的多态性分为编译时的多态性和运行时的多态性
B 编译时的多态性可通过函数重载实现
C 运行时的多态性可通过模板和虚函数实现
D 实现运行时多态性的机制称为动态绑定
答案:C. 模版是编译时的多态
19. 如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是( )
A 一元运算符 B二元运算符 C 选项A 和选项B 都可能 D 重载错误
答案:D. C++中用友元函数重载运算符至少有一个参数,重载一目运算符要有一个参数,重载二目运算符要有两个参数
20. 在下列关于C++函数的叙述中,正确的是( )
A 每个函数至少要有一个参数 B 每个函数都必须返回一个值
C 函数在被调用之前必须先声明 D 函数不能自己调用自己
答案:C

21. 如果进栈序列为el,e2,e3,e4,则可能的出栈序列是 ( )

A e3,el,e4,e2 B e2,e4,e3,el C e3,e4,e1,e2 D 任意顺序
答案:B. 排除法
22. 下面关于模板的描述,错误的是 ( )
A 函数模板和类模板的参数可以是任意的数据类型
B 类模板不能直接使用,必须先实例化为相应的模板类.然后定义了模板类的对象
C 函数模板不能直接使用,需要实例化为模板函数后才能使用
D 类模板的成员函数都是模板函数
答案:A
参数不能是任意类型的,至少该有明确的类型,比如抽象类就不行。
D中可能有些疑惑:
类模版的成员函数有两种情况:
1。涉及模板参数T的一定是个函数模板;
2。 不涉及(形式上,函数体,参数表内没出现)模板参数T的也是个函数模板;
       角度一:成员函数的类型中包含一个属性“属于什么类”,所以void A<T>::fun(){};这是就和T建立了联系,这时就能说明即使函数体内不涉及T类型,它也是个函数模板,因为由不同T类型,是不同的函数类型(因为域概念是成员函数类型的一部分)
23. 下面对静态数据成员的描述中,正确的是( )
A 静态数据成员可以在类体内进行初始化
B 静态数据成员不可以被类的对象调用
C 静态数据成员不受private控制符的作用
D 静态数据成员可以直接用类名调用
答案:D
B明显不对。A其实有点歧义,一般来说静态成员是在类中声明,类外定义初始化,但当静态成员是const int时是
可以直接在类内部进行初始化的(此时还是要在类外部声明一下)
C也是有歧义的,静态变量的初始化时不受private作用,可以在类外进行初始化,但之后引用修改就不行了
24. 对类成员访问权限的控制,是通过设置成员的访问控制属性实现的,下列不是访问控制属性的是( )

A 公有类型 B私有类型 C 保护类型 D友元类型

答案:D

25.抽象基类是指( )

A 嵌套类 B 派生类  C含有纯虚函数 D 多继承类
答案:C
26.如果已定义了一个C++类CMyList并有以下语句:
CMyList list(3);
以下说法正确的是()。
A 该语句会创建一个CMyList类的一个对象;
B 该语句会创建一个CMyList类的3个对象;
C 必须为类CMyList定义一个构造函数;
D 必须为类CMyList定义一个析构函数;
E 必须定义函数CMyList list(int);
答案:C.  
必须定义参数为int类型的构造函数,否则编译不通过。

27. 以下说法正确的是( )。

A内联(inline)函数改善了函数调用的执行效率。
B类A的友元(friend)函数可以访问类A的私有成员。
C类A的友元(friend)类B可以访问类A的私有成员。
D类A的静态数据成员为类A的所有对象所共享。
E类A的静态成员函数没有传递this 指针作为参数。
答案:A,B,C,D,E
28.类B从类A派生,则类B可以访问类A中的( )成员。
A public成员 B private成员 Cprotected成员 D数据成员 E函数成员
答案:A,C
29. 面向对象的程序设计语言具有()等共同特性。
A封装性 B多态性 C简单性 D复杂性 E继承性
答案:A,B,E
30.  现有一个程序如下:
 
class A{
public:
    void f(){
        cout<<"A::f().."<<endl;
    }
};
class B{
public:
    void f(){
        cout<<"B::f().."<<endl;
    }
    void g(){
        cout<<"B::g().."<<endl;
    }
};
class C:public A,public B{
public :
    void g(){
        cout<<"C::g().."<<endl;
    }
    void h(){
        cout<<"C::h().."<<endl;
        f();// 语句1
    }
};
int main(){
    C obj;
obj.f();//语句2 obj.A::f();//语句3 obj.B::f();//语句4 obj.g(); //语句5 system(
"pause"); return 0; }
则编译时会产生错误的语句有()
A语句1 B语句2 C语句3 D语句4 E语句5
答案:A,B 
二.填空题
1. int func(x){
int countx = 0;
while(x){
countx ++;
x = x&(x-1);
}
return countx;
}
假定x = 9999。 函数的运行结果为:8
分析:该函数功能是计算一个数x二进制表示中1的个数
x&(x-1)计算后x每次少一个1
2. 一个栈的初始状态为空。首先将元素5,4,3,2,1 依次入栈,然后退栈一次,再将元素A,B,C,D依次入栈,
之后将所有元素全部退栈,则所有元素退栈(包括中间退栈的元素)的顺序为: 1DCBA2345
3. 一棵二叉树有10个度为1的结点,7个度为2的结点,则该二叉树共有25个结点。
分析:在二叉树 度为二的节点数=度为一的节点+1
4. 一个双目运算符作为类的成员函数重载时,重载函数的参数表中有1个参数
分析:作为类的成员函数时,会传入代表本对象的this指针,从而省去了一个参数
5. #define DOUBLE(x) x+x ,i= 5*DOUBLE(5); i的值为30
分析:宏定义只是简单的展开替换,不作处理
6. switch()中不允许的数据类型是:除整型和字符型外的其他类型都不允许
7. 某32位系统下, C++程序void *p = malloc( 100 ); sizeof (p) = 4
分析:32位机上,各种类型的指针均为4字节
8. int a = 4;(++a) += a;执行后a的值为10
分析:先做a的自增,a值变为5(修改了内存地址中的值,等式两边均变为5),相加为10
          (a++) +=a是不合法的,因为a已经做了自增,此时还要返回a原先的值,并要用这个值
           和等号右边的a值(已经自增过了)做运算,自然不合法。
           (++a) += a++ 执行完后,a值为11. 相当于再做一次自增
9. 派生类中的成员函数可以直接访问基类中的公有成员和保护成员。
10. C++语言的参数传递机制包括传值和传引用两种
三.阅读题
1 .写出函数Test 的运行结果
void Test(void){
   char *str = (char *) malloc(100);
   strcpy(str,"hello");
  // cout<<str<<"  "<<*str<<endl;
   free(str);
   if(str!= NULL){
       strcpy(str,"world");
       printf(str);
   }
}

分析:程序会崩溃。因为free函数释放了str所指的内存,但指针值此时不为NULL,故if块中的语句会执行,导致试图将对一块儿不合法的内存写入数据。所以一般调用完free函数释放完空间后应将指针显示赋值为NULL

2.写出程序的运行结果

 

#include <iostream>
using namespace std;
class Base{
    int x;
public:
    Base(int b):x(b){}
    virtual void display(){
        cout<<x<<endl;
    }
};
class Derived:public Base{
    int y;
public:
    Derived(int d):Base(d),y(d){}
    void display(){
        cout<<y<<endl;
    }
};
int main(){
    //Test();
    Base b(1);
    Derived d(2);
    b.display();
    d.display();
    Base *p=&d;
    p->display();
    //Base *q=new Derived;
    system("pause");
    return 0;
}

程序输出:

1

2

2

3.下面的函数实现在一个固定的数上加上一个数,有什么错误,改正

int add_n(int n) { static int i=100; i+=n; return i;}

分析:题目的意思有点儿不太明了,固定的数是指每次都给100上加一个指定的值吗?这样的话要去掉

          static关键字。

4.i最后等于多少?

int i = 1;

int j = i++;

if((i>j++) && (i++ == j)) i+=j;

分析:i为5,j为2 。

5.

#include <iostream>

using namespace std;

constint SIZE=10;

class stack{

char stck[SIZE];

int top;

public:

void init();

void push(char ch){

char pop();

};

void stack::init()

{ top=0; }

void stack:push(char ch){

if(top==SIZE){

cout<<”Stack is full.\n”;

return ;

}

stck[top++]=ch;

}

char stack:pop(){

if(top==0){

cout<<”Stack is empty.\n”;

return 0;

}

return stck[--top];

}

void main(){

stack s1, s2;

s1.init();

s2.init();

s1.push(‘a’);

s1.push(‘b’);

s1.push(‘c’);

s2.push(‘x’);

s2.push(‘y’);

s2.push(‘z’);

for(int i=0; i<3; i++) cout<<”Pop s1:”<< s1.pop();

for(i=0; i<3; i++) cout<<”Pop s2:”<< s2.pop();

}

分析:输出cbazyx

四.附加题

写一个Singleton。Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

C++代码:

 

class Singleton{
private:
    static Singleton *instance;
    Singleton(){cout<<"Singleton example";}
public:
    static Singleton* getSingleton(){
        if(instance==NULL){
            instance=new Singleton();
        }
        return instance;
    }
};
Singleton * Singleton::instance=NULL;

 

注意两点:

1.构造函数为私有,防止直接实例化。

2.指针为静态变量

 

转载于:https://www.cnblogs.com/hello--the-world/archive/2012/08/17/2642705.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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值,从1至N开始顺序循环数数,每数到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) 答:(1)17 (2)4 (3) 4 (4)4 (5)4 3. 回答下面的问题. (4分) (1).头文件中的 ifndef/define/endif 干什么用?预处理 答:防止头文件被重复引用 (2). #i nclude 和 #i nclude “filename.h” 有什么区别? 答:前者用来包含开发环境提供的库头文件,后者用来包含自己编写的头文件。 (3).在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明? 答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变 量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,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 */ } (2)strcat能把strSrc 的内容连接到strDest,为什么还要char * 型的返回值? 答:方便赋值给其他变量 6.MFC中CString是型安全么? 答:不是,其它数据型转换到CString可以使用CString的成员函数Format来转换 7.C++中为什么用模板。 答:(1)可用来创建动态增长和减小的数据结构 (2)它是型无关的,因此具有很高的可复用性。 (3)它在编译时而不是运行时检查数据型,保证了型安全 (4)它是平台无关的,可移植性 (5)可用于基本数据型 8.CSingleLock是干什么的。 答:同步多个线程对一个数据的同时访问 9.NEWTEXTMETRIC 是什么。 答:物理字体结构,用来设置字体的高宽大小 10.程序什么时候应该使用线程,什么时候单线程效率高。 答:1.耗时的操作使用线程,提高应用程序响应 2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。 3.多CPU系统中,使用线程提高CPU利用率 4.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独 立的运行部分,这样的程序会利于理解和修改。 其他情况都使用单线程。 11.Windows是内核级线程么。 答:见下一题 12.Linux有内核级线程么。 答:线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两 种型:“用户级线程”和“内核级线程”。 用户线程指不需要内核支持而在用户程序 中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度 和管理线程的函数来控制用户线程。这种线程甚至在象 DOS 这样的操作系统中也可实现 ,但线程的调度需要用户程序完成,这有些似 Windows 3.x 的协作式多任务。另外一 种则需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部 需求进行创建和撤销,这两种模型各有其好处和缺点。用户线程不需要额外的内核开支 ,并且用户态线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线 程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不 到运行的机会;而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占 用了更多的系统开支。 Windows NT和OS/2支持内核线程。Linux 支持内核级的多线程 13.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中? 答:栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理 堆: 程序运行时动态申请,new 和 malloc申请的内存就在堆上 14.使用线程是如何防止出现大的波峰。 答:意思是如何防止同时产生大量的线程,方法是使用线程池,线程池具有可以同时提 高调度效率和限制资源使用的好处,线程池中的线程达到最大数时,其他线程就会排队 等候。 15函数模板与模板有什么区别? 答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而模板的实例化 必须由程序员在程序中显式地指定。 16一般数据库若出现日志满了,会出现什么情况,是否还能使用? 答:只能执行查询等读操作,不能执行更改,备份等写操作,原因是任何写操作都要记 录日志。也就是说基本上处于不能使用的状态。 17 SQL Server是否支持行级锁,有什么好处? 答:支持,设立封锁机制主要是为了对并发操作进行控制,对干扰进行封锁,保证数据 的一致性和准确性,行级封锁确保在用户取得被更新的行到该行进行更新这段时间内不 被其它用户所修改。因而行级锁即可保证数据的一致性又能提高数据操作的迸发性。 18如果数据库满了会出现什么情况,是否还能使用? 答:见16 19 关于内存对齐的问题以及sizof()的输出 答:编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能 地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问 ;然而,对齐的内存访问仅需要一次访问。 20 int i=10, j=10, k=3; k*=i+j; k最后的值是? 答:60,此题考察优先级,实际写成: k*=(i+j);,赋值运算符优先级最低 21.对数据库的一张表进行操作,同时要对另一张表进行操作,如何实现? 答:将操作多个表的操作放入到事务中进行处理 22.TCP/IP 建立连接的过程?(3-way shake) 答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。   第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状 态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个 SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;   第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1) ,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 23.ICMP是什么协议,处于哪一层? 答:Internet控制报文协议,处于网络层(IP层) 24.触发器怎么工作的? 答:触发器主要是通过事件进行触发而被执行的,当对某一表进行诸如UPDATE、 INSERT 、 DELETE 这些操作时,数据库就会自动执行触发器所定义的SQL 语句,从而确保对数 据的处理必须符合由这些SQL 语句所定义的规则。 25.winsock建立连接的主要实现步骤? 答:服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept() 等待客户端连接。 客户端:socker()建立套接字,连接(connect)服务器,连接上后使用send()和recv( ),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。 服务器端:accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连 接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesock et()关闭套接字。 26.动态连接库的两种方式? 答:调用一个DLL中的函数有两种方法: 1.载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数 ,使得他们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向 系统提供了载入DLL时所需的信息及DLL函数定位。 2.运行时动态链接(run-time dynamic linking),运行时可以通过LoadLibrary或Loa dLibraryEx函数载入DLL。DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的 出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了 。 27.IP组播有那些好处? 答:Internet上产生的许多新的应用,特别是高带宽的多媒体应用,带来了带宽的急剧 消耗和网络拥挤问题。组播是一种允许一个或多个发送者(组播源)发送单一的数据包 到多个接收者(一次的,同时的)的网络技术。组播可以大大的节省网络带宽,因为无 论有多少个目标地址,在整个网络的任何一条链路上只传送单一的数据包。所以说组播 技术的核心就是针对如何节约网络资源的前提下保证服务质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值