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

注:因为多继承会带来很多复杂问题,因此要慎用。

时间: 2024-07-31 10:18:54

C/C++笔试题整理的相关文章

嵌入式c笔试题(整理)

嵌入式c笔试题 (2012-03-24 22:36) 预处理器(Preprocessor)1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的

iO经典笔试题整理

iOS经典笔试题整理---2014年8月 1.回答person的retainCount值,并解释为什么 Person * per = [[Person alloc] init]; 此时person 的retainCount的值是1self.person = per; 在self.person 时,如果是assign,person的 retainCount的值不变,仍为1若是:retain person的retainCount的值加1,变为2 若是:copy person的retainCount值

Java工程师笔试题整理[校招篇]

隔着两个月即将开始校招了.你是不是也想借着这个机会崭露头角,拿到某些大厂的offer,赢取白富美.走上人生巅峰?当然如果你还没能打下Java基础,一定要先打好Java基础:如何一步一步的学Java - 学习编程 - 知乎专栏.然后再来看一下练习一下各大厂的面试笔试题目. 如果以下内容满足不了你,你还可以去看这篇: 2016校招编程题汇总 - 学习编程 - 知乎专栏 进入主要内容(主要内容整理来自牛客网:牛客网)(以下内容按照各大公司进行划分,对每一公司按照年份进行划分,如果想想下载以下内容,可以

sql笔试题整理

题记:一直在写各种sql查询语句,最长的有一百多行,自信什么需求都可以接,可......,想了想,可能一直在固定的场景下写,平时也是以满足实际需求为目的,竟不知道应试的题都是怎么出的,又应该怎么做.遂找来一些笔试题来练习. 有四张表如下格式存储: --1.查询"001"课程比"002"课程成绩高的所有学生的学号: select t1.s# from (select s#,c#,score from sc where c# = 001) t1 inner join (

2018 CVTE 前端校招笔试题整理

昨天晚上(7.20)做了CVTE的前端笔试,总共三十道题,28道多选题,2道编程题 .做完了之后觉得自己基础还是不够扎实,故在此整理出答案,让自己能从中得到收获,同时给日后的同学一些参考. 首先说一下两道肥肠简单的编程题: 1.请实现这样一个函数,输入参数为一个长度为2n的整数数组,以两个整数一组的方式将数据分组,并使每组数组最小值相加为最大,输出这个最大值. 输入[1,4,3, 2],输出为4输入[1,5,7,9, 4, 12],输出为15 思路:把数组按大小排序然后相邻两项分为一组,取每组较

java笔试题整理

exit()是system类的方法,如system.exit(); 如果某个方法是静态的,它的行为就不具有多态性. 类后面没有括号,方法必须要有返回值.如果没有返回值,要写void 构造函数不具有多态性 普通的类方法是可以和类同名的,和构造方法唯一的区分就是构造方法没有返回值. 启动一个线程是用start().单独调用run方法就和调用普通的方法一样,失去了线程的特性. volatile()不能保证线程安全,为什么 i为int能表示的最大整数,i+1就变成了负数. 0.6332的数据类型是dou

腾讯前端笔试题整理

1.js中“5”+4=? 答案:“54” 2.js中void(0)=? 答案:undefined 评:这个在a的href 中可以使用javascript:void(0); 如果使用href=”#”,包含了一个位置信息.默认的锚是#top,也就是网页的上端,当连续快速点击此链接时会导致浏览器巨慢甚至崩溃.javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. javascript:;好些,javascript:void(0);据说某些情况下有浏览器兼容bug.(此点

笔试题整理 第二题

班上同学聚餐吃火锅,一锅煮了m(1<=m<=50)个鱼丸和n(1<=n<=50)个肉丸,现欲将m个鱼丸和n个肉丸分到k(1<=k<=50)个碗中,允许有空碗,鱼丸和肉丸不允许混在同一个碗里,问共有多少种装法? 假设碗足够大,能够装50个鱼丸和50个肉丸,并且碗没有任何区别.因此当m等于n等于1,k等于3时,有一种装法,因为110,101,011被看做同一种方法. #include <iostream> #include <vector> #inc

笔试题整理 第三题

#include <iostream> #include <vector> using namespace std; bool flag_fir = true; int count_sec(vector<vector<int>> all_sec,vector<int> cur_set) { int len = cur_set.size(); int num = 0; if (len == 0) return 1; else if (flag_fi