C/C++面试题基础篇

基本数据类型

1.  C++中那几种数据类型

整数型,浮点型,void

2. 整型有哪几种形式,各种形式有什么区别

证书,字符,布尔值,整型根据修饰符细分为13种形式

3. C++中有哪些常量

整型常量,浮点型常量,字符常量,字符串常量,转义符常量,地址常量

4. 常量与变量有哪些区别

常量不可修改,变量可修改

常量必须初始化,变量不用

常量不可寻址,它的地址不允许赋给指针,变量可以,常量有相对较高的编译执行效率

操作符

1. 操作符有哪些分类

按照功能区分:算术操作符,关系操作符,逻辑操作符,位操作符,赋值操作符,自增自减操作符,箭头操作符,条件操作符,sizeof操作符,逗号操作符

按照操作数区分:一元操作符,二元操作符,三元操作符

2. 操作符优先级对运算的结果有什么影响

优先级决定了运算顺序,不同的优先级的运算符不同的使用会影响表达式

3. 逻辑操作与其他操作的关系

逻辑操作只返回true或者false这两种值,它们可以用来条件判断,逻辑操作符不会改变被操作的数值

4. 自增自减操作后和操作前有什么区别

自增自减操作的优先级大于赋值运算符,而后自增自减操作的优先级小于赋值运算符,后自增自减操作后表达式的值不会发生改变

5. 指针自增自减有什么不同

自增自减是修改变量的值,指针的自增自减是修改指针的指向地址

变量

1. 什么是左值和右值

变量是左值,可以出现在赋值语句的左边,数字字面值是右值,不能被赋值

2. 什么是变量

变量是指在程序运行过程中可以发生变化的量,变量是在电脑内存中可以修改的,存在值得命名空间

3. 变量初有哪几种初始化

变量初始化是指创建变量并且给它赋初值,而赋值对象则是擦除对象的当前值并且用新值代替,其中直接初始化的语法更加灵活,而且执行效率更高

直接初始化,复制初始化

4. 变量默认初始化有什么规则

系统有时候会自动帮编程者初始化未初始化的变量。使用未初始化的变量是常见的程序出错,但通常也是很难以发现的错误,有时候会导致编程者在程序运行时发生的问题原因上出现判断错误。所以建议每个内置类型的对象都要初始化,虽然这样并不是完全必须的,但是会让程序容易和安全

5. 什么是变量的声明和定义

C++程序通常由许多文件组成,未了让多个文件访问相同的变量,C++区分了声明和定义。定义和声明有相同的时候,但声明的主要目的是表明变量的类型和名称,而定义的主要目的是为变量分配存储空间

6. C++中有哪几种作用域

作用域是程序的一段区域,作用域用于区别变量名的不同有效范围,分为全局作用域和局部作用域,语句作用域。一个变量名可以和不同作用域中的不同实体相关联

7. 局部变量与嵌套的作用域

局部变量是具有局部作用域的变量。在C++中,作用域是可以嵌套的

8. 变量有哪几种存储类型

