有关C++本质方面的整理与总结

这些日子,基本做完了硬件设计,有了时间审查软件代码,所以整理一些和C++有关的知识点。今天这个话题,总结C++本质方面的问题,C++到底是什么,为什么会定义出这么灵活又复杂的开发语言,知其然,还知其所以然。

 1这是一位仁兄的总结,总结很好,可以看看:

  C语言有两种概念:变量和函数,变量分栈变量和堆变量,前者又叫临时变量,就是在函数内部声明的变量,这种变量可以理解成当函数返回后就消失了,所以不用担心存储空间,但是另一方面,栈变量不能太多太大,因为栈空间本来就不大。

函数本质上是代码,函数的定义同时也是声明,而且唯一。这和变量是不同的,变量必须定义声明两个地方才会存在于内存中。函数存储于代码区,一般是只读的,但是不一定。函数和函数内部的变量完全存储于不同的地方。

函数参数就是函数的局部变量。

程序(以Win32为例),本质上一个虚拟空间,大小为2^32,这虚拟的,但是你可以当真的用,操作系统会自动处理你需要的空间。其他操作系统大致也是这个原理。

指针就是对象在这个虚拟空间中的偏移量。(那么多讲指针的教程,其实这一句理解了就够了,对象就是指函数和变量两种)。

C++就是在C语言的基础上,把函数和变量分组,叫做一个类,类的变量在内存中是按声明顺序排列的。

C++类的成员函数隐藏着一个this参数,本质上和C函数没有区别。你调用C++成员函数的时候,这this参数不是函数的第一个参数,而是类的对象指针+dot或->来调用。类的地址其实就是第一个变量的地址。

函数参数的引用调用本质上就是指针调用,区别只对于上层语法,底层代码没有区别。

C++类可以有构造和析构函数,这两个函数分别在生成对象和销毁对象时自动调用,这才是C++与C的真正区别,这一点,C语言无法模拟。
构造和析构函数调用顺序如下:构造,先进入构造函数,但是不执行语句,然后开始调用成员的构造函数,全部调用完成后(可能有很多嵌套),才开始执行构造函数内的语句。析构函数,先调用析构函数,并执行完全部语句,但是不返回,开始执行成员的析构函数,执行完成后函数返回。

虚函数,虚函数是一个独立的机制,它在类的内部保存一个指针,这个指针指向的内存是一个函数列表。如果继承类(子类)也声明了这个同名函数,列表里存在的函数会被替换,多重继承就会多次替换(当然是在编译时期就确定的),这样即使在父类中调用这个函数,调用的也是子类的函数。

多重继承,就是把两个父类的成员和函数都放到一个类里面。

虚继承,就是父类的父类如果是同一个类,虚继承不会重复父类的父类的成员,非虚继承则会重复(简单的复制父类的全部成员)。

32位系统下的函数指针本质上只需要32位,但是各种笨拙的C++语法,把这个东西弄的非常复杂混乱。特别是类的成员函数,本质上需要指明第一个参数和函数指针两个对象,才能确定,但是把这样一个概念非用函数指针的语法来表示,所以类的成员函数指针是个怪胎,能不用,就不用。(各种编译器实现也是不同的)。

模板,简单的说,就是给出函数或者类的一个模子,只有模板参数确定的时候,才能生成具体的代码,所以你不能把模板函数或类做到动态链接库中。虽然实际上你能这么做,但是这些函数和对象不在动态链接库中,而是在你编译的时候才生成。模板涉及到的数学概念比C++语言本身要复杂很多很多倍,无法一句话说清楚。但是我们常用的不是很多。

大体上就这么多了吧。这就是C++的全部核心本质。

2.C++产生的原因,说明了什么是C++

最初导致C++诞生的原因是在Bjarne博士等人试图去分析UNIX的内核的时候,这项工作开始于1979年4月,当时由于没有合适的工具能够有效的分析由于内核分布而造成的网络流量,以及怎样将内核模块化。同年10月,Bjarne博士完成了一个可以运行的预处理程序,称之为Cpre,它为C加上了类似Simula的类机制。在这个过程中,Bjarne博士开始思考是不是要开发一种新的语言,当时贝尔实验室对这个想法很感兴趣,就让Bjarne博士等人组成一个开发小组,专门进行研究。 

