C++语言程序设计关键概念笔记

一级目录

结构化程序设计

思路:

  • 自顶向下逐步求精
  • 程序结构按功能划分为形成树状结构的若干基本模块
  • 各模块功能简单且独立
  • 模块内部由顺序、选择和循环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"; 

string类(操作符、成员函数等)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章