❤ 2018.9.11
啊 好久没学习了。。。
〇 预备知识:从C语言到C++语言
○ 结构化程序设计方法的基本思想
○ 结构化程序设计所面临的问题
因为结构化程序设计的数据和算法是分离的
○ 从C语言到C++语言
〇 C程序员学习C++预言的准备
○ 数据的输入和输出
○ 变量初始化及常变量
初始化后数值不能改变的量叫常变量
○ 常变量
○ 引用及函数间参数的引用传递
○ 引用
○ 几种特殊形式的函数
♣内联函数一定要是简单的函数,如果函数过于复杂,则编译器会把函数当做普通函数处理;内联函数只有多次调用的情况下才能体现出优势。
○ 命名空间
♣ 解决了不同机构不同程序员编写的函数的重名问题
♣ ::(双冒号)叫 作用域运算符 或 作用域分辨符
○ 动态内存分配
· 单个变量的动态分配与释放
· 一位数组的动态分配与释放
❤ 2018.9.12
〇 面向对象程序设计之一
· 结构体类型
· 类和对象
♣ 类定义中的数据成员相当于全局变量,函数成员可以直接访问,不需要形参。
○ 对比结构化程序设计方法
○ 封装
○ 小结
❤ 2018.9.13
〇 面向对象程序设计方法
♣ 用类所定义的变量称为对象
〇 面向对象程序的设计过程
分析、抽象、组装
〇 一个栗子
○ 分析
用用例图分析,提取出对象,再用顺序图、活动图、状态图描述各对象如何参与数据处理过程。
顺序图:
○ 抽象
将具有共性的事物划分成一类,分类的过程,是一个不断抽象的过程,
面向对象程序设计将分类称为抽象,
将一个个具体的事物称为对象,
对事物进行抽象、归纳所划分出来的类别,称为类,
数据被称为事物的属性,用变量存储数据,
处理事物的算法称为方法(???反了吧),用函数来描述,
处理同类事物有相同的属性和方法,这些方法被称为类的成员,
程序员通过分析,提炼出类的属性成员和方法成员,并合理设定类的访问权限,这就是类的设计,
面向对象程序设计,用类图描述类的结果。
○ 组装
· 一个对象就是类的一个实例
〇 类的定义
♣ 注意:C++编译器默认将直接定义在类声明部分大括号里的函数成员当做内联函数处理。
♣ 记得类定义结束后面不要丢了分号;
〇 对象的定义与访问
○ 使用类,通常就是用类定义变量,用类所定义的变量成为该类的一个对象或实例。使用类需先定义或先声明再使用。
♣ . 叫成员运算符
○ 对象指针
->指向运算符:可以直接通过指针访问对象的数据成员和函数成员。
♣ 注意:
1.对象指针与被访问对象应具有相同的类类型
2.对象指针需先赋值,即先指向被访问的对象,然后才能间接访问该对象及其成员,
3.只能访问对象的公有成员,不能访问非公有成员。
❤ 2018.11.29
喔。。。。好像又过了好久。。。。
○ 类与对象的编译原理
♣ 用类定义对象时,只在内存中存放类的数据成员。
♣ 调用函数成员时,通过this指针传递
♣ 总结一下:C++编译器在编译类中的函数成员时,会为其增加实参——对象指针this,函数体中访问对象成员都是通过this指针间接访问,C++编译器在编译通过对象访问其函数成员时,会修改为直接调用该成员,然后将对象的地址作为形参,传递给对应的形参this。
这样做的目的是为了让多个同类对象共用函数代码,降低内存占用。
♣ 程序员也可以在访问其他类成员时,显式的添加this指针,或用this指针,将当前对象地址作为实参,传递给其他函数。
○ 对象的构造与析构
· 程序在执行过程中,变量从分配到释放,这个时间段称为变量在内存中的生存期。
· 不同类型变量分配方式不同,在内存中有不同的生存期。
全局和静态变量是静态分配的,在程序加载后立即分配内存,直到程序执行结束,退出时才被释放,局部变量是自动分配的,
在执行其定义语句时被分配内存,到其所在代码执行结束即被释放,动态分配是程序员使用new和delet运算符,自行决定内存何时分配,何时释放。
· 对象也有不同的类型,也有不同的生存期,他们的分配方式和变量完全一样。
♣ 构造函数是类中的一种特殊的函数成员。一个类中必须有构造函数。
· 构造函数的作用:初始化对象、显示对象的构造过程、构造时申请额外内存等等。
♣ 这是个重载函数,当定义对象时,给出初始值,则调用第一个,不给出初始值则调用第二个。
♣ 这两个函数可以写成一个带默认形参值的函数形式:
♣ 动态分配的内存在使用完之后需要程序员编写delete语句来释放,在构造函数中动态分配的内存,需要程序员编写析构函数,在析构函数中用delete语句来释放。
♣ 析构函数也是类中的一种特殊函数。
· 析构函数作用
· 拷贝构造函数中的深拷贝与浅拷贝
□ 默认的拷贝构造函数格式如下
♣ 因为备注信息内容并没有再分配内存,所以叫浅拷贝,如下图左半部分所示。但是有时候我们希望将备注信息内容复制到新的内存空间中,即深拷贝,如下图右半部分所示。
♣ 深拷贝需要自己编写构造函数
○ 类与对象的编程
□ 举个例子
· 执行结果
❤ 2018.12.5
〇 对象的应用
♣ .叫成员运算符
♣ 注意 删除数组指针时记得加中括号。
· 定义在函数内部的对象是局部对象,其他函数不能直接访问,对象可以作为参数在函数间传递,调用函数时,主调函数和被调函数需要通过形实结合来传递对象。
♣ 相当于调用了拷贝构造函数。
○ 在函数间传递对象也有三种方式:值传递、引用传递、指针传递。
○ 常对象:像常变量一样,可以将只读不改的对象定义成常对象。常对象定义时必须初始化,定以后不能再修改其数据成员。
常对象在程序中被修改时编译器会报错,可以帮助程序员避免错误。
· 值传递重新构造了一个对象形参,花费了内存时间和内存空间,相对而言,引用传递和指针传递具有更高的传递效率。
· 引用传递时,被调函数可能会修改所引用的主函数中对象实参,如果希望避免这种因引用传递带来的函数间相互影响,可以将对象形参定义成常引用。如果被修改了编译器会报错。
○ 指针传递,将主调函数中,对象实参的内存地址传递给被调函数的对象指针,被调函数通过指针,间接访问被调函数的对象,
♣ 注意主调函数中要加&取地址运算符。
· 如果为了避免指针传递带来的函数间相互影响,可以将形参定义为常指针。
❤ 2018.12.6
〇 类中的常成员与静态成员。
♣ const关键字可以限定被调函数不能修改主调函数中的信息,当发生修改时编译器会报错,这样可以帮助程序员快速排查这类错误。在定义类的时候也可以用const保护数据成员不被修改。
♣ static 静态,是与作用域,生存期相关的概念,静态可以延长局部变量的生存期,可以将全局变量或函数的作用域限定在本程序范围之内,我们将其统称为static静态机制。
○ 举个栗子
♣ 数据成员和函数成员都可以定义成常成员。
♣ 定义常成员的目的是保证数据成员不被修改。
♣ 常数据成员只能在初始化时赋值,初始化后不能再次赋值。
♣ 在类中声明常数据成员时不能直接初始化。
♣ 类中的任何成员都不能在声明时赋初始值,必须通过构造函数来完成初始化。
□ 将price定义成常数据成员
○ 如果某个函数成员只需要读取某类中其他数据成员的值,不需要修改,那么可以将该函数定义成常函数成员。
♣ 定义类时,用static关键字限定的成员称为静态成员
♣ 面向对象程序设计,建议将全局变量作为一种特殊成员,归属到某个类中统一管理,这种特殊成员就是静态数据成员
♣ 如果某个函数成员,只需要访问类中的静态数据成员,那么可以将该函数定义成静态函数成员。或者说,如果将某个函数成员定义成静态函数成员,那么该函数成员就只能访问类中的静态数据成员,或调用其他的静态函数成员。
❤ 2020.7.29 ❤ Emmm。。。。
〇 类的友元
♣ 友元是与访问权限相关的概念。
○ 友元函数
当不使用友元函数时
使用友元函数时
♣ 被声明为友元的函数称为该类的友元函数,被声明为友元的类称为该类的友元类。
○ 友元类