试题 |
解释 |
那个题打错字了,是:友元运算法符,指的是以友元的形式重载运算符。 运算符重载两种形式:成员函数和友元 若是成员函数 在重载时会有一个隐藏的参数 *this 所以答案是 C 若是友元的话就不存在默认参数了,答案是B |
|
这个错误主要是没看清找不必要的。函数主要是函数名 函数体 参数 返回值等。 |
|
数组的定义和实例化考察: 本题定义了一个二维数组,分别是x[0]和x[1]两个。 所以 x[1]就是4的地址 *x[1]表示4这个值了。 而且,在x[][]二维的定义中 的初始化方式 参考 |
|
转义字符的含义考察,\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。 但是 还有一个考察 那就是 字符串以 \0为结束。所以,strlen 不会检测\0以后的字符长度。st的大小就是数组的大小20 |
|
还是字符串的问题:什么是字符创长度呢? |
|
这个题在面试中碰到过,下面说一下几种情况: int arr[3] 1. 指针数组 int *p[3] 这个定义了一个指针数组,元素是三个指针 分别指向 三个int型的地址。 等同于 int *(p[3]) 2.指针 int (*p)[3] 定义了一个指针,指向一个有三个元素的数组的地址 如: p=&arr; |
|
运算符优先级的考察: 个人觉得,不好记,但是一般的尽量记住:比如赋值运算符、&&、|| 等的优先级较低。 () 优先级最高等。 http://en.cppreference.com/w/cpp/language/operator_precedence 这个里面所有的优先级对照表可以参考。 题中:!的优先级比 &&要高,所以,!x为true 再来计算 &&后面的真值。另外,对于 &&和||还有编译器优化计算的能力,比如&&之前的值为false 就没有必要计算后面的值了,事实上,编译器就是这样工作的。 如下题 |
|
我们知道 ()的优先级最高,= 赋值运算较低,比较运算较为高。所以,&&之前的值 为(m=a>b) 这个得好好讲讲了,首先是计算顺序,>比赋值要高所以得到 m=0 。之后就是赋值后的返回值了, int operator=(int) 返回赋值的那个值,为 0 所以整个表达式的值是 0 及不会执行后面的值了。 |
回复于: 2010-03-18 21:25:10 |
void GetMemory(char *p)
{ p=(char*)malloc(100); } p参数是复制原有指针的值,而不是原来的指针,所以即使p重新指向新的地址,但原来的指针指向的地址不变。 char *GetMemory(void) { char p[]="helloworld"; return p; } p是局部变量,在离开作用域后栈空间会被回收,结果不可预料。 void GetMemory2(char **p, int num) { *p = (char*)malloc(num); } p是指向传入的指针的指针,*p为传入的指针赋值,所以改变了传入指针的值,也可以写成这样: void GetMemory(char *&p) { p=(char*)malloc(100); } 效果一样 |