首页 > 代码库 > C/C++笔试题整理
C/C++笔试题整理
1. C的结构体和C++结构体的区别
(1)C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。
(2)C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。
(3)C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。
以上都是表面的区别,实际区别就是面向过程和面向对象编程思路的区别:
C的结构体只是把数据变量给包裹起来了,并不涉及算法。
而C++是把数据变量及对这些数据变量的相关算法给封装起来,并且给对这些数据和类不同的访问权限。
C语言中是没有类的概念的,但是C语言可以通过结构体内创建函数指针实现面向对象思想。
2. 如何在类中定义常量成员并为其初始化?解答:只能在初始化列表里对const成员初始化,像下面这样:
class CBook {public: const double m_price; CBook() :m_price(8.8) { }};
3. 在定义类的成员函数时使用mutable关键字的作用是什么?解答:当需要在const方法中修改对象的数据成员时,可以在数据成员前使用mutable关键字,防止出现编译出错。例子如下:
class CBook {public: mutable double m_price; // 如果不加就会出错 CBook(double price) :m_price(price) { } double getPrice() const; // 定义const方法};double CBook::getPrice() const { m_price = 9.8; return m_price;}
4. C++中的explicit关键字有何作用?
禁止将构造函数作为转换函数,即禁止构造函数自动进行隐式类型转换。 例如CBook中只有一个参数m_price,在构建对象时可以使用CBook c = 9.8这样的隐式转换,使用explicit防止这种转换发生。
5. 构造函数调用类的另一个构造函数问题:
在C++中,如果确定了某一个构造函数的创建过程,在该构造函数中如果调用了其它重载的构造函数,
它初始化的并不是指定的这个this了。
例子说明如下:
class CBook {public: double m_price; CBook() { CBook(8.8); } CBook(double price) : m_price(price) { }};int main() { CBook c; cout << c.m_price << endl; // 此时并不会输出理想中的8.8}
6. 虚函数原理考点,例如下面程序的输出是什么?
class A {public: virtual void funa(); virtual void funb(); void func(); static void fund(); static int si;private: int i; char c;};
问:sizeof(A) = ?
解答:
关于类占用的内存空间,有以下几点需要注意:
(1)如果类中含有虚函数,则编译器需要为类构建虚函数表,类中需要存储一个指针指向这个虚函数表的首地址,注意不管有几个虚函数,都只建立一张表,所有的虚函数地址都存在这张表里,类中只需要一个指针指向虚函数表首地址即可。
(2)类中的静态成员是被类所有实例所共享的,它不计入sizeof计算的空间
(3)类中的普通函数或静态普通函数都存储在栈中,不计入sizeof计算的空间
(4)类成员采用字节对齐的方式分配空间
答案:12(32位系统)或16(64位系统)
7. 虚继承的作用是什么?
在多继承中,子类可能同时拥有多个父类,如果这些父类还有相同的父类(祖先类),那么在子类中就会有多份祖先类。例如,类B和类C都继承与类A,如果类D派生于B和C,那么类D中就会有两份A。为了防止在多继承中子类存在重复的父类情况,可以在父类继承时使用虚函数,即在类B和类C继承类A时使用virtual关键字,例如:
class B : virtual public A
class C : virtual public A
注:因为多继承会带来很多复杂问题,因此要慎用。
C/C++笔试题整理