C++基础知识的总结(主要针对面试)
转载源自
C++的魅力在于其丰富多彩的性格特征:其行为方式既可以像C一样面向过程也可以面向对象(专注Class 很多年)、封装性(城府很深)、继承性(富二代)、多态性(多重人格/精神分裂/变态)。本篇将根据以下C++男神养成的大致攻略图所对应的性格特征进行简要的分析。
1.面向对象
面向对象的三大特性:封装、继承、多态。
类和对象:类由数据成员和成员函数构成,代表抽象派,玩的就是概念,某种意义上来说是一种行为艺术;而对象是具体的,比如说过年回家和老爹下中国象棋,发现棋盘上少了一对‘象’,那是你爸在告诉你该找“对象”了(单身狗表示选择Go Die)。
封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的类进行信息隐藏。(C++最大的优点:可以隐藏代码的实现细节,使得代码更模块化)
继承:可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展,但是基类的构造函数、复制构造函数、析构函数、赋值运算符不能被派生类继承。(优点是实可以扩展已存在的代码模块类)
多态:一个类实例的相同方法在不同情形有不同表现形式。多态实现的两种方式:将子类对象的指针赋给父类类型的指针或将一个基类的引用指向它的派生类实例。(其中比较重要的是虚函数的使用以及指针或引用)
this指针:一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类的内部,当在类的非静态(前面没加Static)成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,各成员的访问均通过this指针进行。(静态成员是没有this指针的)
2.封装性
(1)拷贝函数
浅拷贝:所谓浅拷贝,指的是在对象复制时,只是对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。
深拷贝:在“深拷贝”的情况下,对于对象中动态成员,就不能仅仅简单地赋值了,而应该重新动态分配空间。
(2)构造与析构函数
构造函数:主要用来初始化数据。
析构函数:主要用来释放堆区申请的内存空间。
(3)指针与引用
相同点:
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
不同点:
指针是一个实体,而引用仅是个别名;
引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
引用没有const,指针有const,const的指针不可变;
引用不能为空,指针可以为空;
sizeof(引用)得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
指针和引用的自增(++)运算意义不一样;
引用是类型安全的,而指针不是 (引用比指针多了类型检查)。
举个栗子: void fun (int *a,int *b) voidfun (int &a,int &b)
{ {
int c = 0; intc = 0;
c = *a; c = a;
*a = *b; a = b;
*b = c; b = c;
} }
fun(&a,&b); fun(a, b);
const int x=3; int *y= &x; (错误)
int x=3; const int *y=&x; (可行)
3.继承性
派生类继承方式:
a.公有继承(public):基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。
b.保护继承(protected):基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。
c.私有继承(privatem默认):基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
友元函数:
概念:友元函数是一种定义在类外部的普通函数,但它需要在类体内进行说明
friend 类型友元函数名(参数表);
特点:
友元函数可以访问类中的所有成员,一般函数只能访问类中的公有成员。
某类的友元函数的作用域并非该类作用域。
友元函数破坏了面向对象程序设计类的封装性,所以友元函数如不是必须使用,尽量少用。
4.多态性
1 多态性:
(1)多态
相同对象收到不同消息或不同的对象接收相同的命令而做出的不同反应叫做多态。
举个栗子:在我们玩拳皇游戏,按下的不同按键,不同人物所作出的不同动作招式。
多态分为:静态绑定(早绑定)和动态绑定(晚绑定)两种。
a. 静态绑定:函数重载;
b. 动态绑定:虚函数;
(2)函数
有默认参数值的函数参数,必须在参数表的最右端(靠右原则)。
无实参时使用函数默认值,有实参时覆盖默认值。
a. 函数重载:
b. 运算符重载:
c. 内联函数Inline:编译时将函数体代码和实参代替函数调用语句(在函数声明前加个Inline)。
l 优点:使用内联函数,效率高,运行快。
l 使用条件:
内联编译的建议性由编译器决定。
逻辑简单调用频繁的函数,建议使用内联函数。
递归函数无法使用内联函数。
d. 虚函数:(普通虚函数、虚析构函数、纯虚函数{抽象类/接口类}、虚函数表)
(3)重写与重载:(企业面试题)
方法的重写Overriding和重载Overloading是多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了,而且如果子类的方法名和参数类型和个数都和父类相同,那么子类的返回值类型必须和父类的相同;如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloading的方法是可以改变返回值的类型。也就是说,重载的返回值类型可以相同也可以不同。
(4)const和#define:
• define宏定义不会做类型检查(容易出错),const拥有类型,会执行相应的类型检查
• define仅仅是宏替换,不占用内存,而const会占用内存
• const内存执行效率更高,编译器可能将const变量保存在符号表中,而不会分配存储空间,这使得它成为一个编译期间的常量,没有存储和读取的操作,而使用#define定义的是一个简单的函数时,大都使用内联函数替换。
Black宇笔记:定义:define不会做类型检查,const会做类型检查
内存:define不占用内存,而const占用内存
作用:define简单的宏替换,const防止内存被篡改
(5)static静态:
在C语言中,关键字static有三个明显的作用:
1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持上一次的值不变,即只初始化一次(该变量存放在静态变量区,而不是栈区)。
2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外访问。
3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
4)在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;
5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量(当然,可以通过传递一个对象来访问其成员)。
5.内存管理
申请或者归还内存资源就叫做内存管理。
1)堆区和栈区:
从内存角度来说:栈区(stack)由编译器自动分配释放,存放函数的参数值,局部变变量的值等,其操作方式类似于数据结构中的栈,可静态亦可动态分配。堆区(heap)一般由程序员分配释放,若程序员不释放,可能造成内存泄漏,程序结束时可能由OS回收。只可动态分配,分配方式类似于链表。
从数据结构角度来说:堆可以被看成是一棵树,如:堆排序。而栈是一种先进后出的数据结构。
2)malloc VS new
1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。但它们都可用于申请动态内存和释放内存。
2.对于非内部数据类型的对象而言,用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,和一个能完成清理与释放内存工作的运算符delete。
3.new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void*指针。new delete在实现上其实调用了malloc,free函数。
4.new 建立的是一个对象;malloc分配的是一块内存。
Black宇笔记:本质:malloc 和free是函数,而new和delete是运算符
定义:malloc 和free是分配和释放一块内存,构建对象时不会自动调用构造和析构函数,而new和delete是建立和释放一个对象,构建对象时会自动调用构造和析构函数。
C++基础知识的总结(主要针对面试)相关推荐
- 串口发送tcp数据 源端口号_三分钟基础知识:用动画给面试官解释 TCP 三次握手过程...
作者 | 小鹿 来源 | 小鹿动画学编程 写在前边 TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐. 对于这部分掌握以及 TC ...
- 干货!操作系统基础知识汇总!转给要面试的同学吧
作者:Guide哥 来源:公众号 JavaGuide 很多读者抱怨计算操作系统的知识点比较繁杂,自己也没有多少耐心去看,但是面试的时候又经常会遇到.所以,我带着我整理好的操作系统的常见问题来啦!这篇文 ...
- 超详细的Java面试题总结之JavaWeb基础知识总结,java开发面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了【ZT帅地】2020-3-7
https://blog.csdn.net/m0_37907797/article/details/104029002 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围 ...
- 【C++后台开发面经】面试总结第三波:针对后台开发相关基础知识分类总结
前言 面试总结第三波,关于后台开发面试相关基础知识,数据结构.算法.linux操作系统.计算机网络.C++.数据库进行分类总结. 后端面试总结 目录 后端面试总结 1.数据结构 链表和数组的区别 树的 ...
- 【前端面试】Part 1:2020届初级前端校招笔试题及面经总结 —— 基础知识题
个人总结 很高兴今天收到了开奖电话,拿到本科SP成功结束了秋招! 一轮轮的笔面试是对自己查缺补漏.学习成长的过程. 反思自己对前端的学习过程:2017年10月加入Smartlab411,起步阶段看书比 ...
- 计算机网络基础知识及面试总结-这应该是最全的了
文章目录 计算机网络基础知识及面试总结 1 基本概念 1.1 TCP/IP协议栈,OSI参考模型 1.2 简要的介绍各层的作用 1.3 常见的协议 2 应用层 2.1 HTTP请求有哪些常见状态码? ...
- 【吊打面试官】计算机基础知识
吊打是不可能的了哈哈,卑微的小菜鸡简单总结几个面试问题. 文章目录 1.数据挖掘的3个算法 2.研究方向 3.大数据与数据挖掘的区别,生活中的应用 4.linux常用命令 5.如何做海量数据查询 6. ...
- Java面试基础知识II
2.ArrayList和Vector的区别,HashMap和Hashtable的区别 答:就ArrayList与Vector主要从二方面来说. 一.同步性:Vector是线程安全的,也就是说是同步的, ...
- Java面试基础知识III
Java面试基础知识: 1.C++或Java中的异常处理机制的简单原理和应用. 当JAVA 程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常.违反语义规则包括2种情况.一种 ...
最新文章
- TensorFlow惊现大bug?网友:这是逼着我们用PyTorch啊
- 2018第九届蓝桥杯省赛真题 C语言B组 第一题
- 查看SELinux状态
- 使用脚本删除ios工程中未使用图片
- 为什么很多程序员不用switch,而是大量的if……else if?
- ps怎么撤销参考线_入门板绘怎么练习?怎么提高板绘技巧?(干货)
- MySQL镜像下载及启动
- dubbo+zookeeper项目搭建
- iOS开发tableview的几种刷新,指定刷新,全局刷新,刷新的动画
- 大数据面试3分钟自我介绍_大数据开发工程师面试主要面试内容
- 数据库课程设计 ——酒店管理系统
- jquery所有版本下载
- 建筑施工企业数字化安全质量监督管理系统
- 面试题——关于文本加密
- 微信红包在微信公账号平台如何进行配置
- 硬件内存模型 Hardware Memory Models
- eclipse安装tomcat时只有locahost,不显示server name
- IMAC双系统WIN下截屏快捷键
- RVDS4.0 破解
- css 设置图片为灰色