15 October 2013

IMG-THUMBNAIL

触控科技笔试题,也参加了面试,跟我讲说11月份会通知我,结果也没消息了。公司不大,老板爱喝茶,办公室里全是专业的喝茶器具。之前收购了一个开源游戏引擎Cocos2d。貌似最近又搞来了小鳄鱼爱洗澡,传闻也快上市了。发展不错,不过前面还有可怕的腾讯。。。

#####1. 实现运行时多态的机制是(B)

  • A. 重载函数 // 编译时多态
  • B. 虚函数 // 运行时多态
  • C. 静态函数
  • D. 模板函数

#####2. fun()函数是一个类的常成员函数,它无返回值,下列表示中,正确的是(A)

  • A. void fun() const;
  • B. const void fun();
  • C. void const fun();
  • D. void fun(const);

#####3. 下列说明中 const char* ptr,ptr应该是(A)

  • A. 指向字符常量的指针
  • B. 指向字符的常量指针
  • C. 指向字符串常量的指针 char *p="hello";
  • D. 指向字符串的常量指针 const char *p="hello";

Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。

char  * const cp; ( * 读成 pointer to ) 
cp is a const pointer to char --->cp是一个指向字符char的固定指针
const char * ptr; 
ptr is a pointer to const char; --->ptr是一个指向固定字符char的指针

#####4. 这段代码执行后,哪项描述是正确的(A)

int a = 5, b = 7, c; c = a+++b;
  • A. a = 6, b = 7, c = 12
  • B. a = 5, b = 8, c = 12
  • C. a = 5, b = 8, c = 13
  • D. 这段代码不合法

就近原则,先执行a++a++的话,是先赋值后做加法。

#####5. 字符串:”\\0211\”xab” 的长度为(B)

  • A. 7
  • B. 9
  • C. 10
  • D. 11

#####6. expr的值为(3)

int a = 8, b = 4;
int expr = a++ % ++b;

#####7. expr的值为(8)

int expr = (1 % 3) + (5 | 3);

#####8. expr的值为(22)

char a[6][8];
int expr = a[2] - &a[4][6];

#####9. 请简述C++中overload(重载)和override(覆盖)的区别?

  • Overload(重载):在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型、顺序不同),即函数重载。(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。
  • Override(覆盖):是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。

#####10. 请简述C++中的4种类型转换方式?

  • static_cast 静态的_cast
  • dynamic_cast 动态的_cast
  • reinterpret_cast 重新解释的_cast
  • const_cast 常量的_cast

#####11. 写出几种在不用第三方参数的情况下,交换两个参数的值的方法。

交换值是比较常用的步骤,也比较简单,这里总结了3个方法:

使用临时变量交换。方法很简单,使用临时变量来保存一个值,该值被保存后就可以对其进行赋值操作了;

// 通过临时变量交换值
void swap_temp(int *a, int *b) {    // a = 1, b = 3
    int temp = *a;                  // temp = 1
    *a = *b;                        // a = 3
    *b = temp;                      // b = 1
}

使用异或操作(可参考《位运算符》)。具体原理是:对于任何数,都有A^0=A A^A=0;

// 通过位运算交换值
void swap_bit(int *a, int *b) {     // a = 1, b = 3
    *a = *a ^ *b;                   // a = a ^ b
    *b = *b ^ *a;                   // b = b ^ a = b ^ (a ^ b) = a = 1
    *a = *a ^ *b;                   // a = a ^ b = (a ^ b) ^ a = b = 3
}

使用加法和减法也可以实现数字的交换,原理同第二条异或原理基本一致;

void swap_add_substract(int *a, int *b) {   // a = 1, b = 3
    *a = *a + *b;                           // a = a + b
    *b = *a - *b;                           // b = a - b = (a + b) - b = a = 1
    *a = *a - *b;                           // a = a - b = (a + b) - a = b = 3
}

虽然使用异或操作和加减法运算并没有去声明临时变量,但实际运行过程中,会在临时寄存器中保存临时变量用于计算,所以都是将一个数值保存在了一个临时的场所,只是位置不同而已。

#####12. 假设我们用16位bit来存储RGB像素数据,存储格式定义为RRRRRGGGGGBBBBBB,接下来,我们为了加入透明色,重新定义格式为AAAARRRRGGGGBBBB,头4个bit用来存储alpha值,请写出实现函数。

short convertRGB2ARGB(short RGB, char alpha) {
	short ARGB = 0;
	short A = alpha & 15;
	short R = (RGB >> 11) & 31;
	short G = (RGB >> 6) & 31;
	short B = RGB & 63;
	ARGB = (A << 12) + (R << 8) + (G << 4) + B;
	return ARGB;
}

#####13. 翻译(略)。

IMG-THUMBNAIL

原文链接:触控科技2014校园招聘笔试题,转载请注明来源!

EOF