C++笔试题

一、引用

1.将“引用”作为函数参数有哪些特点?

(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。

(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

2.为什么拷贝构造函数的形参必须是引用类型?

假设拷贝构造函数的形参为值传递,则编译器会调用拷贝构造函数将实参存储到一个副本中,这样就进入了一个死循环

3.什么时候用常引用(const &)

如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。如果是非const引用,需要注意一下规范,请看下面code

那么在什么情况下会产生临时变量呢,两种情况:1.形参与实参的类型不同 2.不是左值

4.函数的返回值类型为引用

这种情况下,需要注意3点:first,不能返回局部变量的引用;second,不能返回函数内部new分配的内存的引用,因为这样对此内存的delete会比较麻烦,容易造成内存泄露;third,在cout和cin中也使用到了引用,它们本质上是iostream类的对象,它有一个成员运算符函数operator<<,重载这个运算符函数时返回的是这个对象的引用,如此cout<<a<<b<<endl这种写法也容易理解了。

5.引用与多态的关系

引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。

 

二、为什么尽量使用初始化列表,而不要在构造函数里赋值

原因有二:first,如果数据成员为const和引用时,只能用初始化列表;second,前者效率更高,因为前者只用调用一次拷贝构造函数,而后者需要调用一次缺省构造函数和一次赋值函数。

三、C++中四种类型转换

const_cast:去掉const、volatile属性

static_cast:

类似于C风格的强制转换。无条件转换,静态类型转换。用于:
1. 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast)
2. 基本数据类型转换。enum, struct, int, char, float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。
3. 把空指针转换成目标类型的空指针。
4. 把任何类型的表达式转换成void类型。
5. static_cast不能去掉类型的const、volitale属性(用const_cast)。

dynamic_cast:

有条件转换,动态类型转换,运行时类型安全检查(转换失败返回NULL):
1. 安全的基类和子类之间转换。
2. 必须要有虚函数。
3. 相同基类不同子类之间的交叉转换。但结果是NULL。

reinterpret_cast:

仅仅重新解释类型,但没有进行二进制的转换:
1. 转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。
2. 在比特位级别上进行转换。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指针。
3. 最普通的用途就是在函数指针类型之间进行转换。
4. 很难保证移植性。

四、如何打印出当前源文件的文件名以及源文件的当前行号?

cout<<__FILE__;cout<<__LINE__;

五、main函数执行前后究竟编译器还做了什么?

前:初始化系统相关资源(crt:C runtime library,初始化全局和静态变量等),这也就可以解释在main函数中一开始就可以使用printf等函数了。

后:应该就是释放系统资源和全局变量这些东西了

如果想让一个函数在main函数之后执行,可以用_onexit 或者__attribute__

六、如何判断一段程序是由C 编译程序还是由C++编译程序编译的?

#ifdef __cplusplus  
cout<<"c++";
#else
cout<<"c";
#endif

七、类的构造和析构综合题

ps:类的值传递是调用类的拷贝构造函数,析构顺序是与构造顺序相反的

八、友元类与继承

http://blog.163.com/zhanghuanbin_good/blog/static/163275094201011835312611/

九、深入分析C++对象模型

http://blog.csdn.net/wfwd/article/details/763797

posted @ 2012-03-22 22:01  南风又起  阅读(256)  评论(0编辑  收藏  举报