C++语言程序设计关键概念笔记
- 一级目录
- 结构化程序设计
- 面向对象的方法
- 对象
- 类
- 封装
- 继承
- 多态
- 面向对象的软件开发
- 信息的表示与存储
- 信息存储单位
- 原码反码补码
- 程序开发
- 变量
- 符号常量
- sizeof
- 值传递与引用传递
- 内联函数
- 带默认形参的函数
- 函数重载
- 类
- 对象
- 类成员函数初始值
- 内联成员函数
- 构造函数
- 构造函数重载:有参数和无参数
- 复制构造函数
- 析构函数
- 类组合
- 前向引用声明
- UML语言(Unified Modeling Language)
- 结构体
- 联合体union
- 位域
- 作用域
- 对象的生存期
- 类的静态成员
- 类的友元friend
- 共享数据的保护
- c++ 多文件结构与编译预处理
- 编译预处理
- 数组
- 对象数组
- 指针
- 指针数组 数组指针
- 指针作为函数形参
- 指针型函数 指向函数的指针
- 对象指针
- this指针
- 指向类的非静态成员 & 静态成员 指针
- 动态内存分配
- 被封装的数组对象Vector
- 深复制与浅复制
- 字符数组存储字符串
- string类(操作符、成员函数等)
一级目录
结构化程序设计
思路:
- 自顶向下逐步求精
- 程序结构按功能划分为形成树状结构的若干基本模块
- 各模块功能简单且独立
- 模块内部由顺序、选择和循环3种基本结构
- 模块实现的具体方法是子程序
面向对象的方法
首先他将数据以及对数据的操作方法放在一起,作为一个相互依存、不可分离的整体——对象。对同类型对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。
对象
系统用来描述客观事物的一个实体,有一组属性和一组行为构成。
类
具有相同属性和服务的一组对象的集合。
封装
把对象的属性和服务结合成一个独立的系统单位,并尽可能的隐蔽对象的内部细节。
继承
特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。
多态
在一般类中定义的属性或行为,被特殊的类继承之后,可以具有不同的数据类型或表现出不同的行为。
面向对象的软件开发
面向对象的软件工程
- 分析
- 设计
- 编程
- 测试
- 维护
信息的表示与存储
信息:控制信息、数据信息
控制信息:指令、控制字
数据信息:数值信息、非数值信息
数值信息:定点数、浮点数
非数值信息:字符数据、逻辑数据
信息存储单位
位bit、字节byte、字word、机器字长
原码反码补码
反码:原码符号位不变,其余取反;补码=反码+1
程序开发
源码、目标程序、翻译程序、汇编程序、编译程序、解释程序
程序编辑:.cpp
程序编译:.obj 错误为语法错
程序连接:.exe 错误为连接错
变量
一般声明变量时完成变量定义(分配内存单元),声明外部变量例外。
符号常量
声明时一定要赋值
const float PI = 3.14;
const float PI;
PI = 3.14;错误
sizeof
计算某类型对象所占字节数
值传递与引用传递
值传递: int i 实参传形参,形参的变化不会影响实参
引用传递: int &i 可以认为该形参为实参的另一个别名,影响实参值
内联函数
不是调用函数,而是在编译时将函数体嵌入此部分
inline double exam()
{
return 1.5+1.5;
}
void main()
{
double a=exam();//a=1.5+1.5
}
带默认形参的函数
有默认形参的函数必须在形参最后
int add(int x = 0, int y = 0) //正确
int add(int x = 0, int y) //错误
函数重载
功能相近的函数在相同的作用域以相同函数名定义,形成重载。
重载函数的形参必须不同:个数不同或者类型不同
类型不同
int add(int a, int b);
int add(flaot a, float b);
个数不同
int add(int a, int b);
int add(int a, int b, int c);
类
类的成员包括数据成员和函数成员,访问控制属性有三种:
公有类型(public):定义了类的外部接口
私有属性(private):只能由本类的成员函数访问。若定义紧跟类名,则可以省略。
保护属性(protect):与私有属性类似,差别在于继承过程对产生的新类的影响。
就像没有报时和调整时间的时钟,没有任何接口的类无法使用。故要设计必要的外部接口。
对象
对象所占的内存空间只用于存放数据成员,函数成员不在每一个对象中存储。函数代码只占据一份空间。
类成员函数初始值
写在类定义里,不可写在类外的函数里。
内联成员函数
减少调用开支,提高执行效率,但是会增加编译后的代码长度。
分为隐式声明和显式声明
构造函数
也是类的成员函数,将对象初始化为一个特定的状态,与类名相同,且没有返回值。在被构建时自动调用。
若类中定义了构造函数并且带有形参,则实例化时必须给出初始值,否则会产生错误。
构造函数重载:有参数和无参数
class clock()
{
public:
clock(int a, int b, int c);
clock()
{
hour = 0;
mintue = 0;
second = 0;
}
void settime();
private:
int hour, mintue, second;
}
//其他函数省略
int main()
{
clock c1(0,0,0);
clock c2;
}
复制构造函数
public clock(clock &c) //类内
clock::clock(clock &c) //类外
{
hour=c.hour;
}
析构函数
对象消失释放内存
public:
~clock(){}
类组合
类的组合描述就是一个类中内嵌另一个类的对象作为成员的情况,并且在创建对象时首先被自动创建。既要对本类逇基本类型数据成员进行初始化,又要对内嵌对象进行初始化。
前向引用声明
类a中用到类b,类b在后面定义,则对类b进行前向声明class b;
UML语言(Unified Modeling Language)
public | private | protect |
---|---|---|
+ | - | # |
对象下面画横线
依赖关系、作用关系(关联)、包含关系(聚集和组合)
注释
结构体
c++:结构体和类相似,有数据成员、函数成员,构造函数、析构函数、可以控制访问权限,可以继承支持多态等。唯一区别在于结构体与类具有不同的默认访问控制属性:类中未指定的成员其属性为private;结构体中方未指定的类型为公有类型
c++为什么引入结构体:保持和c的兼容性(c中结构体只有定义数据成员,不能定义函数成员;c中属性为公有)
c中structure一词用来描述面向对象的抽象数据类型不贴切,加上c的struct根深蒂固,故选择class一词。
故一般用struct则数据成员一般都是公有属性
联合体union
联合体的全部数据成员贡献同一组内存单元,并且成员至多只有一个是有意义的。一般存储共有数据不定义函数
union name()
{
公有成员
protected:
保护型成员
private:
私有成员
}
位域
一种允许将类中的多个数据成员打包,从而使不同成员可以共享相同的字节机制
作用域
对象的生存期
静态生存期 static
动态生存期
类的静态成员
静态数据成员
静态函数成员
类的友元friend
提供了不同类或者对象的成员函数之间、类的成员函数与一般函数之间进行的数据共享机制。
共享数据的保护
常对象
常成员函数
常数据成员
常引用
c++ 多文件结构与编译预处理
编译预处理
#include
#define
#undef
#if #endif
#ifdef
#ifndef
defined
数组
数组越界错误
行优先存储:每行元素是按照列下标由小到大次序存放
当数组初始化未定义值,静态生存期的数组被赋予0;动态生存期的数组每个初始值是不确定的。
声明为常量的数组必须给定初值。
使用数组名作为函数参数,传入的是地址。对函数形参的操作直接影响到实参的相应元素。
对象数组
数组里每个都是对象
Clock a[2];
指针
数组名称实际就是不能被赋值的指针。
可以声明指向常量的指针,声明指针类型的常量
空指针
int * p;
*p = 0;
or
int * p = NULL;
把数组作为函数形参,等价于把指向数组元素的指针作为形参
void f(int p[]);
void f(int p[3]);
void f(int *p)
指针数组 数组指针
指针数组:数组里每个元素都是指针
数组指针:指向数组的指针
指针作为函数形参
指针型函数 指向函数的指针
指针函数:函数类型是指针,返回指针型结果
函数指针:指向函数的指针。存放指向函数的地址
对象指针
指向对象的指针,存放指向对象的指针地址。
this指针
用于指向正在被成员函数操作的对象
指向类的非静态成员 & 静态成员 指针
动态内存分配
内存泄漏:用new分配的内存必须delete加以释放,否则会导致分配的内存无法回收,使得程序占据的内存越来越大
被封装的数组对象Vector
深复制与浅复制
字符数组存储字符串
每个字符一个字节,末尾\0
char str[8]={'p','r','o','g','r','a','m','\0'};
char str[8]= "program";
char str[] = "program";