C++Programming(04737)
C++Programming
第一章 C++
语言简介
-
C++
语言的发展简史C
语言是C++
语言的前身, 在进一步扩充和完善C
语言的基础上得到了C++
语言。- 用
C++
语言写成的程序称为源程序, 源程序必须经过C++
编译程序翻译成机器语言才能执行 - 一般需要经过编辑 、编译 、连接 、运行
-
C++
语言的特点(与 C 语言相比, C++语言的优点)- 从程序运行的稳定性来说, C++语言更安全, 它支持过程化编程 、面向对象编程和泛型编程
- C++语言可运行于多种平台上, 如 Windows 、MAC 操作系统及 UNIX 的多种版本
- C++语言中加入了面向对象的概念, C++的程序结构与 C 语言的程序结构存在很大差别
-
基本的输入/输出
-
C++
类中对象- cin:运算符为
>>
,用于键盘输入。函数scanf()
;输入流类istream
- cout:运算符为
<<
,用于屏幕输出。函数printf()
;输出流类ostream
- cin:运算符为
- 流提取运算符和流插入运算符都是由两个连续的符号组成的,中间不能有其他符号
- %c 是输岀单个字符的格式控制符。
%s
是输出字符串的格式控制符 - 当使用当程序中用到 cin 和 cout 时,需要在程序中包含头文件
<iostream>
- 语句以分号
;
结尾
-
-
头文件和命名空间
程序员还可以定义自己的头文件,并在程序中使用 #include 指令将其包含进来。通常,使用尖括号 括住系统提供的头文件,使用双引号括住程序员自己定义的头文件
-
常用的头文件有以下一些
- 标准输入输出流:
<iostream>
- 标准文件流:
<fstream>
- 标准字符串处理函数:
<string>
- 标准数学函数:
<cmath>
- 标准输入输出流:
-
using
语句引用其他命名空间的标识符的语法格式有两种形式using
命名空间名::
标识符;using namespace
命名空间名
-
-
强制类型转换运算符
-
数据类型级别由低到高分别为:
char→int→float→double
。当不同类型的量进行混合算术运算时,系统自动进行合理的类型转换。编译器就会自动把低级类型向高级类型转换 -
使用强制类型转换运算符
static_cast
或是const_cast
进行转换static_cast
将一种数据类型转换成另一种数据类型,格式:static_cast<类型名>(表达式)static_cast
也可以省略。const_cast
去除指针和引用的常量性,但不能去除变量的常量性。:const_cast<类型名>(表达式)
-
-
函数参数的默认值
- C++语言规定,提供默认值时必须按从右至左的顺序提供,即有默认值的形参必须在形参列表的 最后。如果有某个形参没有默认值,则它左侧的所有形参都不能有默认值
- 调用函数时,主调函数的实参与被调函数的形参按从左至右的顺序进行匹配对应。如果实参的个数与形参的个数相等,则它们一一对应。如果实参的个数 m 少于形参的个数 n,则函数原型形参表中最前面的 m 个形参与 m 个实参相对应,后面的 n-m 个形参则使用默认值进行初始化
- 无返回值函数:没有返回值的
return
语句只能用在返回类型是void
的函数中。有返回值函数:return
语句的第二种形式提供了函数的结果。 只要函数的返回类型不是void
,则该函数内的每条 return 语句必须返回一个值
-
引用和函数参数的传递
- 引用相当于给变量起了一个别名。定义格式:类型名 &引用名=同类型的某变量名;
- 在 C++中,函数调用时参数的传递有两种方式:传值和传引用。
- 传值:实际上是传递对象的值。即将实参的值拷贝给形参。在函数执行过程中,都是对这个拷贝进行操作的,函数执行完毕返回后,形参的值并不拷贝回实参,也就是说函数内部对形参的改变不会影响到函数外实参的值。
- 传引用:传递对象的首地址值。函数调用时,实参对象名传递给形参对象名,形参对象名就成为实参对象名的别名,即形参是对应实参的引用,它们是等价的,代表同一个对象,也可以看作是将实参的地址传递给了形参
-
const
与指针共同使用可以简单地记住 const 的修饰规则:const 修饰其左侧的内容;如果 const 是本行的第一个标识符,则它修饰其右侧的内容
- C++语言也可以使用 const 限定访问权限,const 修饰指针变量时,基本含义如下
- 如果唯一的 const 位于符号
*
的左侧,表示指针所指数据是常量,数据不能通过本指针改变,但可以通过其他方式进行修改;指针本身是变量,可以指向其他的内存单元 - 如果唯一的 const 位于符号
*
的右侧,表示指针本身是常量,不能让该指针指向其他内存地址;指针所指的数据可以通过本指针进行修改 - 在符号
*
的左右各有一个 const 时,表示指针和指针所指数据都是常量,既不能让指针指向其他地址,也不能通过指针修改所指向的内容
- 如果唯一的 const 位于符号
- C++语言也可以使用 const 限定访问权限,const 修饰指针变量时,基本含义如下
-
内联函数
- 引入了内联函数的目的:加快执行速度。定义内联函数时只需在函数头返回值类型的前面加上关键字 inline。
- 内联函数的适用情况:只有几条语句,且频繁调用的小函数。
- 在 C++中,除具有循环语句、switch 语句的函数不能说明为内联函数外,其他函数都可以说明为内联函数
-
函数的重载
- 函数重载:是指在程序的同一范围内声明几个功能类似的同名函数。即前提是函数名相同。可提高代码可读性。
函数重载可使一个函数名具有多种功能,即具有
多种形态
,称这种特性为多态性。 - 实现函数的重载必须满足下列条件之一:
- 参数表中对应的参数类型不同。
- 参数表中参数个数不同
- 函数重载:是指在程序的同一范围内声明几个功能类似的同名函数。即前提是函数名相同。可提高代码可读性。
函数重载可使一个函数名具有多种功能,即具有
-
指针和动态内存分配
- 指针变量中保存的是一个地址,有时也称指针指向一个地址
- 使用
new
运算符动态申请的内存空间,需要在使用完毕释放。C++提供了delete
运算符,用来释放动态分配的内存空间- 使用
new
运算符实现动态内存分配。p=new T
; 其中,T 是任意类型名,p 是类型为T*
的指针。 - 使用
new
运算符还可以动态分配一个任意大小的数组:p=new T[N]
; 其中,T 是任意类型名,p 是类型为 T*
的指针,N 代表数组元素个数
,可以是任何的值为正整数的表达式。 - C++提供了
delete
运算符,用来释放动态分配的内存空间,基本用法:delete 指针
- 使用
- 当
delete
释放动态对象数组时,实现为delete []ptr;
- 数组的下标从 0 开始,含 n 个元素的数组的下标范围是从
0〜n-1
。
-
用
string
对象处理字符串- 字符常量:用单引号括起来的单个字符或转义字符。字符串常量:用双引号括起来。
- 大小写字母 ASCII 码差 32。
string
类中的常用成员函数int size() const;
返回当前字符串的大小int length() const;
返回当前字符串的长度bool empty() const;
判定当前字符串是否为空find();
返回 str 在字符串中第一次出现的位置,如果没找到则返回-1insert();
在 p 位置插入字符串 Sappend();
将字符串 s 连接到当前字符串的结尾处substr();
返回从 pos 开始的 n 个字符组成的字符串
-
C++语言的程序结构
- 程序中必须有且仅有一个主函数
main()
,这是程序执行的总入口。 - C++程序中,仍沿用 C 语言的注释风格,即注释有以下两种形式。
- 从
/*
开始,到*/
结束,这之间的所有内容都视作注释。 - 从
//
直到行尾,都是注释。
- 从
- 程序中必须有且仅有一个主函数
第二章 面向对象的基础概念
-
结构化程序设计
- 在编写程序时,使用 3 种基本控制结构来构造程序
- 顺序、选择、循环基本控制结构
-
面向对象思想的提出
- 对象是类的一个实例。对象是类的一个具象,类是对象的一个抽象
- 面向对象技术把问题看成是相互作用的事物的集合,也就是对象的集合
- 对象特性:一是状态(也称为属性);二是行为(也称为操作)。状态是指对象本身的信息,也称为属性;行为是对对象的操作
- 通过对事物的抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),从而得到类的概念
-
面向对象程序设计的概念和特点
- 抽象:在面向对象的程序设计方法中,将同一类事物的共同特点概括出来。对象的特点包括两个方面:属性和操作。C++中使用对象名、属性和操作三要素来描述对象
- 封装:将对象的属性及实现细节隐藏起来,只给出如何使用的信息。将数据成员使用
private
关 键字定义,则产生封装性 - 继承:就是在编写一个
新
类的时候,以现有的类作为基础,使得新类从现有的类派生
而来,从而达到代码扩充和代码复用的目的。原来的类是基类,也称为父类或超类。新类是派生类,也称为子类 - 多态:是指不同种类的对象都具有名称相同的行为,而具体行为的实现方式却有所不同
-
类的定义
- 标识符命名规则:字母、数字和下划线的组合,大小写敏感,但不能以数字开头,也不能和系统中使用的关键字完全相同
- 类中定义的数据和函数称为这个类的成员(数据成员和成员函数)
-
类体外函数定义的前面必须用
类名::
来限定,格式如下1 2 3 4
返回值类型 类名::成员函数(参数列表) { 成员函数的函数体 }
-
程序结构
.h
文件是头文件.cpp
文件是源程序文件C
源程序文件编译而成的目标文件的扩展名是.obj
- 可执行代码的文件扩展名为
.exe
(这需要根据操作系统)
-
创建类对象的基本形式
- 使用
类名 *对象指针名 = new 类名;
创建对象时,调用无参的构造函数。如果这个构造函数是由编译器为类提供的,则类中成员变量不进行初始化 - 使用
类名 *对象指针名 = new 类名();
创建对象时,也调用无参的构造函数。如果这个构造函数是由编译器为类提供的,则对类中的成员变量进行初始化
- 使用
-
访问对象的成员
- 使用对象:如果变量 a 为结构体对象,且结构体内有元素 b,那么可以使用
a.b
的方式访问元素。 - 使用指针:如果变量 a 为结构体指针,且结构体内有元素 b,那么可以使用
a->b
的方式访问元素。 - 使用引用:访问成员时仍使用点操作符,即
引用名.成员名
。
- 使用对象:如果变量 a 为结构体对象,且结构体内有元素 b,那么可以使用
-
访问范围说明符的含义
private
私有的 使用它修饰的类的成员仅能在本类内被访问默认public
公有的 使用它修饰的类的成员可以在程序的任何地方被访问protected
保护的 它的作用介于public
与private
之间,使用它修饰的类的成员能在本类内及子类中被访问
-
标识符的作用域与可见性
- 函数原型作用域:在声明函数原型时形参的作用范围就是函数原型作用域,最小的作用域
- 局部作用域:程序中使用相匹配的一对大括号括起来的一段程序称为块。作用域局限在块内的称为局部作用域
- 类作用域:类可以被看成是一组有名字的成员的集合,类
X
的成员m
具有类作用域,对m
- 访问方式有如下 3 种:
- 直接访问成员
m
- 在类外,通过表达式
x.m
或者X::m
来访问 - 在类外,可以通过
ptr->m
表达式来访问
- 直接访问成员
- 访问方式有如下 3 种:
- 命名空间作用域:在命名空间内部可以直接引用当前命名空间中声明的标识符,如果需要引用其他命名空间的标识符,需要使用下面的方式:
命名空间名::标识符名
第三章 类和对象的进阶重点
-
构造函数函数
- 对于 C++中基本数据类型的变量,可以声明全局变量和函数内部的局部变量
- 全局变量:如果没有进行初始化,则系统自动为其初始化为 0。这个工作在程序启动时完成
- 局部变量:系统不进行自动初始化,如果程序员没有设定,则是一个随机值
- 构造函数的作用:完成对象的初始化工作(即创建对象)。构造函数是类中的特殊成员函数,它属于类的一部分
- 声明对象后,可以使用
new
运算符为对象进行初始化,此时调用的是对象所属类的构造函数
- 对于 C++中基本数据类型的变量,可以声明全局变量和函数内部的局部变量
-
析构函数的定义
- 构造函数的函数名与类名相同,没有返回值。一个类的构造函数可以有多个,即构造函数允许重载。即这些构造函数之间的关系是重载关系
- 当类中没有定义任何构造函数时,系统会自动添加一个参数表为空、函数体也为空的构造函数,称为默认构造函数
-
定义构造函数的形式
1 2 3 4 5 6
类名::类名(行参1、行参2,....n) { x1 = 行参1; x2 = 行参2; xn = n; }
-
构造函数的使用
- 如果程序中声明了对象数组,即数组的每个元素都是一个对象
- 创建对象时,调用一次构造函数
- 对于指针,仅是说明了这个指针,并未与对象相关,所以并不调用构造函数
- 如果构造函数的定义中给出了参数的默认值,那么使用构造函数创建对象时,对应的实参是可以省略的。此时,使用默认值当作对应实参的值
-
复制构造函数
- 复制构造函数是构造函数的一种,也称为拷贝构造函数。它的作用是使用一个已存在的对象去初始化另一个正在创建的对象
- 复制构造函数只有一个参数,参数类型是本类的引用。即引用类自己
- 对于类 A 而言,复制构造函数的原型如下
(格式一):A::A(const A&)
(格式二):A::A(A&)
-
析构函数
- 与构造函数一样,析构函数也是成员函数的一种,它的名字也与类名相同,但要在类名前面加一个
〜
字符,以区别于构造函数 - 析构函数的特点:没有参数,也没有返回值。析构函数不可以多于一个,不会有重载的析构函数。默认析构函数的函数体为空。一个类中有且仅有一个析构函数
- 创建对象时自动调用构造函数,在对象消亡时自动调用析构函数
- 与构造函数一样,析构函数也是成员函数的一种,它的名字也与类名相同,但要在类名前面加一个
-
静态变量
static
用来声明静态变量- 局部变量:块内定义的变量,从定义之处开始到本块结束处为止是局部变量的作用域
- 全局变量:指在所有花括号之外声明的变量,其作用域范围是全局可见的,即在整个项目文件内都有效
-
类的静态成员
- 类的静态成员有两种:静态成员变量和静态成员函数。
- 给静态成员变量赋初值的格式:
类型 类名::静态成员变量=初值;
- 访问类静态成员格式
- 类名::静态成员名
- 对象名.静态成员名
- 对象指针->静态成员名
- 静态成员变量只有一份,被同类所有对象共享。甚至可以在还没有任何对象生成时就访问一个类的静态成员
-
常量成员和常引用成员
- 使用关键字 const 修饰的量称为常量
- 在对象被创建以后,其常量成员变量的值就不允许被修改,只可以读取其值。对于常量对象,只能调用常量函数
- 总之常量成员变量的值不能修改常量对象中的各个属性值均不能修改
-
友元
- 友元使用关键字 friend 标识
- 友元的概念破坏了类的封装性和信息隐藏,但有助于数据共享,能够提高程序执行的效率
-
友元函数
- 在友元函数内部可以直接访问本类对象的私有成员。
- 在类定义中,将一个全局函数声明为本类友元函数:
friend
返回值类型 函数名(参数表);当有某类 A 的定义后,将类 A 的成员函数说明为本类的友元函数:friend 返回值类型 类 A::类 A 的成员函数名(参数表);
- 一个类的成员函数(包括构造函数和析构函数)可以通过使用 friend 说明为另一个类的友元,但友元函数本身并不是类的成员函数,但允许访问类中的所有成员
3 类的静态成员(重点)
4 变量及对象的生存期和作用域
5 常量成员与常引用成员
6 成员对象和封闭类
7 友元
8 this 执政(难点)
第四章 运算符重载重点
1 运算符重载概念
2 重载复制运算符
3 重载流插入运算符和流提取运算符
4 重载强制类型转换运算符
5 重载自增、自减运算符
第五章 类的继承与派生重点
1 类的继承与派生
2 访问控制
3 派生类的构造函数和析构函数
4 类之间关系
5 多层次派生
6 基类与派生类指针的互相转换
第六章 多态与虚函数重点
1 多态的基本概念
2 多态实例
3 多态的使用
4 虚析构函数
5 纯虚函数和抽象类
第七章输入/输出流
1 流类简介
2 标准流对象
3 控制 I/O 格式
4 调用 cout 的成员函数
5 调用 cin 的成员函数
第七章文件操作
1 文件基本概念和文件流类
2 打开和关闭文件
3 文件读写操作
4 随机访问文件
第七章函数模版与类模版
1 函数模版
2 类模版
This post is licensed under
CC BY 4.0
by the author.