当时不是叫做C++,而是C with class,这是把它当作一种C语言的有效扩充。由于当时C语言在编程界居于老大的地位,要想发展一种新的语言,最强大的竞争对手就是C语言,所以当时有两个问题最受关注:C++要在运行时间、代码紧凑性和数据紧凑性方面能够与C语言相媲美,但是还要尽量避免在语言应用领域的限制。在这种情况下,一个很自然的想法就是让C++从C语言继承过来,但是我们的Bjarne博士更具有先见之明,他为了避免受到C语言的局限性,参考了很多的语言,例如:从Simula继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了//注释,从Ada得到了模板、名字空间,从Ada、Clu和ML取来了异常。

有了这些简单的总结,其实可以大体了解C++本质,使用C不能很好解决问题时,利用C语言扩展了一一种新的语言,这就演变成了今天的C++。

时间: 2024-10-18 22:38:09

有关C++本质方面的整理与总结的相关文章

EntityFramework之领域驱动设计实践

EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领域驱动设计实践 (二):分层架构 EntityFramework之领域驱动设计实践 (三):案例:一个简易的销售系统 EntityFramework之领域驱动设计实践 (四):存储过程 - 领域驱动的反模式 EntityFramework之领域驱动设计实践 (五):聚合 EntityFramewor

(转)EntityFramework之领域驱动设计实践

EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领域驱动设计实践 (二):分层架构 EntityFramework之领域驱动设计实践 (三):案例:一个简易的销售系统 EntityFramework之领域驱动设计实践 (四):存储过程 - 领域驱动的反模式 EntityFramework之领域驱动设计实践 (五):聚合 EntityFramewor

【Python学习之路】——WEB本质

Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:utf-8 import socket def handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n") client.send("Hello, Seven")

select、poll、epoll之间的区别总结[整理]

select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间.关于这三种IO多路复用的用法,前面三篇总结写的很清楚,并用服务器回射echo程序进行了测试.

SVM整理

SVM整理 Last modified: 2015.9.2 1.算法总结 支持向量机是Cortes和Vapnik于1995年首先提出的,它在解决小样本,非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中. SVM方法是建立在统计学习理论的VC维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力(或称泛化能力).   1.1进一步小结

文顶顶iOS开发博客链接整理及部分项目源代码下载

文顶顶iOS开发博客链接整理及部分项目源代码下载 网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程却很难找.如果你是初学者,在学习了斯坦福iOS7公开课和跟着文顶顶的博客做项目之后,最快只需要2个月时间,就基本可以独立完成iOS App的开发工作.有经验的开发者也可以在该博客中寻找代码片段进行学习借鉴,必有所收获. 在此也向@文顶顶 表示严重感谢! 由于文顶顶博客博文繁多,每次找文章需要频繁的翻页,

Deep Learning(深度学习)学习笔记整理系列七

Deep Learning(深度学习)学习笔记整理系列 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢. 4)阅读本文需要机器学习.计算机视觉.神经网络等等基础(如果没有也没关系了,没

Java面试题目整理

一.引言:本文主要整理遇到的面试题目,以及提供自己的见解,将会持续更新,如有问题,可评论交流,一起进步. 二.问题及我的见解: 1. n个结点可以组合成多少棵不同的二叉树? 答:2^n-n棵 2. 什么是bean? 答: bean本质上就是可复用的类,比如在spring中的bean就是表示组件的意思. 3. String.StringBuffer.StringBuilder的有什么区别? 答:String是内容和长度固定的类 StringBuffer是内容和长度可变的类,并且线程安全 Strin

机器学习 —— 基础整理(六):线性判别函数——感知器、松弛算法、Ho-Kashyap算法

本文简单整理了以下内容: (一)线性判别函数与广义线性判别函数 (二)感知器 (三)松弛算法 (四)Ho-Kashyap算法 (一)线性判别函数与广义线性判别函数 一.线性判别函数 这篇总结继续关注分类问题.假设判别函数(Discriminant function)的参数形式已知,用训练的方法直接根据样本估计判别函数的参数.线性判别函数的形式为: $$g(\textbf x)=\textbf w^{\top}\textbf x+w_0$$ $\textbf x\in \mathbb R^d$ 是