自动类型变量(auto

静态类型变量(static

寄存器类型变量(register

外部类型变量(extern

引用

1. 什么是引用

引用是对象的另一个名字,在实际应用中,引用主要用做函数的形式参数来使

2. 如何使用const引用与非const引用

Const引用可以读取但是不可修改引用对象,任何const引用进行赋值都是不合法的,它适用于指向const引用对象的引用,而非const的引用不适用与指向const引用对象的引用,可以被修改引用和被引用对象的值

CC++的联系

1. cc++有什么区别

C语言是结构化语言它是面向过程。c语言编程考虑的是实现过程,c++是面向对象的,c++编程考虑的是整个程序模型

 编程规范

1. 什么是匈牙利命名法

匈牙利命名法是一种编程时的命名规范。匈牙利命名法的主要思想是在变量和函数名中加入前缀增进人们对程序的理解

2. 变量有什么命名规则

变量名最重要的就是 保持风格一致。变量名由字母,数字和下划线组成并且必须以字母或者下划线开头,变量名不可以与保留关键字和标准库冲突

流程控制

条件语句

1. 条件语句有哪几种形式

Ifif.......else, if......else if......if

2. 条件语句如何嵌套,如何匹配else子句

语句可以在不同的执行语句作用域内进行嵌套,else子句通过{}划分作用域来实现匹配

循环语句

1. for循环语句计算顺序是什么

For语句执行顺序是从左至右执行循环条件,如果循环条件的判断语句为true,则在循环条件语句执行后继续执行一次循环执行语句,然后再回到循环条件语句,如果循环条件语句判断条件为false,则停止循环

 

2. While循环和do-while有什么区别

While循环与do-while循环的主要区别在于,如果循环条件语句为falsewhile语句不会 执行循环而do-while保证循环体执行一次

 

3. 典型循环语句

For循环语句遍历多次,dodo-while循环语句,判断并且根据状态执行

 

4. Break语句与continue语句有什么区别

Continue语句只能出现在循环语句中,而break语句可以出现在switch语句,continue语句不会退出循环,只会终止当次执行循环体并且进入下一次循环体的执行,break语句会退出循环

 

Switch语句

1. switch语句的执行顺序是什么

如果表达式与其中一个case标号的值匹配,则程序将从该标号后面的第一个语句开始执行各个语句,直到switch结束或遇到break语句为止。如果没有发现匹配的case标号,则存在default语句时执行default语句,否则程序从switch语句后面的第一条语句继续 执行

 

2. 如何在switch语句内部定义变量

switch结构中可以在最后一个case标号或者default标号后面定义变量,或者引入块语句来定义变量

3. 不能做switch()的参数类型是

C/C++中: 
支持byte,char,short,int,long,bool,整数类型和枚举类型。 
不支持float,double,string

 

递归

1. 什么是递归

一个过程或者函数直接或者间接调用自己本身,这种过程或者函数叫递归过程或者递归函数

 

2. 汉诺塔问题

汉诺塔问题是程序中经典递归问题,它在说明递归算法是有不可代替的重要性。它可以形象完整的解释递归算法的调用。汉诺塔问题也可以用非递归算法来解决

输入输出

输入流与输出流

1. 什么是标准输入输出流

标准输入是从标准输入设备(键盘)流向程序的数据。标准输出是流向标准输出设备(显示器)的数据

 

2. 如何重载输入输出

重载在相同的范围中为一个给定函数名称提供了多种定义。委托编译器依据调用该函数的参量选择合适的函数或运算符的版本。重载可以为输入输出

 

文件输入/输出

1. 如何读取一个文件

c++中,读取文件使用iostream头文件内的相关法。Iostreamfstram的基类

 

2. 文件输入和输出有哪几种方式

C++定义了ifstreamofstreamfstream三种类型以用来支持文件输入输出

 

异常与错误

1. 什么是异常

异常就是程序运行时出现的不正常,它可能会导致系统无法正常运行甚至停止运行等严重问题,编程者需要实现好的异常处理来保证程序的稳定性

 

2. 如何抛出和捕捉异常

C++中,系统通过try块和异常处理构成了异常机制;其中通过catch语句来捕捉运行时的异常,并且执行异常处理,通过throw语句可以抛出

 

预处理以及内存管理

宏定义

1. 宏定义和操作符有什么区别

宏定义是C++的预处理命令之一,它是一个替换操作符,不做计算机和表达式求解,不占用内存和编译时间

2. 宏定义如何展开

宏展开是用宏定义时设计的宏体去代替宏指令名,并且用实际参数一一取代形式参数

 

Include的使用

1.   Include有哪几种使用方式?有什么区别?

Include有两种使用方式,#include<>#include””,其中#include<>是使用标准头文件,#include””是使用自定义头文件

 

2. 包含头文件时如何查找头文件

标注头文件在系统文件目录下查找。用户自定义文件会依次在用户目录的C++目录安装目录和系统文件中查找

 

内存分配

1. c++中各数据类型的长度

数据

含义

最小存储空间

bool

布尔值

4bit

char

字符

8bit

Wchar_t

Wide character

16bit

short

段整型

16bit

int

整型

16bit

long

长整型

32bit

float

单精度浮点

6significant digits

double

双精度浮点

10significant digits

Long double

长双精度浮点

10 significant digits

 

2. 如何分配和释放存储空间

c++中,使用newdelete 来分配和释放空间

 

虚函数与纯虚函数

1. 虚函数与纯虚函数的区别

纯虚函数是虚函数的一个子集

 

2. 如何使用纯虚函数

纯虚函数用来定义没有意义的实现,用于抽象的中需要交给派生类的具体实现方法

 

指针

指针概述

1. 什么是指针

指针是用来存储内存地址的变量,它指向单个对象的地址,除了void指针类型以外,指针的数据类型与所指向地址的变量数据类型必须保持一致

                                                   

2. 如何初始化指针并对其赋值

指针的初始化就是给指针赋值,&符合可以用来获取内存地址,并且赋值给指针变量

指针变量的初始化和赋值都可以通过运算符=”来实现

 

3. 是否可以确定指针指向一个对象

指针用于指向对象,一个指针指向一个对象的内存地址

 

4. 如何使用指针操作数组

c/c++中,指针对于数组的操作是通过数组的地址,通常是第一个数的地址赋值给指针来进行操作的。指针可以操作一维数组和多维数组

 

5. Const对象和指针有什么区别

Const指针的值不可改变,但是可能可以使用该指针修改它所指向对象的值,指针所指向对象的值能否修改完全取决于该对象的类型,而const变量的指针不可以修改所指向的const变量的值,但是自身可以被重新赋值

 

6. 数组指针和指针的区别

数组指针是一个指针变量,它指向一个数组。而指针数组只是一个包含指针元素的数组,它的元素可以指向相同类型的不同对象

 

 

函数指针

1. 什么是函数指针,如何使用函数指针

函数指针就是指向函数的存储空间地址的指针,可以对函数进行赋值并且通过函数指针来调用函数

 

2. 指针函数和函数指针有什么区别

函数指针是一个指向函数的指针。它的本质是一个指针,而指针只是说明他是一个返回值为指针的函数,它本质是一个函数

 

This指针

1. 什么 this指针

在调用成员函数时,编译器会隐含地插入一个参数,这个参数就是this指针。This指针指指针向当前对象本身,表示当前对象的地址

 

2. 何时使用this指针

当对一个对象调用成员函数时,编译程序先将对象的地址赋值给this指针,然后调用成员函数,每次成员函数存储数据成员时,由隐含作用this指针,而通常不去显示使用this指针来引用数据成员。同样也可以使用*this来标识使用该成员函数对象

 

引用与值传递

1. 什么是值传递

值传递将要传递的值作为一个副本传递,在函数调用时,实参把它的值传递给对应的形参,方法执行中形参的改变不影响实参,实参的值不会发生改变

 

2. 引用和值传递的区别

值传递的是一个值的副本。函数对形参的操作不会影响实参的值,而引用传递的引用对象的内存的内存地址,函数对形参的操作会影响实参的值,实参的值将会随着形参值的更改而同样进行更改

 

3. 指针和引用有什么区别

1)指针是一个实体,而引用 只是一个别名

2)引用时无需解引用(*),指针需要解引用

3)引用只能在定义时被初始化一次,之后不可变,指针可变

4)引用没有const,指针有const

