牛客网刷题知识汇总4
int *p[4] 由于[]的优先级比*高,所以此处相当于int *(p[4]),即指针数组,定义了4个指向int型的指针。
int (*p)[4],这是数组指针,指定义了一个指针,他指向了数组。
一个类有基类、内部有一个其他类的成员对象,构造函数的执行顺序是怎样的?
首先调用基类的构造函数,在派生类的构造函数体执行之前会调用成员
对象的构造函数来初始化成员对象,然后如果派生类的构造函数参数有
成员对象的参数,则在构造函数中对成员对象赋值,这样的成员对象构
造方式要分两部分,所以把成员对象放在初始化列表中效率要高一点,
最后再执行派生类的构造函数体。
先执行基类的(如果基类当中有虚基类,要先执行虚基类的,都是按照继承时的顺序依次执行),再执行成员对象的(声明的顺序),最后执行自己的。(切记都不是初始化列表的顺序)
在64位系统中,有如下类:
View Code
class C { public: char a; static char b; void *p; static int *c; virtual void func1(); virtual void func2(); };
那么sizeof(C)的数值是(24)
sizeof(类)计算的是类中存在栈中的变量的大小,而类中的b和*c都是static静态变量,存在全局区中,因此不在计算范围之内,于是只剩下char a,void *p和两个virtual虚函数,a是char类型,占用一个字节,p是指针,在64位系统的指针占用8个字节,而两个虚函数只需要一个虚函数表指针,也是八个字节,加上类中的对齐方式(char a对齐时后面补上7个字节),故答案为24.
在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是:
struct A { int a; short b; int c; char d; }; struct B { int a; short b; char c; int d; };
// 对齐原则:每一成员需对齐为后一成员类型的倍数 // 补齐原则:最终大小补齐为成员类型最大值的倍数 structA { inta; // 4 shortb; // (4) + 2 = 6 下一元素为 int,需对齐为 4 的倍数, 6 + (2) = 8 intc; // (8) + 4 = (12) chard; // (12) + 1 = 13, 需补齐为 4 的倍数,13 + (3) = 16 }; structB { inta; // 4 shortb; // (4) + 2 = 6,下一成员为 char 类型,不考虑对齐 charc; // (6) + 1 = 7,下一成员为 int 类型,需对其为 4 的倍数,7 + (1) = 8 intd; // (8) + 4 = 12,已是 4 的倍数 }
以下代码输出什么?
int a =1,b =32 ; printf("%d,%d",a<<b,1<<32); // 1,0
执行a<<b时,编译器会先将b与31进行and操作,以限制左移的次数小于等于31。b&31=0,则a<<b=1
执行1<<32时,编译器直接执行算术左移的操作。
来自 http:
//blog.csdn.net/hgl868/article/details/7058909
有如下类模板定义:()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
template<class T> class BigNumber{ long n; public: BigNumber(T i):n(i){} BigNumber operator+(BigNumber b) { return BigNumber(n+b.n); } };
已知b1,b2是BigNumber的两个对象,则下列表达式中错误的是(D)?A.3+3 B.b1+3 C.b1+b2 D.3+b1
+号被重载后相当于该类的一个成员函数了,出现该类对象(b1+)这种就是调用重载函数,+号后面的3或者b2就是参数,如果是3的话就会执行类型转化,将3变为BigNumber类型传给形参。至
于D选项的错误我个人理解为+号左右两边的类型不匹配
初始化列表的初始化顺序 与在列表中的顺序无关,由变量在类中定义的先后顺序决定
公有继承时基类中各成员属性保持不变,基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象只能访问基类中的public成员。
私有继承时基类中各成员属性均变为private,并且基类中private成员被隐藏。派生类的成员也只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。
保护继承时基类中各成员属性均变为protected,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。