C++ 的一些概念

此文用于记录学习 C++ 过程中遇到的一些知识点。

命名空间

命名空间里面包含了逻辑结构上相互关联的一组类、函数、模板等。命名空间像是一个容器,把某些在逻辑结构上相关的“对象”放在一起并与外界区分。特别的,命名空间里面的变量名或类名可以和命名空间外的变量名和类名重名。

修饰符

signed、unsigned、short、long 是 C++ 中的修饰符,当 short 和 long 用来修饰 int 时,int 可省略不写,表示短整型数据或长整型数据(也就是说,没有 short 和 long 这种数据类型)。

内存分配

C++ 程序在运行时,计算机内存被分为程序代码区、全局数据区、堆区、栈区四个部分。

静态存储区分配

静态分配方式下的内存在程序编译的时候就已经分配好了且存在于程序的整个运行过程。例如 static 变量,其生命周期随程序的结束而结束,而飞像一般变量随函数或作用域的结束而结束。

当然,除了 static 变量,还有一种全局对象 static object,也可以存放在静态存储区。

栈内存分配

栈内存分配方式下的内存是存在于某作用域的一块空间。例如调用某个函数时,函数内局部变量的存储单元可以在栈上创建,函数执行结束时,这些内存单元会被自动释放。

堆内存分配

堆内存分配,也称动态内存分配,通常使用 new 和 delete 关键字进行管理。堆内存空间可由用于手动分配和释放,所以其生存周期由用户指定,较为灵活。但频繁的分配、释放大小不同的堆空间会产生内存碎片。

函数重载

函数重载指定义一个函数参数类型或参数个数不同的重名函数。当程序执行时,编译器将调用参数类型与函数形参类型一致的函数。

面向对象程序设计的特点

这部分内容都是概念性内容,应该算是所有面向对象的程序语言的基本特性。

抽象

抽象是指对具体问题或对象进行概括,抽出其公共性质并加以描述的过程。一般情况抽象分为数据抽象和行为抽象,其中数据抽象是指一个对象区别于另一个对象的特征,行为抽象是指某类对象的共同特征。

封装

封装是指将抽象得到的数据和行为相结合,隐藏对象属性和实现细节且仅对外提供公共访问方式的过程。

继承

继承是指通过代码复用在保持原有类特性的基础上对子类进行具体说明的过程,通俗来说继承就是精简重复代码的手段。

多态

多态是指一段程序能够处理多种类型对象的能力,函数重载就是实现多态的一种手段。在 C++ 中,多态可分为强制多态、重载多态、类型参数化多态和包含多态。

类一般是由类名、数据成员、函数成员三部分组成。定义类的基本形式为:

1
2
3
4
5
6
7
8
class name {
public:
外部接口
protected:
保护性成员
private:
私有成员
}

其中 public、protected、private 表示访问控制属性,用于控制类成员的访问权限。特别的,没有分配控制属性的默认为 private 私有成员。
public 成员可以在类外直接访问;protected 成员可以在子类中访问;private 成员只能被本类的成员函数访问。

类的成员函数

成员函数描述了类的行为。成员函数在类中只用说明其函数的返回类型、名字和参数表,而函数的具体实现在类外说明,其基本形式为:

1
2
3
4
5
6
7
class name {
函数的返回类型 函数名(参数列表)
};

返回值类型 类名::函数名(参数列表) {
函数体
}

对象

在 C++ 中,对象是某类事物的实例,其声明形式为:

1
类名 对象名;

引用

引用与指针主要有三个区别:

  1. 可以通过*p = 0或者*p = NULL来描述一个空指针,但不存在空引用。
  2. 指针可在任何时间进行初始化操作,而引用只能定义时进行初始化操作。
  3. 指针变量指向内存的一个存储单元,而引用只不过是原变量的一个别名而已。

内存泄漏

内存泄漏的可能场景很多,但通俗来讲,内存泄漏应该叫“内存闲置”更合适。也就是说,内存泄漏其实指的就是程序在结束之前,申请的内存在用完之后,没有被释放掉,那么程序再次需要内存的时候,就无法再使用这块内存了,只能再换一整块了。当然了,这只是通俗的理解方式,并不是那么严谨。

语言类型

C++ 是一种静态数据类型语言,它的类型检查发生在编译时。因此,编译器必须知道程序中每一个变量对应的数据类型。与之相反的,Python 的类型检查是在程序运行时进行的。

内置类型

C++ 的基本内置类型包括两部分:算数类型和空类型。算数类型包含了字符、整数型、布尔值和浮点数,空类型不对应具体的值。


Buy me a coffee ? :)
0%