5)引用不能为空,指针可以

6)Sizeof引用所得到的是指向变量对象的大小,而sizeof指针得到的是指指针本身(所指向的变量或对象的地址)的大小

7)指针和引用的自增运算不一样

8)在内存分配上,程序为指针变量分配内存区域,而引用不需要分配内存区域

 

 

 

面向对象与类

面相对象的基本知识

1. 面向对象与面向过程的区别

面向过程是一种以过程为中心的思想编程,以算法进行驱动。面向对象是一种以对象为中心的编程思想,以消息进行驱动。面向过程编程语言的组成为:程序=算法+数据,面向对象编程语言的组成为:程序=对象+消息

 

2. 面向对象的特征是什么

面向对象的三个要素为:封装,继承,多态。面向对象中所有的对象都可以归属为一个类

 

1. 类和结构有什么区别

公有(public):成员可以在类外访问

私有(private):成员只能被该类的成员函数访问

保护(protected):成员只能被该类的成员函数或派生类的成员函数访问

数据成员,它们指定了该类对象的内部表示

成员函数,他们指定了该类的操作

 

2. 抽象类以及它的用处

包含纯虚函数的类成为抽象类。抽象类把有共同属性或方法的对象成一个类。

 

类成员

1. 成员变量有哪些访问方式

