牛客网刷题知识汇总4

int *p[4] 由于[]的优先级比*高,所以此处相当于int *(p[4]),即指针数组,定义了4个指向int型的指针。

int (*p)[4],这是数组指针,指定义了一个指针,他指向了数组。

 

一个类有基类、内部有一个其他类的成员对象,构造函数的执行顺序是怎样的? 

首先调用基类的构造函数,在派生类的构造函数体执行之前会调用成员对象的构造函数来初始化成员对象,然后如果派生类的构造函数参数有成员对象的参数,则在构造函数中对成员对象赋值,这样的成员对象构造方式要分两部分,所以把成员对象放在初始化列表中效率要高一点,最后再执行派生类的构造函数体。
先执行基类的(如果基类当中有虚基类,要先执行虚基类的,都是按照继承时的顺序依次执行),再执行成员对象的(声明的顺序),最后执行自己的。(切记都不是初始化列表的顺序)
 
在64位系统中,有如下类:
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
 
有如下类模板定义:()
template<class T> class BigNumber{ 
    long n; 
public: 
    BigNumber(T i):n(i){}
    BigNumber operator+(BigNumber b)
    { 
        return BigNumber(n+b.n); 
    } 
};
View Code
已知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成员;派生类的对象不能访问基类中的任何的成员。
 
posted @ 2017-02-25 21:47  Tsunami_lj  阅读(280)  评论(0编辑  收藏  举报