您的位置:首页 > 其它

2012.4.21腾讯实习生一面

2012-04-22 11:13 218 查看
我想做C/C++方面的后台逻辑开发,但是还是太菜了啊!!!很快就让我出来了有木有!!!

1.自我介绍(突出强项)

2.问我哪儿的人,想去哪儿工作为什么,想做什么方面的

3.开始问问题

4.熟悉什么系统平台windows还是linux,平时用什么编译环境

5.解释一下二叉树的中序遍历,最先想到的实现方法,如果非递归怎样实现(没让动手写)
6.C++的模板

模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。

①模板是一种对类型进行参数化的工具 

②通常有两种形式:函数模板和类模板 

③函数模板针对仅参数类型不同的函数

④类模板针对仅数据成员和成员函数类型不同的类

函数模板的定义方法 :

template <class T1,class T2,…>

类型 函数名(参数表)                      

{                                 

      函数体                                

}                                 

函数模板与重载函数一起使用的调用约定:

先寻找重载函数

如找不到相应的重载函数则找函数模板 

如再找不到则进行强制类型转换,此时可能丢失精度

类模板的定义方法: 

template
<class T1,class T2,…> 

class 类名 



    … 

}; 

类模板的使用: 

使用模板类定义类变量:类名 <具体类型名>  对象名 

在类体外定义的成员函数,应定义成函数模板。 

//定义 

template <class T> 

class Base 



        T a; 

public: 

        Base(T b)  {a=b;} 

        T GetA()   {  return a;  } //类内定义函数

        void SetA(T c);

}; 

//类外定义函数

template<class T>

void class Base::SetA(T c)

{

       a=c;

}

//使用                                                

void main()                                          