成员变量根据访问权限有privateprotectpublic3种方式

 

2. 成员变量有哪些访问控制方式

c/c++中,是通过声明privateprotectpublic三种访问权限来对成员变量进行访问控制的。

 

3. 如何访问静态成员

静态成员可以独立访问空间,不需要创建类实例,它不能用实例来进行调用。类的静态方法只能访问类的静态成员

 

多态

1. 什么是多态,多态的作用

多态是面向对象编程的核心概念之一,多态技术一允许将父类设置和它的

 

2. c++中如何实现多态

多态有动态多态,静态多态,函数多态和宏多态。编程者常说多态是动态多态,它是基于继承机制和虚函数来实现

 

继承

继承

1. 派生类与积累的转换

派生类总是可以转化为基类的引用类型。基类转化为派生类需要在确定安全的情况下,

使用强制转换来进行

 

2. 什么是虚成员,有什么作用

(虚函数是用于面向对象中实现多态)

虚函数的作用是实现动态联编,当程序发现虚函数名字前的关键字virtual后,会自动将其作为动态联编,即在程序运行时动态的选择合适的成员函数

 

3. 构造函数与析构函数的调用时机

构造函数和析构函数的调用是自动进行的。建立对象时会调用构造函数,而消耗对象时调用析构函数

 

访问控制

1. 有哪几种继承方式

继承的方式分为公有继承(public),保护继承(protected)和私有继承

 

2. 继承时访问级别如何变化

c++中有publicprotectprivate等三种继承访问级别。子类继承的时候,通过声明为protect或者private可以降低父类的访问级别。

 

继承时类的作用域

1. 什么时候发生函数覆盖

覆盖在继承时派生类对于抽象类或者接口声明的方法具体实现时使用

 

2. 如何访问基类的成员

派生类中的成员函数可以直接访问基类中的publicprotected的成员,但不能访问private成员。派生类的对象只能访问基类的public成员

 

拷贝构造函数

1. 什么是深拷贝与浅拷贝

如果一个类拥有资源,当这个类的对象发生复制过程的时候,这个过程就可以叫做深拷贝,如果对象在资源但在复制过程中并未复制资源就是浅拷贝

 

2. 什么是拷贝构造函数

三种情况下会使用拷贝构造函数

1. 一个对象以值传递的方式传入函数体

2. 一个对象以值传递的方式从函数返回

3. 一个对策需通过另外一个对象进行初始化

 

类型转换构造函数

1. 类型转换有哪些分类

c++中,类型转换有隐式转换和显示转换两种

 

2. 什么是类型转换构造函数

一个类的构造函数只有一个参数,而且这个参数不是该类的类型而是其他类型,这个构造函数就被称为类型转换构造函数。转换构造函数可以用来处理不同的数据值

 

函数

函数的定义

1. 什么是函数

函数是有函数名,参数,返回值类型以及一组包含操作语句块组成。函数可以支持重载,程序就是由函数组成

 

2. 形参与实参有什么区别

形参是函数定义或者声明时的函数形式参数,形参表制定了函数参数的个数和根据类型,实参是函数调用时传递给函数的参数,传递时要与形参一一对应

 

3. C++支持参数个数不确定的函数么

C++可以通过隐藏参数机制来支持参数个数的不确定函数

 

4. 什么是内联函数

