C++学习笔记

            C++笔记
零,处理过程
在C++中一个程序是由多个文件组成的,将一个程序代码按照一定的方式进行划分
程序经过豫编译,编译,连接 形成可执行程序
三个过程都是将一种形式的代码改变成另一种形式代码的过程
预编译:形成纯粹C++的程序文件
编译:形成二进制代码文件过程
连接:将所有二进制代码文件和用到的库文件连接起来,形成可执行程序
由此可见,程序的编译是以文件为单位进行的
        文件信息的共享过程
对于变量在另一个文件中加入extern int x;格式语句
对于文件直接使用文件原形
   1 文件的基本结构
1数据和语句(对数据的操作)  
2数据分为基本数据类型的数据(C++语言规定的)和 自定义的(将基本数据进行  组合) 其本身有自己的属性数据类型 对数据的操作都是基其起类型 因为不同  数据类型的物理存储结构不同
3语句处理数据并控制计算流程 可把其当作一个数据加工厂 可以对其插入数据
 它也可以输出数据 或传递数据。
 主要有四种复合语句
   说明和定义语句
   表达式语句
   流程控制语句
   异常处理语句
 2 文件处理流程
将一组函数组织形成一个模块,也可以将相关类的定义组织在一起形成一个模块,      
而模块相连就构成了程序。
main函数是程序开始的接口 他是被调用的第一个函数,其他任何函数都直接或是
间接的由main函数调用,main函数有两个默认参数,一个是字符串数组(输入的
命令),一个是一个整数,(字符串的个数)
void main (int argc,char *argv[ ])
     3 物理处理过程
通过编辑器将程序输入到计算机 以原文件方式存储
通过编译器将源程序文件翻译成目标代码,目标代码以汇编语言的形式存放
通过连接器将目标代码和库函数连接在一起,组成一个完整的可执行程序。
各种工具性程序连接起来,形成一个完整的开发环境成为集成开发环境(IDE)
     4 生存期问题
变量的生存期可以分为静态生存期,局部生存期,动态生存期三种
全局变量,静态全局变量,静态局部变量都具有静态生存期,存放在内存的全局
数据区,初始化自动为0
局部变量具有局部生存期,并且存放在内存的栈区,不自动初始化。
在程序中动态申请的空间处于内存的堆区,生存的长短取决于程序动态运行的结果
静态局部作用域又是具有静态生命期的特殊的变量,它常被用来记录函数的运行
的状态。
一,预处理命令
1,宏定义命令 例如:#deifine PI 3 作用将3用PI代替
2,文件包含指令 例如:#include<类库文件名> #include"自定义文件名"
 Include一般包含头文件,表示将后面文件插入到当前文件
头文件用来存放共享的信息
3,条件编译命令 例如:形式#ifdef<标式符>
<程序段1>
[#else
<程序段2>]
#endif
二,数据类型
1。基本数据类型
整型,浮点型,字符型(ASCII码),双精度型 (8) ,无值
    2。构造数据类型
1引申数据类型
 指针 引用
2结构化数据类型
数组 结构 联合 位域 枚举 类
    3 数据类型的含义
1 为该变量分配多大的内存空间
2 如何解释该存储空间中的二进制数位
    注意:计算机内存的单元是字节,1个字节代表8个二进制数位
  不同的计算机中,同一数据类型占据的空间不一定相同
  数据占用内存字节的多少决定了其表达能力的范围
  计算机对内存中存放的同样信息的解释会因其所表示的数据类型不同二不同
       4 数据长度的确定 sizeof(数据类型)
注意:写程序时要注意数据范围的大小,一方面防止出现逸处异常,另一方面   还可以注意定义数据的储存占用空间,不要浪费,这时就要考虑各种修饰符的使用。
       5 几种结构数据类型的定义
 数组 数据类型 数组名[数组元素个数];
其中字符串是一种特殊的数组 它以空字符‘/0’结尾 所以比实际多占一位   数组名是指向数组第一位的指针。
         枚举  enum 枚举类型名{常量1,常量2,。。常量N);
