C++ 学习总结报告(一)

这部分知识点又多又杂,内容也难以理解,下面是一些知识点的梳理。

复合类型

一:指针
(一) 指针的基本概念
  指针持有一个对象的地址,称为指针“指向”该对象。通过指针可以间接操纵它指向的对象。
每个指针都有相关的类型,要在定义指针时指出。
类型 *指针变量;
  指针存放指定类型对象的地址,要获取对象的地址,使用取地址运算符“&”。
如果指针指向一个对象,则可以通过指针间接访该对象,使用指针解引用运算符“*”。
(二) 指针的类型
  每个指针都有相关的类型,需要在定义指针时指出
     type* pointer
  指针的类型指出了如何解释该内存地址保存的内容,以及该内存区域应该有多大
(三) 空指针
  1.指针值为0时是一个空指针,即不指向任何对象的指针
  2.表示空指针的3种方法
    0
    nullptr(C++11)
    预处理常量NULL()
(四)void*指针
  可以持有任何类型的地址值,即通用指针。
  相关的值是个地址,但是该地址保存的对象类型不知道。
  不能操纵void指针指向的对象,只能传送该地址值或者和其他地址值进行比较。
  不允许void指针到其他类型指针的直接赋值。
二:new和delete
(一)new运算符
  1.在堆上动态分配空间,创建对象,并返回对象的地址。
   一般将new返回的地址保存在指针变量中,以便间接访问堆上的对象。
  2. new表达式的三种形式
   分配单个对象:new 类型 或者 new 类型(初始值)
   分配多个连续存储的对象:new 类型[数组大小]
   定位new,在指定位置分配空间:new (指针) 类型;
(二)delete运算符
  1. 堆上的空间在使用后必须释放,否则会造成内存泄漏,即动态内存空间使用后未回收,导致一直被占据。
  2. new运算符分配的空间用delete运算符释放
   释放new分配的单个对象的delete形式
     delete 指针;
   释放new分配的数组的delete形式
     delete[] 指针;
   定位new没有对应的delete表达式。
三:引用
(一) 左值引用
  1. 左值引用类型
    左值引用又称为别名,它可以作为对象的另一个名字。通过左值引用可以间接地操纵对象。在程序中,引用主要用作函数的参数。
  2.引用的定义和初始化
   (1)引用由类型标识符和一个取地址符(&)来定义。
     type& refVariable = leftValue;
   引用必须被初始化,初始值是一个有内存地址的对象。
   (2)引用一旦初始化,就不能再指向其他的对象,对左值引用的所有操作都会被应用在它所指向的对象上。左值引用的初始化和一般变量的初始化不同,一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,所以引用必须初始化。
(二)右值引用
  1.右值引用就是必须绑定到右值的引用
   定义和初始化右值引用的形式
     类型 &&右值引用变量 = 右值表达式;
  右值引用由类型标识符和两个取地址符(&&)定义。右值引用必须被初始化,初始值是右值表达式。不能将右值引用直接绑定到一个左值上。
四:const限定指针和引用
(一)const限定指针
  指向const对象的指针(非const )
    const type *cp; 或者type const *cp;
  cp是指向常量的指针,它所指向的内存中的内容不可以改变,即*cp的值不能改变。
  指向非const对象的const指针
    type* const cp = initAddressValue;
  cp是常量指针,初始化后值不能改变,指向固定的单元。
  指向const对象的const指针
    const type*const cp = initAddressValue;
(二) const限定引用
  const限定的左值引用不可修改。const引用可以绑定到const对象。不能用非const引用指向const对象。
五:结构体
  结构体把一组来自不同类型的数据组合在一起构成复合类型,其中的每个数据都是结构体的成员。
  结构体由关键字struct定义,语法形式:
  struct 结构体类型名
  {
  成员声明;
  };
  结构体的成员不能独立使用,必须由结构体类型的变量通过成员选择运算符“.”来选择,或者由结构体类型的指针通过“->”运算符选择。
六:枚举
  枚举类型定义了一组命名的整数常量,以提高代码的可读性。
  enum TrafficLight { red, green, yellow };
七:标准库类型string
(一) 定义和初始化string对象
在这里插入图片描述
(二) string常用操作
在这里插入图片描述
八:标准库类型vector
(一) 定义和初始化vector
在这里插入图片描述
(二) vector常用操作
在这里插入图片描述
九:迭代器
(一) 迭代器简介
  迭代器类似于指针类型,提供对对象的间接访问。访问标准容器的元素的通用方法是使用迭代器。
  begin()和end() 操作返回容器对象上的迭代器。begin()返回指向第一个元素或字符的迭代器
end()则返回指示容器或string的最后一个元素的下一个位置的迭代器。
(二) 迭代器支持的运算符
在这里插入图片描述
在这里插入图片描述
十:文件读写
(一)输入输出重定向
  将标准输入和标准输出与命名文件关联起来
    c:> program outputfile
  运行名为program.exe的可执行程序,用文件inputfile作为输入,用文件outputfile作为输出