在类声明的内部声明或定义的成员函数叫做内联函数(inline

 

函数参数的传递

1. 引用形参和非引用形参有什么区别

引用形参是将参数用参数变量的地址来进行传递,可以通过函数对形参的调用来改变实参的值

 

2. 使用引用形参有什么问题

调用非const引用的形参,实参必须不是const类型,而且实参和形参的类型应当一致。调用有个const引用的形参的函数时,如果实参不是一个变量或者类型不匹配时,函数会创建一个无名的临时变量用来储存实参的值,并把这个形参作为该临时变量的引用

 

3. 指针形参与引用形参有什么区别

指针形参是指函数的参数是指针,它不会像引用形参那样通过函数调用影响实参的值,但是调用后会修改实参的对象。程序中建议尽量少使用指针形参,这样会使程序的可读性下降。

 

类成员函数

1. 什么是类成员函数,有哪些特别的类成员函

类成员中的函数就是类的成员函数,特别是类成员函数有构造函数和析构函数。

 

2. 什么是静态函数,如何使用静态函数

static修饰的函数时静态函数,静态函数没有this指针,只能访问静态变量。在类中如果函数调用的结果不会访问或者修改任何对象数据成员,这样的成员声明为静态函数

 

3. 静态函数能访问类的私有成员

静态函数只能直接访问静态私有成员,不能直接访问非静态私有成员,通过宏替换可以访问非静态私有成员

 

4. 一个类可以访问另一个类的私有成员么

外部类可以使用宏定义等特殊方法来实现访问类的私有成员

 

函数重载

1. 函数重载与作用域

函数重载是指在相同作用域中,具有相同的命名而形参列表不同的多个函数

 

2. 如何进行函数重载的匹配

函数的重载匹配结果有三种

1)编译器找不到与实参最佳匹配的函数,并生成调用该函数的代码

2)编译器找不到形参与函数调用的实参匹配的函数。这种情况下,编译器将给出编译错误信息

3)存在多个与实参匹配的函数,但没有一个是明显的最佳选择。这种情况也是,该调用具有二义性。大多数情况下,编译器都可以直接明确地判断一个实际的调用是否合法,如果合法,则应该调用哪一个函数。重载集合中的函数通常有不同个数的参数或无法关联的参数类型

 

编译器遇到对重载函数的调用时,必须确定调用哪个函数,如果没有能找到参数完全匹配的函数,则找一个替代函数。此时编译器将实在参数所有的重载函数的参数作比较,这一过程称为函数匹配

 

3. 函数重载时如何实现实参的类型转换

在函数重载匹配时,先通过标准转换来实现匹配,如果不行,再通过类类型转换来实现匹配

 

 

模板与STL

模板

1. 什么是函数模板

函数模板技术是指调用了模板技术定义了参数化类型的非成员函数,这使得程序能够使用不同的参数类型调用相同的模板

 

2. 什么是类模板

类模板是使用模板技术的类,描述了能够管理其他数据类型的通用的数据类型。类模板技术通常用于建立包含其他类型容器类,例如队列,链表和堆栈

 

容器

1. 什么是容器

容器一般用类模板实现。

容器是容纳特定类对象的集合,在STL中,有顺序容器和关联容器两种

 

2. 有哪几种顺序容器

顺序容器,指的是将一组具有相同类型T的对象,以严格的线性形式组织在一起的容器

包括vectordequelist等三种顺序容器

 

3. 什么是迭代器的范围

迭代器是STL提供的对一个容器中的对象访问方法,并且定义了容器中对象的范围,迭代器就如同一个指针。事实上,c++的指针也是一种迭代器。但是,迭代器不仅仅是指针,因此不能认为迭代器一定具有地址值

迭代器有两个可以通过容器的begin()操作和end()操作获取。其中指begin向容器中的第一个元素,end指向的容器的最后一个元素的下一个位置,也就是说,end所指向的并不是容器的元素。通常beginend之间的范围就是迭代器的范围

 

4. 什么是关联容器

关联容器支持通过关键值(关键字)来高效地查找和读取元素。在STL中有两个基本的关联容器,分别是mapset

STL中有四个关联容器,分别是setmultimapmultiset容器

 

泛型编程

1. 什么是泛型编程

所谓泛型编程,就是以独立于任何特定类的方式编写代码。在使用泛型程序时,需要用户提供具体程序实例所操作的类型或值。

针对不同类型通用的实现

 

2. C++如何实现泛型编程

c++中实现泛型编程,其基础是模板技术,主要是设计函数模板和类模板。在c++中模板技术的实现包括函数模板和类模板。通过实现函数模板和类模板,可以为不同的类型提供通用的代码

你可能感兴趣的:(C/C++面试题基础,计算机,C/C)