c和c++高频面试题目

  1. static作用:

static:修饰的变量存储在静态区,局部变量和全局变量都可以修饰

static修饰全局变量/函数,只能在本文件内使用(限制了全局变量的作用域)

static修饰局部变量,延长了局部变量的生命周期,如果局部变量没有初始化,其值为0,如果初始化,只被初始化一次

2.C++与C语言的差异

C语言:面向过程的结构化程序设计语言, 中级语言

面向过程的西红柿炒蛋:按步骤一步一步的去做,才有可能得到最终的结果,注重的是过程,只有过程对了,才有好的结果!

C++语言:面向对象的编程语言

面向对象的西红柿炒蛋:点外卖,坐着等,不需要关注你怎么做出来!注重的是结果。

《1》.编程思想的不同:C++的面向对象的编程思想更接近于我们自然界的发展规律的!

C语言中的也有面向对象编程的影子:结构体—》只是简单的描述属性,并不能被一个学生描述的活灵活现的;缺少动态的内容;

C++:属性+行为整合。

《2》.C++是完全兼容C, 只要是合法的C语言程序在C++中也是合法的;

《3》.C++多了2个+,因为C++比C扩充了非常多的内容;不管是关键字、数据类型等都有扩充!

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

#ifdef __cplusplus

cout<<“c++";

#else

printf("c");

#endif

4.“引用”与指针的区别是什么?

指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;

而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。

5.引用与指针有什么区别?

1)引用必须被初始化,指针不必。

2) 引用初始化以后不能被改变,指针可以改变所指的对象。

3) 不存在指向空值的引用,但是存在指向空值的指针

6.有了malloc/free 为什么还要 new/delete ?

malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都可用于申请动态内存和释放内存。

对于非内部数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。

由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free。

因此C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符 delete。

注意new/delete 不是库函数。

7.const 符号常量

(1)const char *p

(2)char const *p

(3)char * const p

说明上面三种描述的区别;

(1) p是一个指向const char的指针,p是可以改变指向的,但是p指向的值是不能改变的;

(2) p指向的恰好是一个指向const的char的普通指针;

(3) p是一个指针,这个指针是指向char的const指针。

8.用C++写个程序,如何判断一个操作系统是16位还是32位的?

定义一个指针p,打印出sizeof(p),如果节后是4,则表示该操作系统是32位,打印结果是2,表示是16位。

9.面向对象的三个基本特征,并简单叙述

封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private, protected, public)

继承:广义的继承有三种实现形式:

实现继承(指使用基类的属性和方法而无需额外编码的能力)、

可视继承(子窗体使用父窗体的外观和实现代码)、

接口继承(仅使用属性和方法,实现滞后到子类实现)。

前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。

多态:是将父对象设置成为和一个或更多的与他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

10.重载(overload)、重写(override,有的书也叫做“覆盖”)、重定义(redefinition)的区别?

重载 同一名字空间 是指允许存在多个同名函数,而这些函数的参数表不同。

重定义/隐藏 不同名字空间 用于继承,派生类与基类的函数同名,屏蔽基类的函数

重写/覆盖 不同名字空间

用于继承,子类重新定义父类虚函数的方法

11.C++ 中 struct 和 class

总的来说,struct 更适合看成是一个数据结构的实现体,class 更适合看成是一个对象的实现体。

最本质的一个区别就是默认的访问控制

默认的继承访问权限。struct 是 public 的,class 是 private 的。

struct 作为数据结构的实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认的成员变量访问控制是 private 的。

12.虚函数、纯虚函数

  • 类里如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖(override),这样的话,编译器就可以使用后期绑定来达到多态了。纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。

  • 虚函数在子类里面可以不重写;但纯虚函数必须在子类实现才可以实例化子类。

  • 虚函数的类用于 “实作继承”,继承接口的同时也继承了父类的实现。纯虚函数关注的是接口的统一性,实现由子类完成。

  • 带纯虚函数的类叫抽象类,这种类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。抽象类被继承后,子类可以继续是抽象类,也可以是普通类。

  • 虚基类是虚继承中的基类,具体见下文虚继承。

13.虚继承

虚继承用于解决多继承条件下的菱形继承问题(浪费存储空间、存在二义性)。

底层实现原理与编译器相关,一般通过虚基类指针虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在拷贝,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承时,虚基类指针也会被继承。

实际上,vbptr 指的是虚基类表指针(virtual base table pointer),该指针指向了一个虚基类表(virtual table),虚表中记录了虚基类与本类的偏移地址;通过偏移地址,这样就找到了虚基类成员,而虚继承也不用像普通多继承那样维持着公共基类(虚基类)的两份同样的拷贝,节省了存储空间。

14.抽象类、接口类、聚合类

  • 抽象类:含有纯虚函数的类

  • 接口类:仅含有纯虚函数的抽象类

  • 聚合类:用户可以直接访问其成员,并且具有特殊的初始化语法形式。满足如下特点:

  • 所有成员都是 public

  • 没有定义任何构造函数

  • 没有类内初始化

  • 没有基类,也没有 virtual 函数

15.拷贝构造函数

什么时候会执行拷贝构造函数:用一个已经存在的对象去初始化一个正在创建的对象的时候会执行拷贝构造函数!

如果我们自己没有写,系统会帮我们生成一个默认的拷贝构造函数去执行(就是把已经存在对象的数据成员的值挨个赋值给正在创建的这个对象的数据成员);如果我们自己写了,系统就不会帮我们生成了!

16.什么时候进行深拷贝、什么时候进行浅拷贝

当在构造函数中有对指针类型的数据成员进行动态开空间的时候,要进行拷贝,就要进行深拷贝。深拷贝的构造函数要自己去写!因为系统给我们提供的拷贝构造是浅拷贝构造函数!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值