枚举类型的每个元素实际上是整数,枚举类型实际上是一个整形符号常量的集合。定义时,枚举集中每个元素都已经被隐含的赋予一个整型值。
用于只有少量整数取值的情况。
         结构  struct 类型名{ 数据类型 数据名1,数据类型 数据名2。。。};
结构类型类的不同在于它的数据默认是公有的 类是私有的
与数组不同的是它的元素可以是不同的数据类型
注意:各种数据类型的元素可以是各种包括结构数据类型
结构也是一个整体,可以把它看成一个整体或一个小函数,完成控制功能
三,控制流程
    根据数据结构判断数据执行次序,从而进行数据流程的控制。
各种语句可以嵌套,达到更复杂的流程控制语句。
  1.分支结构
1.if(条件)
     {
 }
        else{}
      Else 总是与离它最近的还没有与其他else语句匹配的if匹配。
2.switch(<整型表达式>)
{
case <整型表达式常量>: <语句序列1>;
case。。。。。。。。。。
default:<语句n+1>
};
  2 .循环结构
1.for(<初始话语句>;<表达式1>;<表达式2>){<语句>}
   循环条件已知用
While(<条件表达式>)<语句>
do
<语句>
while(<条件表达式>);
  3 .顺序结构
         顺序结构没有表达式限制,但也是程序中的一种流程,3中结构共同打造程序 
 的运行取向。                   
     4 .break continue goto
这三种语句 是为了弥补控制结构语句的不足,防止死循环情况发生,方便人们进              行控制而设立的。
break 跳出所在的一层循环
continue此次循环结束进行下一次
goto无条件跳转
四,函数      
 2.定义 使用及处理过程
函数的组成要素:函数名,参数,返回类型,函数体
函数名是代表函数的标识符。
参数是要输入的数据
返回类型可以是除数组的任意数据类型 用return返回
函数体就是对数据进行加工的部分
 3.物理存储方式
这里研究的是调用函数的物理存储
当程序被 启动时,操作系统会分配一块内存空间,在其中存放该程序运行过程中
的数据,包括程序本身的执行代码,程序中定义的各种常量和变量,根据存放内容
的不同,这块内存可以分为四个区域:程序代码区,全局数据区,堆和栈。
1 程序代码区存放函数编译成的二进制代码
2 全局数据区存放定义的全局变量以及函数体中定义的静态变量
3 堆是可以由程序支配的内存空间 用new和delete分别申请和释放内存空间
1
4 栈是由系统使用的动态空间,函数调用过程中用来存放传递给调用函数的信息,
  为调用函数的局部变量分配空间,函数结束自动释放
   1 当前函数的运行状态和返回地址,如果是main()函数,则需要保存操作系
    统的当前状态和返回地址
   2 被调用函数的参数
   3 被调用函数的局部变量
函数执行过程中只有堆是程序自由支配的
    4。函数的过程中,系统操作
      调用过程
1 建立被调用函数的栈空间
2 保存调用函数的运行 状态和返回地址
3 将实在参数的值传递给被调用函数
4 将程序控制权交给调用函数
          结束后过程
     1 如果函数有返回值,将函数的返回值放到一个临时的变量空间
2 根据栈顶记录的信息,恢复调用函数的运行状态
3 释放栈顶空间
4 根据函数的返回值地址,继续调用函数的运行状态
     5数据的来源
 cin>>数据输入
   输入过程是用户对已定义的变量的赋值的过程
   可以用cin.get()表示从标准输入流读入一个字符
 参数传递
   1传递方式
    1 传递参数
形参
形式参数和实际参数各有不同的存储空间,形参从实参那得到值
在函数体中对形式参数的修改不会影响到实际参数的值
实参  实际的数据
            2 按地址传递
用指针或数组传递
    3 按引用传递
        用引用传递
2 函数内定义局部变量
3类中友员的数据可共用
6.特殊的函数方法
 内联函数 函数前加inline, 把调用函数过程当作调用其中代码
 函数重载 参数不同的多个函数,调用过程根据类型进行匹配。
 函数模版 Type max (Type1.Type2) 
