【C/C++,QT】面试大全三


        1、结构与联合有和区别?

        (1). 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)。 

        (2). 对于联合的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。


        2、试写出程序结果:

#
#
int  a=4;
int  &f(int  x)
{    
    a=a+x;
    return  a;
}
int main(void)
{   
    int   t=5;
    cout<<f(t)<<endl;	//a = 9
    f(t)=20;            //a = 20
    cout<<f(t)<<endl;   //t = 5,a = 20  a = 25
    t=f(t);             //a = 30 t = 30
    cout<<f(t)<<endl;   //t = 60
}

 

        3、重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?

        常考的题目!!!

        从定义上来说:

        重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

        重写:是指子类重新定义父类虚函数的方法。

        从实现原理上来说:

        重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。

        例如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译器就绑定了(早绑定),因此,重载和多态无关!

        重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。


        4、有哪几种情况只能用intialization list 而不能用assignment?

        答案:当类中含有const、reference 成员变量;基类的构造函数都需要初始化表。


        5、C++是不是类型安全的?

        答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。


上一篇 下一篇