C++起源
20世纪70年代中期,Bjarne Stroustrup在剑桥大学计算机中心工作。他使用过Simula和ALGOL,接触过C。他对Simula的类体系感受颇深,对ALGOL的结构也很有研究,深知运行效率的意义。既要编程简单、正确可靠,又要运行高效、可移植,是Bjarne Stroustrup的初衷。以C为背景,以Simula思想为基础,正好符合他的设想。1979年,Bjame Sgoustrup到了Bell实验室,开始从事将C改良为带类的C(C with classes)的工作。1983年该语言被正式命名为C++。自从C++被发明以来,它经历了3次主要的修订,每一次修订都为C++增加了新的特征并作了一些修改。第一次修订是在1985年,第二次修订是在1990年,而第三次修订发生在c++的标准化过程中。在20世纪90年代早期,人们开始为C++建立一个标准,并成立了一个ANSI和ISO(Intemational Standards Organization)国际标准化组织的联合标准化委员会。该委员会在1994年1月25曰提出了第一个标准化草案。在这个草案中,委员会在保持Stroustrup最初定义的所有特征的同时,还增加了一些新的特征。
在完成C++标准化的第一个草案后不久,发生了一件事情使得C++标准被极大地扩展了:Alexander stepanov创建了标准模板库(Standard Template Library,STL)。STL不仅功能强大,同时非常优雅,然而,它也是非常庞大的。在通过了第一个草案之后,委员会投票并通过了将STL包含到C++标准中的提议。STL对C++的扩展超出了C++的最初定义范围。虽然在标准中增加STL是个很重要的决定,但也因此延缓了C++标准化的进程。
委员会于1997年11月14日通过了该标准的最终草案,1998年,C++的ANSI/IS0标准被投入使用。通常,这个版本的C++被认为是标准C++。所有的主流C++编译器都支持这个版本的C++,包括微软的Visual C++和Borland公司的C++Builder。
C++特点
支持数据封装和数据隐藏
在C++中,类是支持数据封装的工具,对象则是数据封装的实现。C++通过建立用户定义类支持数据封装和数据隐藏。
在面向对象的程序设计中,将数据和对该数据进行合法操作的函数封装在一起作为一个类的定义。对象被说明为具有一个给定类的变量。每个给定类的对象包含这个类所规定的若干私有成员、公有成员及保护成员。完好定义的类一旦建立,就可看成完全封装的实体,可以作为一个整体单元使用。类的实际内部工作隐藏起来,使用完好定义的类的用户不需要知道类是如何工作的,只要知道如何使用它即可。
支持继承和重用
在C++现有类的基础上可以声明新类型,这就是继承和重用的思想。通过继承和重用可以更有效地组织程序结构,明确类间关系,并且充分利用已有的类来完成更复杂、深入的开发。新定义的类为子类,成为派生类。它可以从父类那里继承所有非私有的属性和方法,作为自己的成员。
支持多态性
采用多态性为每个类指定表现行为。多态性形成由父类和它们的子类组成的一个树型结构。在这个树中的每个子类可以接收一个或多个具有相同名字的消息。当一个消息被这个树中一个类的一个对象接收时,这个对象动态地决定给予子类对象的消息的某种用法。多态性的这一特性允许使用高级抽象。
继承性和多态性的组合,可以轻易地生成一系列虽然类似但独一无二的对象。由于继承性,这些对象共享许多相似的特征。由于多态性,一个对象可有独特的表现方式,而另一个对象有另一种表现方式。
C++初始化
我们知道C++是由C语言发展而来,因此C++有很多和C语言类似的地方
c/c++其实就是一个东西 只是C++在C语言的基础上增加了许多规则和便利的地方
今天我们涉及到的内容是在熟悉C语言基础下进行的

在初始化中我们可以 c++在初始化的时候有更多简便的地方
C++输入输出
c++的输入输出是直观上和C语言最不同的地方

例如这个C语言代码 用C++就是这样

using namespace std是一个标准命名空间
iostream支持输入输出操作。iostream是从istreanm类和ostream类通过多重继承而派生的类。
就如同C语言中输入输出函数需要带头文件 stdio.h是一样的效果
基本的输入输出都是需要这个头文件
那么在C++ 输入输出以及从屏幕打印从键盘获取的

错误用法:
cin>>a,ch
count<<a,ch
C++中字符串的输入输出
指针在C和c++中的不同

之前在学习C语言时我们了解到C语言中数组定义时 大小不能为变量
但是c++中是可以使用变量的
C++指针和const的关系

这里的规则和C语言中一致 const在谁前面那么谁就是不能变得
其次 普通变量可以普通修饰也可可以const修饰
但是常变量 不能普通修饰只能const修饰
引用
说通俗一点 引用就是一个变量的别名

引用的特点
既然说到没用空引用 那么我们就涉及到一个函数优化的问题
比如一个函数的参数是指针 那么函数内部的第一步就是要对指针进行判空操作
这个操作在有指针作为参数时是必须的
那么如果我们将参数换为引用 那么就可以省去这个判空操作

const和引用结合

这个就和指针和const结合规则类似
指针和引用一样 在引用数组时会有
指针和引用都可以间接的访问一个变量
那么指针和引用的区别是 从语法规则上讲,
指针变量存储某个实例(变量或对象)的地址;引用是某个实例的别名。
程序为指针变量分配内存区域;而不为引用分配内存区域。
解引用是指针使用时要在前加“*”;引用可以直接使用。
指针变量的值可以发生改变,存储不同实例的地址;引用在定义时就被初始化,之后无法改变(不能是其他实例的引用)。
指针变量的值可以为空(NULL,nullptr);没有空引用。
指针变量作为形参时需要测试它的合法性(判空NULL);引用不需要判空;
对指针变量使用"sizeof"得到的是指针变量的大小。对引用变量使用"sizeof"得到的是变量的大小。理论上指针的级数没有限制;但引用只有一级。即不存在引用的引用,但可以有指针的指针。
++引用与++指针的效果不一样。
例如就++操作而言,
对指针变量的操作,会使指针变量指向下一个实体(变量或对象)的地址;而不是改变所指实体(变量或对象)的内容。
对引用的操作直接反应到所引用的实体(变量或对象)。不可以对函数中的局部变量或对象以引用或指针方式返回。
inline函数
说到inline函数 我们就要提到一个概率 栈帧以及栈帧的回退

例如我们这样的一个代码

就是当我们的主程序走到调用函数的这一步时
会在栈区申请一个临时空间 计算a+b的值 然后函数结束把申请的这一块东西收回去
就叫栈帧的回退
那么这个过程会消耗时间的 因此我们就要对此进行优化
因为如果代码中重复多次使用这个函数 就会不停的进行栈帧的建立和栈帧的回退
这个会加长代码运行的时间
那么我们要做的就是让它可以尽量少的来出现这一步
这就提到了我们的inline函数

这样就可以缩短我们代码运行的时间
实际上inline函数就是用空间换取时间上的便利
建立多个空间 使用时只需要访问它即可
这样就大大减低了代码运行的时间 我们可以使用宏定义达到一样的效果
宏定义和inline的区别
(1)内联函数在编译时展开,带参的宏在预编译时展开。
(2)内联函数直接嵌入到目标代码中,带参的宏是简单的做文本替换。
(3)内联函数有类型检测、语法判断等功能,宏只是替换。
26万+

被折叠的 条评论
为什么被折叠?