四,数组与结构
    两种结构化数据类型
1数组的定义 使用 及处理过程
在逻辑上具有次序关系的一组相同基本数据类型数据的集合,对他们的操作具有一致性
定义: 数组说明(类型) 数组名[常量表达式];
访问方式,数组名加下标a[5]方式 下标表示偏移量 数组名是数组第一个元素的地址
实质是首地址加偏移量来计算其内存地址 
对数组的操作大部分以元素形式进行 例如 复制
数组的初始化:类型 数组名[数组范围] = {值1,值2。。。};
多维数组 数组的数组 类型说明 数组名[常量表达式1][常量表达式2];
第一个常量表示第一维的长度 第二个表示第二维的长度       
注意:第N个数组的访问方式为a[n-1]
2 分类及与指针的联系
3 结构类型
与数组类型的最大不同是结构中元素的数据类型可以不同                               
定义:struct name{类型1 类型名1,类型2 类型名2。。};
同样可以在定义时初始化 结构变量可以直接赋值 。
五, 指针及其引用
指针是用来构造复杂数据类型的关键
两种引申数据类型
1 指针定义 使用及处理过程
指针是一种储存地址的数据类型,他指向赋与的值的地址。
void* id = &a;  未定义类型指针
int* p =(int*)pv; 强制转换
int* p =NULL: 空指针
2 指针与数组 字符串
数组名本身是一个指针,他指向存放数组的第一个元素的内存地址。
可以将数组名赋给一个指针 指针也可以当作数组名使用 二者可完全互换
通过指针访问数组,指针的加,减是以指针所指的数据类型的大小为单位的
例如:定义name[]  *str=name[0] 则name=str  name[i]=*(str+i)  &name[i]=str+i
对于字符串
    3动态内存申请
申请堆内存的方式是用C++预定义的操作符new
格式;new 数据类型  new 数据类型[初始值] new数据类型[常量表达式]
用于未知占空间多少的数据空间的申请
例如 float* p =new float[100];
语句将返回申请到的内存地址的首地址,将值赋予p
delete表示将从堆内存中申请的一块空间返回给堆
格式:delete 指针名 delete[]指针名
指针与动态结构
(*p).成员名 相当于指针->结构的成员
结构和指针结合 形成链表
前一个结点通过链找到下一个结点,每个成员定义一个指针,指向下一个指针的
首地址 结点有数据成员和指针成员组成
链表的创建过成就是一个创建链表结点并将他们连接在一起的过程
3 引用
引用是对一个变量或常量标示符起的别名 引用只是一个别名而已
六,面向对象
1对象定义 抽象方法
对象:属性+在这些属性上的操作的集合
对象是面向对象方法构造的系统的基本单位,对象具有接口,通过接口访问对象
类是具有相同属性和操作的彝族对象的集合,它属于该类的全部对象提供了统一的
抽象描述。
公有的操作体现对象的服务
特殊类的对象拥有其一般类的全部属性与操作,称为特殊类对一般类的继承。
3 基本概念
消息是对对象发出的服务请求,是面向对象系统中对象之间交互的途径
再具体的程序设计语言中,消息表现为对象在其操作过程中对另一个对象的服务程序
的调用,也就是函数调用,函数的返回值就是消息的应答。
封装;属性和操作的结合,信息的隐藏 
多态性表现为以统一的方式对待相同的接口的不同类的实例的能力
通过调用重载函数或虚函数(动态联编能力)实现。
2 开发过程
开发和抽象类的过程                                                                                                                                                                                                                                                       
分析
发现对象 识别对象的外部特征 识别对象的内部特征 建立对象交互图                                                                                                                                                                             
设计
问题域 人机交互 数据管理 系统交互
实现                                                                                                                        
七,类
一种特殊的结构化数据类型,将数据和对数据的操作组合在一起,形成一个整体。
他的特殊性在于数据类型带有自己的操作,类的变量就是对象。是对对象的抽象
1.定义和使用 组成结构
形式:public 类名{类体定义};
习惯:将类的定义放在一个文件中  将类的成员函数放在另一个文件中
内联函数必须放在类定义的文件中
内联函数;类体中的为内联函数。外部操作若想成为内联须前面加上inline
内联函数一般用于那些访问私有数据成员的小函数
成员函数的实际参数将比他看起来的参数多一个,这个省略的参数回由系统自动加到
我们所定义的的成员函数中,作为函数的第一个参数。
类和结构的唯一不同是:结构的成员默认是public的,而类的是private
2 .类之间的关系
  (1).消息传递
