1. 引用必须在声明的时候就初始化!!
若要对常量进行引用,C++中的右值引用可以实现:int&& x=10;
2.下列选项中能够正确表示逻辑“异或”运算的是:(a||b)&&!(a&&b)
"异或运算"即:相同为0(a与b为0,0或1,1时结果为0),相异为1(a与b为0,1或1,0时结果为1)。
3.下面的代码段程序运行后的输出结果是:8,7,7,8
int main() {
int a = 7, b = 8, *p, *q, *r;
p = &a;
q = &b;
r = p;
p = q;
q = r;
printf("%d,%d,%d,%dn", *p, *q, a, b);
}
4.假设函数原型和变量说明如下,下面调用非法的是(B)
void f3(int(*p)[4]);
int a[4]={1,2,3,4},
int b[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
定义了一个函数,其参数为一个指向一维数组的指针。
对于一维数组:(定义:int a[4])
(1)一维数组名a是个地址,地址类型为:int *。
(2)一维数组名取地址&a是个地址,地址类型同:int (*p)[4], 也即&a指向含4个int元素的一维数组。
对于二维数组b[3][4],这个二维数组也可以可以看成一个含3个成员的一维数组,每一个成员含有4个int元素:
(1)b[0]是个一维数组名,也是个地址(为该一维数组首元素int b[0][0]的地址),地址类型为:int *。
(2)&b[0]是个地址(为整个一维数组的地址),地址类型同:int (*p)[4], 也即&b[0]指向含4个int元素的一维数组。
因此:
(3)b是个地址,地址类型同:int (*p)[4],也即b指向含4个int元素的一维数组
(4)&b是个地址,地址类型同:int (*p)[3][4],也即&b指向含3x4个int元素的2维数组
总结:
① 数组名,是指向它的第一个一级成员的指针(数组首元素地址)。
② 数组名取地址,是指向整个数组的指针。
5. (1)只能使用成员函数重载的运算符有:=、()、[]、->、new、delete。
(2)单目运算符最好重载为成员函数。
(3) 对于复合的赋值运算符如+=、-=、*=、/=、&=、!=、~=、%=、>>=、<<=建议重载为成员函数。
(4) 对于其它运算符,建议重载为友元函数(将函数定义为全局函数,在类中声明为友元friend即可)。
运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。重载运算符的函数一般格式如下:
函数类型 operator 运算符名称 (形参表列)
{
对运算符的重载处理
}
重载为类成员函数时参数个数应=原操作数个数(该运算符要求的的位数)-1(后置++、--除外)
重载为友元函数(全局函数)时参数个数=原操作数个数,且至少应该有一个内置类型的形参。
6.如何判断两个数二进制表达有多少位不同?
方法:任何一个数的二进制表达与1相与就可以知道其最后一位为0/1。
每次让这两个数与1相与(判断最后一位是否相同),再进行右移操作(无符号数在左边添0,有符号数在左边添符号位):一位一位比较。
int countBitDiff(int m, int n ) {
//一个二进制数和1相与,就可以知道这个二进制数的最后一位是1还是0
//右移一位=在左边添0(无符号数添0,有符号数添符号位)
int cnt=0;//二进制位有多少位不同
for(int i=0;i<32;i++)
{
if((m>>i&1)!=(n>>i&1)) cnt++; //右移i位,一位一位比较是否相同
}
return cnt;
}



