设为首页 加入收藏

TOP

C++笔试面试常考知识点汇总(三)(一)
2016-12-06 20:24:44 】 浏览:702
Tags:笔试 面试 常考 知识点 汇总

101:对引用类型执行sizeof运算得到被引用对象所占空间的大小;对数组执行sizeof得到整个数组所占空间的大小。sizeof运算不会把数组转换成指针处理;对string对象或者vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用多少空间。

void main()
{
    vector
  
    vec(10,0);
    cout<
   
    

102:

int *d = new int[10];
cout<

d是我们常说的动态数组,但是他实质上还是一个指针,所以sizeof(d)的值是4/8。

103:sizeof多维数组

double* (*a)[3][6];//类型为double*;a是一个指针,*a表示一个数组指针,指向一个2维数组
cout<

a是一个很奇怪的定义,他表示一个指向 double*[3][6]类型数组的指针,此3×6数组中存储的是指向double的指针。既然是指针,所以sizeof(a)就是4 既然a是指向double*[3][6]类型的指针: *a就表示一个double*[3][6]的多维数组类型,因此sizeof(*a)=3*6*sizeof(double)=72。 **a表示一个double*[6]类型的数组,所以sizeof(**a)=6*sizeof(double*)=24。 ***a就表示其中的第一个元素,也就是double*了,所以sizeof(***a)=4。 ****a,就是一个double了,所以sizeof(****a)=sizeof(double)=8

104:union数据类型占用的空间

union u //8对齐
{
    double a;
    int b;
};

union u2 //4对齐
{
   char a[13];
   int b;
};

union u3 //1对齐
{
   char a[13];
   char b;
};
cout<

都知道union的大小取决于它所有的成员中,占用空间最大的一个成员的大小。所以对于u来说,大小就是最大的double类型成员a了,所以sizeof(u)=sizeof(double)=8。但是对于u2和u3,最大的空间都是char[13]类型的数组,为什么u3的大小是13,而u2是16呢?关键在于u2中的成员int b。由于int类型成员的存在,使u2的对齐方式变成4(4字节对齐),也就是说,u2的大小必须在4的对界上,所以占用的空间变成了16(最接近13的对界)。 结论:复合数据类型,如union,struct,class的对齐方式为成员中对齐方式最大的成员的对齐方式。

105:内存对齐的原则? 内存对齐的好处是可以提高CPU访问内存的效率。 以结构体为例,内存对齐的原则如下: 1:结构体变量的首地址能被其他最宽基本类型成员的大小所整除。 2:结构体所占用的总的内存必须是其中(最大数据类型所占内存和按照#pragma pack(编译器设定的内存对齐数目)指定的数值中)较小的那个值的整数倍。 3:结构体中某个数据内存的起始地址与结构体起始地址之间的差值必须是(该数据所占内存和按照#pragma pack指定的数值中)较小的那个值的整数倍。 为了满足以上条件,常常在数据之间和最后一个数据之后补偿空间以使得内存对齐。

106:sizeof带static成员的类时

class A 
{
     private :
          int value;
          double a;
          static int CST;
     public:
};
int main()
{   
    cout << sizeof(A) << endl; //16
}

因为static成员是分配在全局区为类的所有对象共享(VC编译器可能为了方便将其放入文字常量表), sizeof时不应该计入static成员。

107:程序运行时间 clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下: clock_t clock(void) ; clock_t为long类型; CLOCKS_PER_SEC是标准c的time.h头函数中宏定义的一个常数,用于将clock()函数的结果转化为以秒为单位的量,但是这个量的具体值是与操作系统相关的。VC++6.0中time.h下宏定义的常量,其值为1000。 具体使用可参看下例:

#include
#include
usingnamespacestd;

int main()
{
long n=0;
clock_tstart,finish;
start=clock();
while(n<1000000)
n++;
finish=clock();
cout<

这是一个求时间差的程序,那么为什么要除以CLOCKS_PER_SEC呢?这是因为clock()是以毫秒为单位,要正确输出时间差需要把它换成秒,因此需要除以CLOCKS_PER_SEC。

108:C++的多态性? 多态性可以简单地概括为“一个接口,多种方法”。 分为编译时多态性和运行时多态性。 编译时多态性:通过重载函数实现 。重载允许有多个同名的函数,而这些函数的参数列表不同。编译器会根据实参类型来选定相应的函数。 运行时多态性:通过虚函数实现。虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者重写。

109:动态绑定是如何实现的? 当基类的指针或者引用指向一个派生类的对象时,在调用相应的虚函数时,会发生动态绑定。直到运行时才能够确定调用的是哪个版本的虚函数,判断的依据是引用或指针所绑定的对象的真实类型。

110::类型转换有哪些? static_cast:任何具有明确定义的类型转换,只要不包含const,都可以使用。如: static_cast (int);//将一个int型数据转换为double const_cast:用于去掉指针或引用的const属性如:

const int i=10;
int *k=const_cast
   
    (&i); *k=5;//去除指针的const属性后,可以从新对其赋值
   

dynamic_cast:支持父类指针(或引用)到子类指针(或引用)之间的多态类型转换,并根据父类指针是否真的转换到子类做相应的处理。对于指针,若cast成功,返回指向子类对象的指针,否则返回NULL;对于引用,若cast成功,返回指向子类对象的引用,否则抛出一个异常。 注意:dynamic_cast在将父类cast到子类时,父类必须要有虚函数,否则会报错。 dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的; 在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

reinterpret_cast:一个类型的指针转换为其他类型的指针。 允许将任何指针类型转换为其它的指针类型;听起来很强大,但是也很不靠谱。它主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针,在实际开发中,先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原来的指针值。

111:操作符重载(+操作符),具体如何去定义? 对于系统的所有操作符,一般

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++中Unicode与UTF-8编码互转 下一篇C++版本归并排序

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目