C++ 模板
模板是泛型编程的基础,泛型编程是以一种独立于任何特定类型的方式编写代码。 使用模板可以下厨类型无关的代码,编译器会在使用时生成具体类型版本。 简单来说,模板就是在实例化函数或类的时候,把类型当作参数传进去或者编译一起自动推断类型,然后分别生成不同类型的函数或者类。 函数模板 模板函数定义的一般形式如下: template <typename type> ret-type...
模板是泛型编程的基础,泛型编程是以一种独立于任何特定类型的方式编写代码。 使用模板可以下厨类型无关的代码,编译器会在使用时生成具体类型版本。 简单来说,模板就是在实例化函数或类的时候,把类型当作参数传进去或者编译一起自动推断类型,然后分别生成不同类型的函数或者类。 函数模板 模板函数定义的一般形式如下: template <typename type> ret-type...
命名空间主要解决不同库中,相同名称的命名冲突问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。 定义命名空间 命名空间的定义使用关键字 namespace,后跟命名空间的名称,如下所示: namespace namespace_name { // 代码声明 } 为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称,如下所示: name::code; ...
C++程序中,内存分为: 栈:在函数内部声明的所有变量都将占用栈内存。 堆:程序中未使用的内存,在程序运行时可用于动态分配内存。 对于确定的变量,通常在栈上进行内存空间申请。 对于无法提前预知需要多少内存来存储某个定义变量的特定信息,所需内存的大小需要在运行时才能确定时,可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存。 申请动态内存时使用new,不需要动...
C++主要有以下三种异常处理的关键字 throw: 当问题出现时,程序通过throw抛出一个异常。 catch: 使用catch来捕获异常 try: try块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。 基本语法 try { // 可能会出错的代码 if (条件不满足) { throw 错误对象; // ...
C++iostream标准库除了提供从标准输入读取流istream和向标准输出写入流ostream,还提供从文件读取流和向文件写入流fstream 要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 <iostream> 和 <fstream>。 数据类型 数据类型 描述 ...
数据封装(Encapsulation) 是 面向对象编程(OOP) 的三大特性之一。它的核心思想是 把数据和操作数据的函数绑定在一起,并通过访问权限来保护数据。 也就是说,对象的内部状态对外部隐藏,只能通过类提供的接口访问。 实现方式 数据封装主要依赖类和访问控制符 public: 对所有代码可见 protected: 对子类和本类可见 private: 仅对本类可见 ...
数据抽象指的是,隐藏对象的具体实现,只暴露必要的接口。 数据抽象是一种依赖于接口和实现分离的编程(设计)技术。 用类封装数据和接口 #include <iostream> using namespace std; class BankAccount { private: string owner; // 账户持有人 —— 内部实现,外部不可直接访问 ...
多态(Polymorphism)就是同一操作作用于不同对象,可以产生不同的行为。 主要分为: 编译时多态(静态多态) 函数重载 运算符重载 模板(泛型编程) 在编译阶段就确定调用哪个函数。 运行时...
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。 当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。 函数重载...
当创建一个类时,可以不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。 基类&派生类 一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。 定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下: class derived-class: access...