这学期开始,我们就开始了更深层次的学习,学习的就是程序设计面向对象,相比于上一个学期学习的内容,这个学期所学习的知识点无疑是更加的难懂,也更加的多,很多知识点都很零碎,想要学好这个学期的内容不花大的力气是不行的,第四章主要学习的就是指针,的五章呢就是函数,函数虽然上个学期我们学习过了,但是很简单,很皮毛,指针的内容也是一样的。
1》constexpr对象:如果认定某个对象是常量表达式,可以把它声明为constexpr类型,由编译器验证对象的值是否是常量表达式,通过这种方法可以获得编译时常量,声明为constexpr的数据对象一定是一个常量,必须用常量表达式初始化。大多数情况下和const的用法没有什么区别。
2》auto类型说明符:用auto声明变量的类型,由编译器去自动分析表达式的类型,推断出变量的实际类型,定义auto变量必须有初始值
3》decltype类型指示符:作用是选择并返回操作数的类型,编译器会分析表达式的类型,并不真正计算表达式的值 PS: 希望从初始值表达式推断出要定义的变量的类型时,用auto 希望从表达式推断出要定义的变量的类型,但是又不想用这个表达式的值初始化该变量时,用decltype auto和decltype可以让我们不用去记忆和书写复杂的类型名字
4》range-for是一种简化的for语句,从头至尾对容器或序列的所有元素逐个执行某种操作
2)指针对于数据的访问有直接访问和间接访问:通过变量的名字直接访问为程序中定义的变量分配的内存单 元, 存取变量的值;使用变量的内存地址找到存放数据的单元,间接访问其中的内容。 指针的特点:指针持有一个对象的地址,称为指针“指向”该对象。 指针存放指定类型对象的地址,要获取对象的地址,使用取地址运算符“&” 如果指针指向一个对象,则可以通过指针间接访该对象,使用指针解引用运算符“*” 用法:类型 *指针变量 指向一个对象的指针有两个存储单元与之相关:一个是指针自己的存储单元,里面存放着所指对象的 地 址;另一个就是指针指向的对象的存储单元,里面存放该对象的值。 指针的类型指出了如何解释该内存地址保存的内容,以及该内存区域应该有多少不同类型指针的表示 方法 和保存的地址值并没有分别,区别只是指针指向的对象类型不同 空指针:就是不指向任何对象的指针,表示空指针的三种方法:0;nullptr;预处理常量NULL。 指针的运算:同类型的指针可以进行相等(==)或不相等(!=)的比较操作,比较的结果是布尔类型 指针可以进行加或减整数值的算术运算;自增、自减运算适用于指向数组元素的指针 系统空间的分配分成两种:静态和动态 静态(编译时)分配空间 编译器在处理程序源代码时分配内存; 效率高,灵活性差,运行前就要知道程序需要的内存大小和类型 动态(运行时)分配空间 程序运行时调用运行时刻库函数来分配内存; 占用程序运行时间,更灵活 程序使用动态内存的原因: 程序不知道自己需要使用多少对象, 程序不知道所需对象的准确类型, 程序需要在多个对象间共享数据, 系统为所有程序运行可用的内存池,被称为自由存储区 动态内存管理方法:C++通过new和delete运算符进行动态存储空间的管理 静态分配空间:heap(堆空间) new运算符 在堆上动态分配空间,创建对象,并返回对象的地址 一般将new返回的地址保存在指针变量中,以便间接访问堆上的对象。 分配单个对象:new 类型 或者 new 类型(初始值) 分配多个连续存储的对象:new 类型[数组大小] 定位new,在指定位置分配空间:new (指针) 类型; 注意:不能对数组进行显式的初始化 数组大小不必是常量,是数组元素的个数,不是字节数 用new分配数组时,并未得到一个数组类型的对象,而是得到一个数组元素类型的指针 使用定位new,必须包含标准库头文件<new> delete运算符 堆上的空间在使用后必须释放,否则会造成内存泄漏,即动态内存空间使用后未回收,导致一直被占 据 释放new分配的单个对象的delete形式,delete 指针; 释放new分配的数组的delete形式,delete[] 指针; 定位new没有对应的delete表达式 注意:指针清除后不能重复清除,否侧会造成运行的错误,并且是无法估计的。 执行delete运算后,指针ip指向的空间被释放,不能再使用ip指向的内存,但是ip这个指针变量自 己的存储空间不受影响 delete后的ip不是空指针,而是“空悬指针”,即指向不确定的单元。
3)引用和左值引用 引用就是左值引用为了不与新增的右值引用混合 一般在初始化变量时,初始值会被复制到新建的对象中 定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用,并且一直的绑定。 一旦初始化完成,引用将和它的初始值对象一直绑定在一起 因为无法令引用重新绑定到另外一个对象,所以引用必须初始化 因为指针引用放在了等号的左边
4)右值引用 只能绑定到一个快要销毁的对象,因此,可以自由地将一个右值引用的资源移动到其他对象中 类型&&右值引用变量=右值表达式 与左值引用不同的是多了一个取地址符 将一个左值转换成对应的右值引用类型,调用标准库<utility>中函数std::move()。调用后可以销毁也可以赋予新的值,但不能使用被移动后的对象的值。
5)const限定指针和引用 const常量的使用跟其他例如整形的常量用法一样只不过是将对象换为了指针的类型,表示的也是指针的内容不能被替换,引用到最后。对于一个指针来说const的指针不能用一个普通的指针来指向const指针。 用法:类型 const 变量=初始值 const对其引用的对象的类型要求与普通类型不同,可将const引用绑定到非const对象。但从const引用不能用来修改他所绑定的对象。 可以用任意表达式初始化const引用,只要表达式的结果能转换成引用的类型即可。 const引用仅对引用自己可参与的操作进行了限定,对所指向的对象本身是不是常量未作限定。因为指向的对象也可能不是const,所以允许通过其他途径改变它的值
6)结构体struct 结构体把一组来自不同类型的数据组合在一起构成复合类型,其中的每个数据都是结构体的成员。 结构体由关键字struct定义,语法形式: struct 结构体类型名{ 成员声明; }; 结构体的成员不能独立使用,必须由结构体类型的变量通过成员选择运算符“.”来选择,或者由结构体类型的指针通过“->”运算符选择。
7)枚举 简单来说就是将所有的情况都列举出来。
8)string类型 string类型就是字符串类型,前面已经写过现在就不再多说了。
9)vector标准函数库 表示对象的集合,其中所有对象的类型都相同,可以通过索引访问各个对象 vector是对象,其中容纳着其他对象,被称为容器 vector的用法 vector是长度可变的向量,可替代内置数组 更灵活,更高效 要使用vector,必须包含头文件<vector> 动态数组与一维数组类似,只不过区别就是动态数组随着取用会自动地增加数组的上限,不过数组的放置需要一个个地将数据放进动态数组中,防止数组中有空的数组。 头文件#include<vector>,vector<int >v, empty() -- 返回bool型,表示vector是否为空 (v.empty() ) size() -- 返回vector内元素个数 (v.size() ) push_back(data_type a) 将元素a插入最尾端 pop_back() 将最尾端元素删除
10)标准库文件流 ifstream类:用来输入(读文件)的文件流 ofstream类:用来输出(写文件)的文件流 fstream类:把文件连接到流对象用来输入和输出 使用文件流要包含头文件<fstream> istream(ostream、iostream)的操作在ifstream(ofstream、fstream)中都可以使用
(1)新建一个文件流对象读文件用ifstream,写文件用ofstream;
(2)把文件流对象和文件关联起来打开文件,使用文件流的open函数;可以指定打开文件的模式
(3)操作文件流使用与终端I/O相同的操作读写文件
(4)关闭文件流使用文件流的close函数 istringstream:从string对象中读取数据 ostringstream:向string对象写入格式化的内容 stringstream:从字符串读取数据,将数据写入字符串
11)函数 函数一般用一个名字表示,即函数名 函数的操作数称为参数,由参数列表指定 函数的结果称为返回值,其类型称为函数返回类型 函数执行的动作在函数体中指定 函数定义的语法形式为 返回类型 函数名(参数列表) { 函数体 }
函数调用会使程序的控制权传递给被调函数,而当前活动函数的执行被挂起
当被调函数执行完成时,主调函数从调用语句之后的语句恢复执行
函数在执行完函数体的最后一条语句或遇到return语句时返回
默认情况下,函数的返回值是按值传递的
引用参数
当参数是引用时,函数接收的是实参的左值而不是值的副本,即形参是实参的引用,或者说是别名
函数操纵的形参是实参的别名,因而可以改变实参的值
引用参数的用途
通过传递引用在函数内修改实参的值向主调函数返回额外的结果向函数传递大型的结构体变量或类对象提高效率将参数声明为const引用,避免在函数内部修改引用参数类的拷贝构造函数和重载的运算符函数中
特殊要求
数组和函数作参数时必须传指针
拷贝构造函数的参数必须传引用
调用一个返回引用的函数得到左值
其他返回类型得到右值
返回引用的函数调用表达式可以作为左值使用
可以为返回类型是非const引用的函数的结果赋值
对引用返回值的修改会改变实际返回的对象,为了避免这种情况,可以将返回值声明为const
重载函数
如果同一个作用域内的几个函数名字相同但形参列表不同,则它们是重载函数
调用函数时,如果存在多个重载函数,编译器将根据函数调用中指定的实参进行选择
用实参的类型和个数与函数的形参进行匹配
可能应用隐式类型转换
二.学习感悟
进入大学下学期来确实感受到了紧张感和压力,学习的内容也越来越复杂,越琐碎,而且比较抽象,很不好理解,现在我们需要的是抽出大量的时间来预习复习,只有这样才能将其学好,多看多理解,多思多想。