{                                                           

       Base <int>  A(1); 

       Base <double>  B(2.1); 

       cout<<A.GetA()<<endl; 

       cout<<B.GetA()<<endl; 



//输出结果

1

2.1

7.返回两个数中最大的数,一句话编写

template <class T>

T Max(T a, T b)

{

    return a<b?b:a;

}

8.不使用第三个变量交换两个变量

交换变量a,b的值:

① a=(a+b)-(b=a)

② a=a+b

     b=a-b

     a=a-b

③ a=a^b

     b=a^b

     a=a^b

9.C语言中的struct和C++中的struct有什么不同

在C++中class和struct的区别:

①默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理。

②成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。

③class和struct如果定义了构造函数的话,都不能用大括号进行初始化。如果没有定义构造函数,struct可以用大括号初始化。如果没有定义构造函数,且所有成员变量全是public的话,class可以用大括号初始化。如:A
a = {1, 2, 3};

C中struct和C++中struct的区别:

C++中定义struct类型可以为:

struct S

{

};

C中定义struct类型为:

typedef struct tagS

{

} S;

C中的struct是没有权限设置的,C++中struct增加了访问权限,且可以和类一样有成员函数。 

C++中的struct等同于class,只是class默认成员权限是private,而struct默认成员权限是public,且class的默认继承为私有继承,struct的默认继承为公有继承。

10.解释一下多态怎么回事,多态是如何实现的

关于C++中的多态性


多态性的实现形式


  从广义上说,多态性是指一段程序能够处理多种类型对象的能力。在C++语言中,这种多态性可以通过强制多态(类型强制转换)重载多态(函数及运算符重载)类型参数化多态(模板)包含多态(类继承及虚函数)四种形式来实现。类型参数化多态和包含多态统称为一般多态性,用来系统地刻画语义上相关的一组类型。重载多态和强制多态统称为特殊多态性,用来刻画语义上无关联的类型间的关系。

包含多态


  C++中采用虚拟函数实现包含多态,虚拟函数为C++提供了更为灵活的多态机制,这种多态性在程序运行时才能确定,因此虚拟函数是多态性的精华,至少含有一个虚拟函数的类称为多态类,包含多态在程序设计中使用十分频繁。利用虚函数,可在基类和派生类中使用相同的函数名定义函数的不同实现,从而实现“一个接口,多种方式”。当用基类指针或引用对虚函数进行访问时,软件系统将根据运行时指针或引用所指向或引用的实际对象来确定调用对象所在类的虚函数版本。

类型参数化多态


  参数化多态又称非受限类属多态,即将类型作为函数或类的参数,避免了为各种不同的数据类型编写不同的函数或类,减轻了设计者负担,提高了程序设计的灵活性。

  模板是C++实现参数化多态性的工具,分为函数模板和类模板两种。


重载多态


        重载是多态性的最简形式,而且把更大的灵活性和扩展性添加到程序设计语言中,它分成操作符重载和函数重载


强制多态


        强制也称类型转换。C++语言定义了基本数据类型之间的转换规则,即:

  char -> short -> int -> unsigned -> long-> unsigned long-> float -> double ->long double

  赋值操作是个特例,上述原则不再适用。当赋值操作符的右操作数的类型与左操作数的类型不同时,右操作数的值被转换为左操作数的类型的值,然后将转换后的值赋值给左操作数。

  程序员可以在表达式中使用3种强制类型转换表达式:①static_cast<T>(E);②T(E);③(T)E。其中E代表一个运算表达式,T代表一个类型表达式。第三种表达形式是C语言中所使用的风格,在C++中,建议不要再使用这种形式,应选择使用第一种形式。例如,设对象f 的类型为double,且其值为3.14。则表达式static_cast<int>(f)的值为3,类型为int。

11.虚函数的实现机理

1.C++中与多态有关的几个概念

2.C++虚函数的原理

3.虚函数工作原理     最后讲解的在内存消耗上有些问题,只是多出了VPTR指针的大小,对于类和对象。

4.C++虚函数实现原理

VPTR被初始化为指向相应的VTABLE是在构造函数中发生的。

以下程序为测试含有虚函数的类大小。

#include <iostream>

using namespace std;

class no_virtual
{
public:
void fun1() const{}
int  fun2() const { return a; }
private:
int a;
};

class one_virtual
{
public:
virtual void fun1() const{}
int  fun2() const { return a; }
private:
int a;
};

class two_virtual
{
public:
virtual void fun1() const{}
virtual int  fun2() const { return a; }
private:
int a;
};

int main()
{
no_virtual a;
one_virtual b;
two_virtual c;
cout<<"no_virtual_class: "<<sizeof(no_virtual)<<endl;
cout<<"one_virtual_class: "<<sizeof(one_virtual)<<endl;
cout<<"two_virtual_class: "<<sizeof(two_virtual)<<endl;
cout<<"no_virtual_object: "<<sizeof(a)<<endl;
cout<<"no_virtual_object: "<<sizeof(b)<<endl;
cout<<"no_virtual_object: "<<sizeof(c)<<endl;

return 0;
}



12.const int *p与int * const p的区别

const int *p 与 int const *p 的含义是相同的,而int* const p含义则不同

13.static全局变量与普通全局变量的区别
14.C++类中的静态全局变量,静态函数,静态方法在内存中的布局

C++中的static关键字

C:

静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的,静态全局变量不可被其他文件所用。

静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0。

静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用,其它文件中可以定义相同名字的函数,不会发生冲突。

C++:

对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。

静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;非静态成员函数可以任意地访问静态成员函数和静态数据成员;静态成员函数不能访问非静态成员函数和非静态数据成员。

15.C++中指针的优点和缺点

16.描述一下TCP的三次握手协议过程

在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状态,完成三次握手。 

可参见:OSI七层网络模型,TCP/IP四层网络模型与网络协议解析

17.写一个在main()函数开始之前就执行的函数,比如一个打印输出函数

main函数执行之前,主要就是初始化系统相关资源:

1.设置栈指针。

2.初始化static静态和global全局变量,即data段的内容。

3.将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL等等,即.bss段的内容。

4.运行全局构造器(例如C++中的构造函数)。

5.将main函数的参数argc、argv等传递给main函数,然后才真正运行main函数。

C++语言为类提供的构造函数可自动完成对象的初始化任务,全局对象和静态对象的构造函数在main()函数执行之前就被调用。构造从类层次的最根处开始,在每一层中,首先调用基类的构造函数,然后调用成员对象的构造函数。析构则严格按照与构造相反的次序执行,该次序是唯一的,否则编译器将无法自动执行析构过程。

#include <iostream>

using namespace std;

class A

{

  public:

      A(){cout<<"Before main."<<endl;}

}; 

A a;

int main()

{

    cout<<"Main in process."<<endl;

    return 0;

}

返回值:

Before main.

Main in process.

18.sizeof()一个指针返回的值是什么

19.一个程序是怎么运行起来的,都经过哪些步骤

C语言编译全过程

20.说说自己做过的C++方面的印象最深或者觉得比较好的作品代码或项目

21.是否有针对算法和数据结构方面的编程实践
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息