(二)C++标准库中的文件流
  ifstream类:用来输入(读文件)的文件流
  ofstream类:用来输出(写文件)的文件流
  fstream类:把文件连接到流对象用来输入和输出
(三) 文件操作的步骤
  (1)新建一个文件流对象
  读文件用ifstream,写文件用ofstream;
  (2)把文件流对象和文件关联起来
  打开文件,使用文件流的open函数;
  可以指定打开文件的模式
  (3)操作文件流
  使用与终端I/O相同的操作读写文件
  (4)关闭文件流
  使用文件流的close函数

函数

一:函数基础
(一) 函数定义
  函数定义的语法形式为
    返回类型 函数名(参数列表) { 函数体 }
  函数一般用一个名字表示,即函数名。函数的操作数称为参数,由参数列表指定。函数的结果称为返回值,其类型称为函数返回类型。函数执行的动作在函数体中指定。
  函数的参数列表不能省略。函数必须指定一个返回类型。
(二) 函数调用
  1.调用执行函数的形式
    函数名(实参列表);
  2.形参和实参
  函数定义中的参数被称为形式参数,简称形参。
  在调用函数时提供的数据称为实际参数,简称实参。
(三) 函数声明
  函数在使用之前必须声明。一个函数可以在程序中多次声明。函数定义也可以被用作声明,但是函数在程序中只能定义一次。
  函数声明的形式
    返回类型 函数名(参数列表) ;
二:参数传递
  参数传递是指用函数调用的实参来初始化函数形参存储区的过程。形参的类型决定了实参初始化形参的方式。
(一) 按值传递
  1.概念
  把实参的值复制到形参的存储区中,即用实参值初始化形参。
  2.按值传递参数的特点
  简单直接;不会改变实参的内容。
  3.按值传递参数不适合的情况
  大型的类对象或结构体变量作为实参时;
  在运行栈中分配空间并复制对象,时间和空间开销过大;
  必须要修改实参的值时,如交换两个变量的值。
(二) 按引用传递
  当参数是引用时,函数接收的是实参的左值而不是值的副本,即形参是实参的引用,或者说是别名。函数操纵的形参是实参的别名,因而可以改变实参的值。
(三) 参数传递方式的选择
  1.对于内置类型的小对象,传值的方式更简单直接;
  2.如果想在函数内改变实参,使用传引用或传指针的方式;
  3.传指针的语法比引用复杂一些,但使用起来更清晰明确;
  4.对于类类型的对象,尽量使用引用传递参数,效率更高;
  使用const限定可以避免实参被修改。
  5.特殊要求
  数组和函数作参数时必须传指针。
  拷贝构造函数的参数必须传引用。
三:返回类型和return语句
(一)概念
  函数的执行结果由return语句返回
  return语句结束当前正在执行的函数,将控制权返回给函数的调用者
  return语句有两种形式:
    return;
  用在返回类型为void的函数中,不是必需的
    return 表达式;
(二)返回值
  默认情况下,函数的返回值是按值传递的。返回值的方式和初始化变量或形参的方式完全一样。
(三)返回引用
  将函数声明为返回引用,则不需要对return语句中的表达式进行复制,而是返回对象本身。
函数返回的引用仅是它所指向对象的一个别名。
四:函数重载
  如果同一个作用域内的几个函数名字相同但形参列表不同,则它们是重载函数。
  重载函数的参数表必须不同。或参数个数不同,或参数类型不同。
  返回类型不能区分两个重载函数,因为调用函数时可以忽略函数的返回值。
  调用函数时,如果存在多个重载函数,编译器将根据函数调用中指定的实参进行选择。
五:作用域和存储类别
(一)作用域
在这里插入图片描述
(二)存储类别和存储空间分配
  1.静态分配
  静态分配是指在全局静态存储区为变量分配内存空间,编译时就分配了内存地址(相对地址)
在程序开始执行时变量就占用内存,直到程序结束时变量才释放内存。
  静态存储的对象
  全局对象、namespace作用域对象、文件作用域对象、用static 和extern 声明的对象、局部static对象。
  2.自动分配
  自动分配指在程序的运行栈存储区中为变量临时分配内存空间,程序运行后,在变量作用域开始时由系统自动为变量分配内存,在作用域结束后即释放内存。
  自动存储的对象
  自动局部对象、register 局部对象
  3.动态分配
  动态分配是指利用被称为堆(heap)的内存块为变量分配内存空间。堆在静态存储区和栈之外,又称为自由存储区。
  动态分配的对象
  完全由程序本身控制动态空间的分配与释放。
  用new 创建动态对象,用delete 结束这类对象的生存期。
  堆中分配的对象没有名字,需要通过指针间接操纵。
  由new 分配的动态对象不再使用时必须用delete 释放,否则会造成内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值