【笔试题】整理一

来源:互联网 发布:做组织结构图软件 编辑:程序博客网 时间:2024/05/22 06:47

1.

struct mybitfields { unsigned short a : 4; unsigned short b : 5; unsigned short c : 7; }testvoid main(void)  { int i; test.a=2; test.b=3; test.c=0;i=*((short *)&test); printf("%d/n",i); }

知识点:位域

使用位域的主要目的是压缩存储,其大致规则为:
1)如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字
段将紧邻前一个字段存储,直到不能容纳为止;
2)如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字
段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3)如果相邻的位域字段的类型不同,则各编译器的具体实现有差异;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍

分配的成员a-4位的空间, b-5位,c-7位,一共是16位,正好两个字节。下面画一个简单的示意:
变量名:位数
test    :15 14 13 12 11 10 9 |8 7 6 5 4 |3 2 1 0
test.a :                                                 |0 0 1 0
test.b :                                 |0 0 0 1 1 |
test.c :           0 0 0 0 0 0 0 |

在执行i=*((short *)&test);时,取从地址&test开始两个字节(short占两个字节)的内容转化为short型数据,即为0x0032,再转为int型为0x00000032,即50。输出的结果就是50。

注意:关于位结构体在内存中的存储问题
在C结构体中,如果一个位域A在另一个位域B之前定义,那么位域A将存储在比B小的位地址中。
如果一个位域有多个位时,各个位的排列顺序通常是按CPU的端模式(Endianess)来进行的,即在大端模式(bigendian)下,高有效位在低位地址,小端模式则相反。

2.。In C++, what does "explicit" mean? what does "protected" mean?

C++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,在某些情况下,我们要求类的使用者必须显示调用类的构造函数时就需要使用explicit,反之默认类型转换可能会造成无法预期的问题。

class Test1{public:Test1(int n) { num = n; } //普通构造函数private:int num;};class Test2{public:explicit Test2(int n) { num = n; } //explicit(显式)构造函数private:int num;};int main(){Test1 t1 = 12; //隐式调用其构造函数, 成功Test2 t2 = 12; //编译错误,不能隐式调用其构造函数Test2 t3(12); //显式调用成功return 0;}
Test1的构造函数带一个int型的参数,t1隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此t2出现编译错误。
普通构造函数能够被隐式调用。而explicit构造函数只能被显示调用。

 3. 在C++的一个类中声明一个static成员变量有没有用?

    在C++类的成员变量被声明为static(称为静态成员变量),意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,也就是说不管创建多少对象,static修饰的变量只占有一块内存。其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。static是加了访问控制的全局变量,不被继承。

例如:可以用于保存该类被实例化的次数

//.hclass Test{public:    Test(); //普通构造函数private:    static int times;public:    static void TimesPlus();    static int GetTimes();};//.cppint Test::times = 0; //注意static成员变量的初始化Test::Test(){    TimesPlus();}int Test::GetTimes(){    return times;}void Test::TimesPlus(){    times++;}


0 0
原创粉丝点击