C++学习
前言
1、C++包含多种编程范式:面向对象、泛型、传统的过程化编程
2、C++标准:C99、C03、C11
3、C++在C语言上新增了
- 类和对象(Class and Object)
- 继承(Extends)
- 多态、虚函数和RTTI(运行阶段状态识别)
- 函数重载
- 引用变量
- 泛型(独立于类型)编程,该技术由模板和标准模板库(STL)提供的
- 处理错误条件的异常机制
- 管理函数、类和变量名的名称空间
4、本书内容
预备知识
- 介绍了在C上添加C++面向对象特性的方法
- 面向过程、面向对象的区别
- 制定C++标准时所做工作
- 创建C++程序的技巧、几种C++编译器使用的方法
开始学习C++
- 创建C++程序的步骤
- main函数的角色
- 一些C++的语句:cin、cout等
- 函数——C++的编程模块
处理数据
- C++里有两种内置类型:整形、浮点型
- C++为各种程序都提供了几种类型
- 本章讨论着几种类型,以及创建变量、编写各种类型的常量
- C++如何处理各种类型的隐式、显式转换
复合类型
- C++使程序员可以通过基本的内置类型构造更复杂的类型,最高级的是类,在9~13章讨论。本章讨论其他形式:数组、结构体、指针
- 创建和存储文本字符串
- 使用C-风格字符数组、C++ String类处理文本输入输出
- 含显式管理内存的new、delete运算符在内的C++内存分配方式
循环和关系表达式
- C++提供了三种循环结构:for、while、do-while
- 创建逐字符读取和处理输入的循环
- 如何创建二维数组,并使用嵌套循环来处理
分支和逻辑运算符
- if、if-else、switch、条件运算符
- 使用逻辑运算符表达决策测试
- 确定字符关系(如测试字符是数字还是非打印字符)的函数库cctype
- 简要介绍文件输入/输出
函数——C++的编程模块、C++与C的函数的共有特性
- 函数定义通用格式
- 函数原型如何提高程序可靠性
- 如何编写函数处理数组、字符串和结构
- 递归的知识(函数在何时调用自身),如何用它实现分而治之的策略
- 函数指针:使程序员可以通过函数参数来命令函数使用另一个函数
函数探幽——C++中函数新增的特性
- 内联函数:提高程序执行速度,增加程序长度
- 引用变量:另一种将信息提供给函数的方法
- 默认参数:函数自动为函数调用中省略的函数参数提供值
- 函数重载:程序员可以创建多个参数列表不同的同名函数
- 函数模板:程序员可以制定相关函数族的设计
内存模型和名称空间
- 如何创建多文件程序
- 分配、管理内存的各种方式
- 作用域、连接、名称空间:决定了变量在程序的哪些部分是可见的
对象和类
- 类是用户定义的类型,对象(如变量)是类的实例
- 面向对象编程和类设计
- 对象声明:存储在对象中的信息以及客队对象执行的操作(类方法)
- 对象有公有部分、私有部分
- 特殊的类方法(构造函数和析构函数)在对象创建和释放时有作用
- 使用类实现ADT,如栈
使用类——深入了解类
- 运算符重载:使程序员能够定义和对象一起使用的运算符,如+
- 友元函数:可以访问外界世界不能访问的类数据
- 了解一些构造函数和重载运算符成员函数是如何被用来管理类的类型转换
类和动态内存分配
- 一般的,让类成员指向动态分配的内存很有用。如果在构造函数中使用new分配内存,就有责任提供适当析构函数,定义显式拷贝构造函数和显式赋值运算符
- 程序员在没有提供显式定义时将如何隐式生成成员函数及其行为
- 使用对象指针,了解对象模拟问题,扩充类方面的知识
类继承
- 派生类可以继承基类的特性,重用基类代码
- 公有继承:类似is-a关系,即派生对象是基对象的特例,如物理学家是科学家的特例
- 有些继承关系是多态的,相同的方法名称可能导致依赖于对象类型的行为。要实现这种行为要用新的成员函数——虚函数
- 有时使用抽象基类是实现继承关系的最佳方式
- 何时用公有继承
C++中的代码重用
- 公有继承——包含(has-a),例如汽车有轮子
- 私有继承、保护继承
- 类模板:使程序员可以使用泛型定义类,使用模板根据具体类型创建特定类,例如:栈模板使程序员可以创建整数栈和字符串栈
- 多重公有继承,一个类可以从多个类派生出来
友元、异常和其他
- 讨论了友元类、友元成员函数
- 异常开始,介绍C++新特性,函数参数不正确或内存耗尽等
- RTTI确定对象类型
- 一种更安全的方法实现不受限制的强制类型转换
String类和标准模板库
- 对于C风格字符串来说,string类是一种方便强大的替代方式
- auto_ptr类帮助管理那些动态分配的内存
- STL提供了几种类容器(链表、数组、队列、集合和映射)的模板表示
- 高效的泛型算法库,可用于STL容器,常规数组
- 模板类valarray为数值数组提供支持
输入、输出和文件
- 复习了C++ I/O,讨论如何格式化输出
- 使用类方法确认输入、输出流的状态
- 输入类型是否匹配、是否检测到文件尾
- 使用继承来派生用于管理文件输入输出的类
- 使用标准的I/O方法来读取和写入字符串
探讨C++新标准
- 复习C11新标准:新类型、统一的初始化语法、自动类型推断、新的智能指针、作用域内枚举
- 讨论新增的右值引用类型,如何使用它移动语义
- 介绍新增的类功能、lambda表达式、可变参数模板
预备知识
本章内容包括:
- C和C++的发展历史和原理
- 过程性编程和面向对象编程
- C++如何在C的基础上添加面向对象和泛型编程概念
- 编程语言标准
- 创建程序的技巧
过程性编程和面向对象编程的区别
过程性编程强调算法;面向对象编程强调数据
过程性编程试图使问题满足语言的过程性方法;面向对象编程视图让语言来满足问题的要求,设计和问题的本质特性相对应的数据格式
面向对象自下而上设计:从低级组织到高级组织;过程性编程自顶而下设计:大程序分为小任务
面向对象:将数据和方法合并为类定义、创建可重用代码、多态、继承
C++和泛型编程
- 泛型与面向对象目的相同:使创建可重用代码和抽象通用概念更简单
- 面向对象强调数据,泛型强调独立于特定数据类型
- 面向对象提供了管理大型项目的工具,泛型提供了执行常见任务的工具
- 泛型提供了排序时只写一个函数就可以用于各种实际类型的方法,模板提供了这种机制
C++的起源
- 面向对象提供了高级抽象,C提供了低级硬件访问
- 泛型编程、模板都很重要
C++标准
- C++98:添加了异常,运行阶段类型识别(RTTI)、模板、标准模板库(STL)
- C++11 1350页
程序创建技巧
- cin.get() 用于读取下一次键入
开始学习C++
进入C++
1 |
|
- main()函数
- 函数头:对函数与程序其他部分的接口做了总结
- DLL模块、嵌入式代码不需要main()
- 部分编程环境提供一个框架程序,它调用一些非标准函数,如_tmain(),这种情况下有个隐藏的main()调用它
- C++预处理器和iostream文件
- 在使用C++输入、输出工具时用
#include <iostream>
,using namespace std;
。第二句在C++98以后能用
- 在使用C++输入、输出工具时用
- 头文件名
- C中math.h变为cmath
- 对于纯粹的C++头文件而言,去除.h不只是形式上的变化,没有h的头文件也可以包括命名空间
- 命名空间
- 如果使用iostream而不是iostream.h,那么得加上
using namespace std
,这叫做using编译指令。命名空间用作区分两个来自不同作者的同名函数,用的时候a::hello(666);
,b::hello(999)
。 - 按照这种方式,变量、函数、类都是C++编译器的标准组件,现在被放在命名空间std中,只有在没.h时才是酱紫
- 然后捏,会发现我们没用.h也可以酱紫,那咱们就是说使用一手using编译指令。或者使用其中局部的函数或者类或者变量时:
using std::cout
、using std::endl
。
- 如果使用iostream而不是iostream.h,那么得加上
- cout输出
<<
符号实际上是按位左移运算符的重载,后面还会有&
既是地址运算符又是逻辑与,*
既是乘号又是对指针解除引用- endl是换行,他可以保证程序继续运行前刷新输出,\n不能
- 代码好习惯
- 每句占一行
- 函数的两个花括号各占一行
- 语句及时缩进
- 与函数名称相关的圆括号周围没有空格
C++语句
1 | // carrots.cpp -- food processing program |
- 声明语句和变量
- 声明语句叫定义声明,简称定义,他将导致编译器为变量分配内存空间
- 引用声明,它命令计算机使用在其他部分定义的变量
- 声明不一定是定义
- 赋值语句
carrots = 25
将整数25赋给变量carrots表示的内存单元a = b = c = 88
,88先给c,c再给b,b再给acarrots = carrots - 1
,计算机将carrots的值减一,再赋给carrots变量对应的存储单元
- cout的新花样
<<
插入运算符将根据其后数据类型调整其行为
其他C++语句
1 |
|
- 使用cout进行拼接
- 类简介
- 类定义描述的是数据格式及其用法,对象则是根据数据格式规范创建的实体
- cout是一个ostream类对象,cin是一个istream类对象
- 两种向类发送信息的方式,一种是使用类方法,另一种就是重新定义运算符,比如
<<
函数
1 | // sqrt.cpp -- using the sqrt() function |
1 | // ourfunc.cpp -- defining your own function |
1 |
|
- 有返回值的叫做函数,没有返回值的叫做过程
- main()的返回值提供给操作系统,0意味着程序运行成功
- 程序访问std的方式
- 函数定义前
using namespace std
- 特定函数定义中
using namespace std
- 特定函数中使用
using std:: cout
- 完全不用using,在需要时用
std::cout
- 函数定义前
复习题
- C++程序的模块叫:函数
- #include
用于最终编译之前,用iostream里的东西替代这个编译指令 - using namespace std;用于使程序可以使用std里的定义
- cout << “Hello, world!” << endl;
- int cheeses;
- cheeses = 32;
- cin >> cheeses;
- cout << “We have “ << cheeses << “varieties of cheese,”;
- 函数原型,返回值,形式参数
- 没有返回值
- 没导std||iostream||编译器不支持
编程练习
前言
1、C++包含多种编程范式:面向对象、泛型、传统的过程化编程
2、C++标准:C99、C03、C11
3、C++在C语言上新增了
- 类和对象(Class and Object)
- 继承(Extends)
- 多态、虚函数和RTTI(运行阶段状态识别)
- 函数重载
- 引用变量
- 泛型(独立于类型)编程,该技术由模板和标准模板库(STL)提供的
- 处理错误条件的异常机制
- 管理函数、类和变量名的名称空间
4、本书内容
预备知识
- 介绍了在C上添加C++面向对象特性的方法
- 面向过程、面向对象的区别
- 制定C++标准时所做工作
- 创建C++程序的技巧、几种C++编译器使用的方法
开始学习C++
- 创建C++程序的步骤
- main函数的角色
- 一些C++的语句:cin、cout等
- 函数——C++的编程模块
处理数据
- C++里有两种内置类型:整形、浮点型
- C++为各种程序都提供了几种类型
- 本章讨论着几种类型,以及创建变量、编写各种类型的常量
- C++如何处理各种类型的隐式、显式转换
复合类型
- C++使程序员可以通过基本的内置类型构造更复杂的类型,最高级的是类,在9~13章讨论。本章讨论其他形式:数组、结构体、指针
- 创建和存储文本字符串
- 使用C-风格字符数组、C++ String类处理文本输入输出
- 含显式管理内存的new、delete运算符在内的C++内存分配方式
循环和关系表达式
- C++提供了三种循环结构:for、while、do-while
- 创建逐字符读取和处理输入的循环
- 如何创建二维数组,并使用嵌套循环来处理
分支和逻辑运算符
- if、if-else、switch、条件运算符
- 使用逻辑运算符表达决策测试
- 确定字符关系(如测试字符是数字还是非打印字符)的函数库cctype
- 简要介绍文件输入/输出
函数——C++的编程模块、C++与C的函数的共有特性
- 函数定义通用格式
- 函数原型如何提高程序可靠性
- 如何编写函数处理数组、字符串和结构
- 递归的知识(函数在何时调用自身),如何用它实现分而治之的策略
- 函数指针:使程序员可以通过函数参数来命令函数使用另一个函数
函数探幽——C++中函数新增的特性
- 内联函数:提高程序执行速度,增加程序长度
- 引用变量:另一种将信息提供给函数的方法
- 默认参数:函数自动为函数调用中省略的函数参数提供值
- 函数重载:程序员可以创建多个参数列表不同的同名函数
- 函数模板:程序员可以制定相关函数族的设计
内存模型和名称空间
- 如何创建多文件程序
- 分配、管理内存的各种方式
- 作用域、连接、名称空间:决定了变量在程序的哪些部分是可见的
对象和类
- 类是用户定义的类型,对象(如变量)是类的实例
- 面向对象编程和类设计
- 对象声明:存储在对象中的信息以及客队对象执行的操作(类方法)
- 对象有公有部分、私有部分
- 特殊的类方法(构造函数和析构函数)在对象创建和释放时有作用
- 使用类实现ADT,如栈
使用类——深入了解类
- 运算符重载:使程序员能够定义和对象一起使用的运算符,如+
- 友元函数:可以访问外界世界不能访问的类数据
- 了解一些构造函数和重载运算符成员函数是如何被用来管理类的类型转换
类和动态内存分配
- 一般的,让类成员指向动态分配的内存很有用。如果在构造函数中使用new分配内存,就有责任提供适当析构函数,定义显式拷贝构造函数和显式赋值运算符
- 程序员在没有提供显式定义时将如何隐式生成成员函数及其行为
- 使用对象指针,了解对象模拟问题,扩充类方面的知识
类继承
- 派生类可以继承基类的特性,重用基类代码
- 公有继承:类似is-a关系,即派生对象是基对象的特例,如物理学家是科学家的特例
- 有些继承关系是多态的,相同的方法名称可能导致依赖于对象类型的行为。要实现这种行为要用新的成员函数——虚函数
- 有时使用抽象基类是实现继承关系的最佳方式
- 何时用公有继承
C++中的代码重用
- 公有继承——包含(has-a),例如汽车有轮子
- 私有继承、保护继承
- 类模板:使程序员可以使用泛型定义类,使用模板根据具体类型创建特定类,例如:栈模板使程序员可以创建整数栈和字符串栈
- 多重公有继承,一个类可以从多个类派生出来
友元、异常和其他
- 讨论了友元类、友元成员函数
- 异常开始,介绍C++新特性,函数参数不正确或内存耗尽等
- RTTI确定对象类型
- 一种更安全的方法实现不受限制的强制类型转换
String类和标准模板库
- 对于C风格字符串来说,string类是一种方便强大的替代方式
- auto_ptr类帮助管理那些动态分配的内存
- STL提供了几种类容器(链表、数组、队列、集合和映射)的模板表示
- 高效的泛型算法库,可用于STL容器,常规数组
- 模板类valarray为数值数组提供支持
输入、输出和文件
- 复习了C++ I/O,讨论如何格式化输出
- 使用类方法确认输入、输出流的状态
- 输入类型是否匹配、是否检测到文件尾
- 使用继承来派生用于管理文件输入输出的类
- 使用标准的I/O方法来读取和写入字符串
探讨C++新标准
- 复习C11新标准:新类型、统一的初始化语法、自动类型推断、新的智能指针、作用域内枚举
- 讨论新增的右值引用类型,如何使用它移动语义
- 介绍新增的类功能、lambda表达式、可变参数模板
预备知识
本章内容包括:
- C和C++的发展历史和原理
- 过程性编程和面向对象编程
- C++如何在C的基础上添加面向对象和泛型编程概念
- 编程语言标准
- 创建程序的技巧
过程性编程和面向对象编程的区别
过程性编程强调算法;面向对象编程强调数据
过程性编程试图使问题满足语言的过程性方法;面向对象编程视图让语言来满足问题的要求,设计和问题的本质特性相对应的数据格式
面向对象自下而上设计:从低级组织到高级组织;过程性编程自顶而下设计:大程序分为小任务
面向对象:将数据和方法合并为类定义、创建可重用代码、多态、继承
C++和泛型编程
- 泛型与面向对象目的相同:使创建可重用代码和抽象通用概念更简单
- 面向对象强调数据,泛型强调独立于特定数据类型
- 面向对象提供了管理大型项目的工具,泛型提供了执行常见任务的工具
- 泛型提供了排序时只写一个函数就可以用于各种实际类型的方法,模板提供了这种机制
C++的起源
- 面向对象提供了高级抽象,C提供了低级硬件访问
- 泛型编程、模板都很重要
C++标准
- C++98:添加了异常,运行阶段类型识别(RTTI)、模板、标准模板库(STL)
- C++11 1350页
程序创建技巧
- cin.get() 用于读取下一次键入
开始学习C++
进入C++
1 |
|
- main()函数
- 函数头:对函数与程序其他部分的接口做了总结
- DLL模块、嵌入式代码不需要main()
- 部分编程环境提供一个框架程序,它调用一些非标准函数,如_tmain(),这种情况下有个隐藏的main()调用它
- C++预处理器和iostream文件
- 在使用C++输入、输出工具时用
#include <iostream>
,using namespace std;
。第二句在C++98以后能用
- 在使用C++输入、输出工具时用
- 头文件名
- C中math.h变为cmath
- 对于纯粹的C++头文件而言,去除.h不只是形式上的变化,没有h的头文件也可以包括命名空间
- 命名空间
- 如果使用iostream而不是iostream.h,那么得加上
using namespace std
,这叫做using编译指令。命名空间用作区分两个来自不同作者的同名函数,用的时候a::hello(666);
,b::hello(999)
。 - 按照这种方式,变量、函数、类都是C++编译器的标准组件,现在被放在命名空间std中,只有在没.h时才是酱紫
- 然后捏,会发现我们没用.h也可以酱紫,那咱们就是说使用一手using编译指令。或者使用其中局部的函数或者类或者变量时:
using std::cout
、using std::endl
。
- 如果使用iostream而不是iostream.h,那么得加上
- cout输出
<<
符号实际上是按位左移运算符的重载,后面还会有&
既是地址运算符又是逻辑与,*
既是乘号又是对指针解除引用- endl是换行,他可以保证程序继续运行前刷新输出,\n不能
- 代码好习惯
- 每句占一行
- 函数的两个花括号各占一行
- 语句及时缩进
- 与函数名称相关的圆括号周围没有空格
C++语句
1 | // carrots.cpp -- food processing program |
- 声明语句和变量
- 声明语句叫定义声明,简称定义,他将导致编译器为变量分配内存空间
- 引用声明,它命令计算机使用在其他部分定义的变量
- 声明不一定是定义
- 赋值语句
carrots = 25
将整数25赋给变量carrots表示的内存单元a = b = c = 88
,88先给c,c再给b,b再给acarrots = carrots - 1
,计算机将carrots的值减一,再赋给carrots变量对应的存储单元
- cout的新花样
<<
插入运算符将根据其后数据类型调整其行为
其他C++语句
1 |
|
- 使用cout进行拼接
- 类简介
- 类定义描述的是数据格式及其用法,对象则是根据数据格式规范创建的实体
- cout是一个ostream类对象,cin是一个istream类对象
- 两种向类发送信息的方式,一种是使用类方法,另一种就是重新定义运算符,比如
<<
函数
1 | // sqrt.cpp -- using the sqrt() function |
1 | // ourfunc.cpp -- defining your own function |
1 |
|
- 有返回值的叫做函数,没有返回值的叫做过程
- main()的返回值提供给操作系统,0意味着程序运行成功
- 程序访问std的方式
- 函数定义前
using namespace std
- 特定函数定义中
using namespace std
- 特定函数中使用
using std:: cout
- 完全不用using,在需要时用
std::cout
- 函数定义前
复习题
- C++程序的模块叫:函数
- #include
用于最终编译之前,用iostream里的东西替代这个编译指令 - using namespace std;用于使程序可以使用std里的定义
- cout << “Hello, world!” << endl;
- int cheeses;
- cheeses = 32;
- cin >> cheeses;
- cout << “We have “ << cheeses << “varieties of cheese,”;
- 函数原型,返回值,形式参数
- 没有返回值
- 没导std||iostream||编译器不支持