构建类的对象通过对象调用函数或数据来传递参数
    消息表现为对象在其操作过程中对另一个对象的服务程序
的调用,也就是函数调用,函数的返回值就是消息的应答。
      (2) .友元
为函数(或类)定义为类的友元使函数(类)有直接访问类的非共有成员的能力。
形式:friend  函数的原型(class 类);
和函数原型一样,只是一个说明语句。

  (3) .继承
如果类B在类A基础上构造,那么A称做基类或父类,类B称为派生类或子类
,派生类可以继承基类的所有特性,而且可以从基类继承所有的特性,而且可以
增加新的特性或改造基类的特性。
     共有继承 一般 特殊关系时用 派生类具有自己的特性
派生类对象是基类对象的一种 他体现了基类的所有特性
私有继承 基类在派生类中起的作用相当于派生类的一个私有的成员对象成员  
保护继承 界于共有继承和私有继承之间。
再派生类中,派生类的构造函数的时候要正确初始化属于基类的成员
构造函数的调用顺序是先依次调用个基类的构造函数,然后调用类的对象成
员的构造函数,在调用派生类自己的构造函数。
传递方式:先写上基类的名字,然后将要传递给基类的参数用括号括起来。
并且彼此用分号割开
多继承
结构:派生类名: 访问控制符 基类[,访问控制符 基类]{};
二义性 再派生类中有和基类一样的名字的成员时,派生类的同名成员将会
覆盖基类的成员。
解决二义性的方法是给数据加上路径标志。
3类的初始化和释放
        构造函数是对象被创建是由系统自动调用的函数,析构函数是对象被
释放的时候自动调用的函数 他们都是类的成员函数
构造函数让类的不同对象“不同”,也是一种“实例化”化过程
可以对构造函数进行重载过程,可以对对象进行不同的初始化。
可以让构造函数有默认参数
默认构造函数是参数表为空或者所有参数都有默认值的构造函数
调用默认构造函数构造对象的情况
1 直接调用一个对象而没有初始化。 Name name;
2 用new动态申请的变量而没有初始化 Name* pName = new Name;
3定义一个对象数组 Name names[10];
因为上述三种情况没有对对象提供初始值
对象拷贝 Name name2 =name1; 用对象name1构造对象name2
八,其他
1,注释
2,static
1使用static使数据的作用范围和生存范围发生变化,是数据具有“静态”的性质
 指静态变量 具有静态变量的变量会由系统自动初始化为0
 Static有两种使用方法
 一种是定义全局变量和函数 使函数和全局变量只能在当前文件中使用 他们的作
 用范围被限制到定义这个文件的定义中
 这样可以实现封装 还可以在其他文件定义同名变量和函数
 第二种是局部静态变量 静态局部变量使局部变量的生存期和程序生存期一样
 并且变量处于内存的全局数据区,将其的存在范围看成全局变量
2 一个类的所有对象有时需要共享同一个属性,或者说,一个属性是类的属性而
  不是这个类的每个对象有的属性,这个属于类的特性而由每个类的对象所共享的
          的属性在C++中用类的静态成员表示。对象不能对该属性进行设置
          想访问静态成员必须通过类的名字来访问
      还定义了静态成员函数只能用来访问静态数据成员
      非静态函数可以访问静态数据也可访问非静态数据
  静态数据成员的初始化在所有的函数体外
3 const
常引用
const<类型说明符>&<引用名>;
表示不会对实参的修改
常对象
const<类名><对象名>;
定义对象时必须被初始化,而且不能更新
常函数
<类型><函数名>(<返回值>)const; 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值