C/C++基础知识总结
写在前面:对于即将离开象牙塔的我们,需要面临的一个首要问题就是如何在社会中占据一席之地。在这里,我想说是:机会总是留给有准备的人的!我不是在这里空喊口号,而是以我过来人的经验来告诫你们,任何的侥幸心理都不要有,只要你努力了、有准备了、足够优秀了,工作的offer自然会飞到你手里。
说明:本篇文章的参考书籍是——《c/c++程序员面试宝典》,我认为每一位找工作的同学,都可以去读一读,真心的很不错。
《c/c++程序员面试宝典》pdf下载地址:https://pan.baidu.com/s/1c76706fg0azovavq1ykgsw
c/c++基础知识总结
1、c++中的基本数据类型有哪些?
答:3种类型:整数型、浮点型、void型。
2、整型有几种形式,各种形式有什么区别?
答:整型包括整数,字符和布尔值的算术类型,根据修饰符细分为13种形式,其主要区别体现在类型名、长度、表示范围几个方面。
3、c++中有哪些常量?
答:6种常量:整型常量、浮点型常量、字符型常量、字符串常量、转义字符常量、地址常量。
4、常量与变量有哪些区别?
答:(1)常量的值不可改变,变量的值可以改变;(2)常量在定义时必须初始化,变量在定义可以不初始化;(3)常量不可以寻址,其地址只可赋予常量指针,变量可以寻址;(4)常量有较高的编译执行效率;
5、操作符有哪些分类?
答:(1)按照操作数区分:一元操作符、二元操作符、三元操作符;(2)按照功能区分:算术操作符、关系操作符、逻辑操作符、位操作符、赋值操作符、自增自减操作符、箭头操作符、条件操作符、sizeof操作符、逗号操作符。
6、自增自减前操作与后操作的区别?
答:前自增自减操作的优先级大于赋值运算符(=),后自增自减操作的优先级小于赋值运算符,后自增自减操作后表达式的值不会发生改变。
7、指针和变量的自增自减有什么不同?
答:变量的自增自减是改变变量的值,指针的自增自减是改变指针的指向地址。
8、什么是左值和右值?
答:变量是左值,可以在赋值语句的左边;数字字面值是右值,不能被赋值。
9、变量有哪几种初始化方式?
答:2种:直接初始化;复制初始化。直接初始化更加灵活而且执行效率更高。
10、变量的声明和定义是什么?
答:变量声明的主要目的是表明变量的类型和名称;变量定义的主要目的是分配存储空间,它们有相同的时候。
11、c++中有哪几种作用域?
答:3种:全局作用域、局部作用域、语句作用域。
12、变量有哪几种存储类型?
答:4种:自动类型、静态类型、寄存器类型、外部类型。
13、c与c++有什么区别?
答:c语言是结构化的编程语言,它是面向过程的,考虑的是实现过程;c++是面向对象的,考虑的是整个程序模型。
14、宏定义与操作符的区别?
答:宏定义是c++的预处理命令之一,它是一个替换操作,不做计算和表达式求解,不占内存和编译时间。
15、虚函数与纯虚函数的特点?
答:虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public;纯虚函数是虚函数的一个子集,含有纯虚函数的类就是抽象类,它不能生成对象。
16、如何使用纯虚函数?
答:纯虚函数用来定义没有意义的实现,用于抽象类中需要交给派生类具体实现的方法。
17、什么是指针?
答:指针是用来存储内存地址的变量,它指向单个对象的地址,除了void指针类型外,指针的数据类型与所指向地址的变量的数据类型需要保持一致。
18、const对象的指针和const指针的区别?
答:const指针本身的值不可改变,但可以使用该指针修改它所指对象的值;const变量的指针不可以修改所指向的const变量的值,但指针本身可以被重新赋值。
19、数组指针与指针数组的区别?
答:数组指针是一个指针变量,它指向一个数组;指针数组是一个只包含指针元素的数组,它的元素可以指向相同类型的不同对象。
20、什么是函数指针?
答:函数指针就是指向函数的存储空间地址的指针,可以对函数指针进行赋值并通过函数指针来调用函数。
21、引用与值传递的区别?
答:值传递传递的是一个值的副本,函数对形参的操作不会影响实参的值;引用传递传递的是引用对象的内存地址,函数对形参的操作会影响实参的值,实参的值会随着形参的值得改变而改变。
22、指针与引用的区别?
答:(1)引用无需解引用,指针需要解引用;(2)引用在定义时被初始化一次,之后不可变,指针可变;(3)引用不能为空,指针可以为空;(4)程序为指针变量分配内存区域,而引用不需要分配内存区域,所以指针自增操作是指针变量的自增,引用自增操作是变量值的自增。
23、面向对象与面向过程的区别?
答:面向过程是一种以过程为中心的编程思想,以算法进行驱动;面向对象是一种以对象为中心的编程思想,以消息进行驱动。面向过程编程语言的组成:程序=算法+数据;面向对象编程语言的组成:程序=对象+消息。
24、面向对象的特征是什么?
答:面对对象的3个要素:封装,继承,多态。面向对象中所有对象都可以归属为一个类。
25、类与结构体有什么区别?
答:(1)结构体存储在栈中,类的实例化可以存储在栈中,也可以存储在堆中;(2)结构体的执行效率比类要高;(3)结构体没有析构函数,类有析构函数;(4)结构体不可以继承,类可以继承。
26、如何访问静态成员?
答:静态成员可以通过类名直接调用,不需要创建类的实例,也可以通过类的实例进行调用,但底层仍然是通过类名调用的,所以不推荐这种调用方法。类的静态方法只能访问类的静态成员。
27、什么是多态?
答:多态就是将子类对象赋给父类变量,父类变量在编译期和运行期表现出不同的特性。
28、在c++中如何实现多态?
答:多态有动态多态、静态多态、函数多态和宏多态等,我们常说的多态指的是动态多态,它是基于继承机制和虚函数来实现的。
29、派生类与基类的转换?
答:派生类总是可以转换为基类的引用类型;基类转换为派生类需要在确定安全的情况下使用强制转换来实现。
30、什么是虚成员,有什么作用?
答:虚函数的作用是实现动态联编,程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,即在程序运行时动态的选择合适的成员函数。
31、c++覆盖与隐藏概述?
答:(1)覆盖指的是在子类和父类中,存在函数名、参数均相同的函数,并且父类的该函数为虚函数;(2)隐藏指的是在子类与父类中,存在函数名相同、参数不同的函数,此时无论父类函数是否为虚函数,父类函数都会被被隐藏,或者存在函数名、参数均相同的函数,此时只有当父类函数不为虚函数时,父类函数才会被隐藏。
32、什么是深拷贝与浅拷贝?
答:如果一个类拥有资源,当这个类的资源发生复制过程时,就叫做深拷贝;如果对象存在资源但在复制过程中并未复制资源就是浅拷贝。
33、什么是拷贝构造函数,什么时候调用?
答:拷贝构造函数由编译器调用来完成一些基于同一类的其他对象的构建及初始化。有3种情况会使用拷贝构造函数:(1)一个对象以值传递的方式传入函数体;(2)一个对象以值传递的方式从函数返回;(3)一个对象需要通过另外一个对象进行初始化。
34、什么是类型转换构造函数?
答:一个类的构造函数只有一个参数,该参数类型不为该类类型而是其他类型,这个构造函数就被称为类型转换构造函数,它可以用来处理不同域的同一数据值。
35、c++支持参数个数不确定的函数吗?
答:c++可以通过隐藏参数机制支持参数不确定的函数。
36、什么是内联函数?
答:在类声明的内部声明或定义的成员函数叫做内联(inline)函数,在内联函数内不允许有循环语句和switch语句。
37、引用形参与非引用形参的区别?
答:引用形参是将参数变量的地址来进行传递,可以通过函数对形参的调用来修改实参的值。
38、使用引用形参有什么问题?
答:调用非const类型的引用形参,实参必须不是const类型,二者类型应当一致;当调用一个有const引用的形参函数时,如果实参不是一个变量或者类型不匹配时,函数会创建一个无名的临时变量用来存储实参的值,并把这个形参作为该临时变量的引用。
39、指针形参和引用形参有什么区别?
答:指针形参是指函数的参数是指针,它不会像引用形参那样通过函数调用影响实参的值,但是调用后它会修改实参的对象。程序中建议尽量少使用指针形参,这样会使程序的可读性下降。
40、什么是静态函数?如何使用静态函数?
答:静态函数是用static修饰符修饰的函数,静态函数没有this指针,只能访问静态变量。类中如果函数调用的结果不会访问或者修改任何对象数据成员,这样的成员声明为静态成员函数比较好。
41、函数重载及作用域?
答:函数重载是指在相同作用域下,具有相同名称而不同参数列表的多个函数。
42、函数重载时如何实现实参的类型转换?
答:在函数重载匹配时,先通过标准转换来实现匹配,如果不行,再通过类类型转换来实现匹配。
43、什么是函数模板?
答:函数模板技术是指使用了模板技术定义了参数化类型的非成员函数,这使得程序能够使用不同的参数类型调用相同的函数。
44、什么是类模板?
答:类模板是使用模板技术的类,描述了能够管理其他数据类型的通用数据类型。类模板技术通常用于建立包含其他类型的容器类(队列、链表、堆栈等)。
45、什么是泛型编程?
答:泛型编程就是以独立于特定类实现的方式编写代码,针对不同的类型提供通用的实现。
46、c++如何实现泛型编程?
答:c++中泛型编程的实现是使用c++中的模板技术来实现的,主要是设计函数模板和类模板。
后记:欢迎各路大神批评与指正!
上一篇: C++学习(八)之 图形库