当前课程知识点:面向对象程序设计(C++) >  第二讲 基础语法(1) >  2.1 变量定义 >  变量定义

返回《面向对象程序设计(C++)》慕课在线视频课程列表

变量定义在线视频

变量定义

下一节:变量的初始化、类型推导与基于范围的循环

返回《面向对象程序设计(C++)》慕课在线视频列表

变量定义课程教案、知识点、字幕

好同学们我们在这一讲里头

将给大家介绍一下

在我们面向对象这门课程里头

可能需要用到的一些

基础的0:34 的一种语法

那作为我们程序设计基础课的后续课程

有一些基本东西呢

在前一门课程里头已经讲过了

所以我们就不再去重复

有一些相对比较重要的

也许我们会简单的回顾一下

那么总的来讲呢

这一章包括后面接着的几章里头

都是给大家打下面向对象程序设计

所用的0:59 语言的这种语法的基础

首先来看一下这个变量的定义

变量的定义是一个

对于编译型的这种语言来讲

很基本的一种需求对吧

那么你任何的一个变量就使用的话

必须给它有一个类型的说明

我们把它称之为类型的这种变量的定义

那大家看到下面这个地方呢

是有一个一种新的变量的定义方法

我们称之为auto变量

这个auto的关键字呢

实际上在1:32 的这种新的标准里头

它的含义已经发生了变化

通过例子我们可以看到

我们定义了两个变量

一个i一个f那么它的写法呢

是auto空格i等于3

这个3当然大家都知道这是个整数

如果按照我们以前的

上一课程的这种写法的话呢

通常大家会写int i等于3

告诉读者和编译器

说这个变量i呢是一个整型变量

但是现在我们没有写int

而直接写的是auto

那么编译器呢会根据你这条语句

它的这个实际上对变量附的那个值

来自动的来决定这个i应该是什么类型

所以它auto 是这么一个

被自动的确定类型的这种含义

下一个例子呢这个auto f等于4.0

那么它在附给f的时候

那个值不是整数是一个2:35 值

所以呢编译器会自动的把这条语句

把它翻译成机器代码的时候

等效于是定义了一个float的这种变量

那这种不再去直接给定变量的类型

来定义变量的方法

在我们后面的程序设计当中

有的时候是很必要的一种手段

所以在这个3:03 的标准里头呢

就特别的引入了这样一种新的

定义变量的方法

下一个呢是我们来回顾一下

指针变量的动态生成与删除

在我们前一门课程程序设计基础课程里头

有一些代码

其实已经用到了这样的一个语法形式

这个方法呢在我们的本门课程里头

有的地方用的还比较多

所以为了让大家便于理解后面的知识

我们这里头呢把这个知识呢

在回顾一下

大家知道一个变量在定义的时候

它是去指向一片内存的

这个内存它是一个

存放变量内容的一个空间

这样的空间它是需要我们

动态的去生成

这有的时候是动态生成的

当然了有的时候指针变量

也可以指向已有的变量的地址

这两种情形都可以去为指针变量附值

那如果这个内存空间是我们自己

在语句里头来生成的话

那就是大家在这个例子里头看到的

它是通过new和delete

这是两个用英文单词

来做名称的一种运算符

一般的运算符是4:29 除这种符号

那么这个里头的运算符呢

是两个英文单词

分别表示去开辟内存空间

和这种释放内存空间

我们先看第一条语句int*ptr=new int

那么这是让编译器把这条语句

生成相应的机器代码

去在内存里头开辟出一个

能放一个整数的这种空间

完了之后呢把这一个整数的空间的地址

给这个ptr这变量

所以这句话实际上既定义了

ptr这样的一个指针类型的变量

又开辟了内存空间

并且呢完成了把这个内存地址

赋值给ptr的这样的一个过程

所以呢这条语句既定义了变量

也对变量进行了初始化

大家看到呢它的

用new这个运算符的语法形式是

在它后面跟上类型的名字

现在我们用的是这个整数int

是语言自己带的

有的时候也被称为

自建内在内含的这样的一个类型

将来我们会用到用户自己定义的类型

那么它的语法形式也是一样

在new的后面跟上这个类型的名字

好这是第一句话定义了单个变量

它是通过内存分配来得到的一个空间

大家看第二句话

那么它回答的是

我们如果要开辟若干个内存空间

像数组那样子把它们一个挨一个紧挨着

这么分配出来怎么办呢

在类型的后面跟上一个方括号

然后呢跟上你要开辟的元素的个数

那个数字

像这里头的例子里头我们是开辟了

十个整数的空间的这个数组

所以呢把这样的一个指针

有的时候是称之为是指向一个

连续的数组的这种一个变量

那么如果你要开辟更多的

或者说呢你开辟的这个数量呢

是一个变量来保存的方法

写法也是一样的

都是new然后类型的名字

这里是int然后方括号然后是数值

这里头是常量10

你可以是个变量比方说7:17

7:17 是另外的一个

通过别的方式得到的一个值

作为一个变量

所以你就可以在代码里头

可以在运行的时候来确定

这个内存大约要开多大

所以这是开辟若干个连续的同类型的

这种元素空间所组成的一个

数组区域它的一种办法

大家看第三个是指的内存的释放

我们知道呢计算机的内存

这个是一种资源

大家如果你拆开你的计算机

你会看到里头有插的这种内存条

那么有的是插着一条插着两条

那这个数量是有限的

内存空间容量是有限的

一个有限的资源

为了能够让计算机系统安全的运行

你必须是在你不用的时候

要把它释放

否则的话那么多程序大家都不释放

那这种内存总有一天会用完是吧

所以在你编写程序的时候

你不用的内存如果你开辟出来

你将来是要把它释放掉的

第三句话就是来完成

这样的一个释放的过程

那么它用的运算符是delete

这个delete后面跟上

你要删除的指针变量

就表示把它删掉

也就是删除掉这个指针变量

所指的8:44

什么叫所指呢就是这个内存变量

这个指针变量它所保存的值

实际上是一个地址的值

所指的意思就是这个地址值

所代表的那个内存单元把它释放掉

ptr本身这个存放地址它也9:06 空间呀

这个空间是ptr变量自身的这个空间

这个是不释放的

所以不要把这个搞混了

第四个比第三个多了一个方括号

它表示的是删除多个单元组成的

一个内存块

那么像刚才我们这个array这个指针变量

它是分配了十个元素

所组成的一个数组

那么delete括号array

就是把这个数组的十个元素

都把它释放掉

大家不难想到这个delete跟前一个delete

它是有重大的差别的

也就是说当你在分配

这个指针变量所指的

如果是单个的这个内存

这个变量所占的内存的话

那应该是直接用第三套语句

这种形式直接delete

如果你当时分配给它的时候

就是一个多个元素组成的

一个连续的这样的数组形式的话

那你必须用delete方括号这种形式

来删除否则的话

程序会出现10:23 的错误

或者其它一些很诡异的现象

其实很好记就是你

这个是配对的

如果是单个的变量

那就直接delete如果是数组的变量

那就用delete方括号

所以希望大家在用到用delete和new

来管理这种指针变量的时候

一定要互相是匹配的

不能出现这种交错

这是我们第二个要来讲到的

在指针变量它的动态的生成与删除

第三个叫做左值引用

当然顾名思义有左值肯定有右值

我们待会儿会讲右值

现在是先看左值引用

这个左值的引用它的符号呢

是一个& 符号

那么它表示是对一个

已经有名称的变量

再给它取个别名

就是一个变量在内存里头占了空间

它有一个名字这是编译器赋予它的

那同时呢我们现在用引用的话

可以给它再取个名字

所以左值引用一定是

对于一个已经存在的变量

而且是已经存在的有名字的变量

给它再取一个新名字

就是这个变量有两个名字啦

我们可以看到这个例子里头

比方说int v0这是一个变量名字叫v0

那我给它再取个名字叫v1

怎么办呢int & v1=v0

就是说这个v1呀它是一个整数变量

因为你看它类型是int吗对不对

一个整数变量它的引用

用后面在int 后面跟了个&

也就是说某一个变量

它又给它一个新的名字叫v1

所以这个int & v1=v0就表示

把v0这个已经存在的变量

再取一个新的名字叫v1

那么可见它们在内存里头

占的一定是同样的一个地址

根据前面的这个例子的

我们可以发现这个引用

必须在定义它的时候来初始化

因为它是一个

已经有名字的变量的别名

所以你不能说我先把别名取好

然后再给别的变量套上去

不是这样子的所以一定是

要在一个已有的变量基础上

去做这个事情

因此呢它在定义的时候

必须给它初始化

不可以像刚才例子里头那个v0一样

我先给它定义一个int v0分号

这就是定义的一个变量

它的值是什么呢它的值后面再去说去

不行v1这种引用变量不可以分开

再一个呢就是这种被引用的变量

像刚才是int v0是一个单独的

一个常规的一种变量的形式

那么被引用的其实也可以是一个

结构变量的成员比方说

某一个结构变量是s

它的数据成员有个m

那我就可以给这个s.m取个新的名字

这样的话呢可能看起来会更容易看

而且呢写起来会更方便

比如说你的这个结构名字很长

然后结构里头再套结构套了四五层

那为了去引用你

最里层的那个结构的某个成员

你会写很长很长的一个串对吧

比方说这个第一层的这个结构的名字点

它的成员的名字再点

一直点下去好几个

这样的话代码写起来非常的不容易看懂

为了简捷起见可以给它取个名字

然后呢用一个符号来表示它

这个是这样的话就是说

代码的改写阅读就会比较方便

还有呢就是这个函数的参数

我们除了传普通的变量之外

也可以传引用类型

那这个时候表示的是

这个函数的形式参数和它的实际的参数

是同一个变量

也就是说你去改变这个形参

同时也会改变实参

这个比方说下面我们这个

调用这个swap这个函数的时候

那么它的这个含义呢

是把两个参数的这个值进行互换

如果你直接是这个参数是inta b

这很显然这个你就换不过来

但是如果是int&a int&b也就是说

它的这两个形参是实参的引用

也就是说这里头你看到的a跟b

是那个实际参数的别名

a是第一个实际参数的别名

b是第二个实际参数的别名

那么在函数体里头对ab的调用

实际上是把别名所代表的真实的变量

也就是那个实参它的值进行了交换

这样的话你调用swap

就真的把这个两个变量的值给换掉了

这是函数的参数它也可以用引用

最后一个呢就是函数的返回值

也可以说是引用类型

但是我们要注意这个别名那

是一个长时间存在着的

这个有名字的变量的别名

所以临时变量是不行的

如果是函数里头定义的局部变量

函数一返回之后这个变量就没了

所以给它取一个别名

且把这个别名返回回去

其实是没有意义的

因为这个函数已经返回了

这个变量就没了

它这个别名就没有意义了

所以函数的返回值可以是引用类型

但是不可以是函数里头定义的

这种临时变量

这个是在使用左值引用的时候

需要注意的

那么下一个呢就是这个右值引用

这是在16:49 里头新增加的一个东西

那么这个右值引用也就是

我们首先要去区分的什么叫右值呢

不能取地址的没有名字的就是右值

比方说匿名的变量

像临时变量它都是匿名的没有名字

那么我们就可以给它取个别名

就是原来本来没有名字

我可以通过右值引用给它一个名字

那它下面这个代码里头

int&&sum=3+4等于这个符号是

对它进行付出值那么17:27 是什么呢

是3+4这个表达式它本来没有名字

它只有结果但是呢我们希望用

把这个表达式给它一个名字

那怎么做呢我可以用int&&

两个&符号来表示是右值引用

也就是说sum这个变量是对一个

本来没有名字的3+4的这个结果

给它取了个名字就相当于这个指代一样

这个sum就指代着3+4的那个运算的东西

这是一种办法

那还有一个呢看下面这句话的这个例子

是一个返回能够返回值的一个函数调用

传了两个参数进去那么这个返回值呢

本来是临时变量

你要不要都没关系都可以扔掉的

那现在我们想让它留下了

不想抛弃它

那它的名字是没有的

那怎么能够去把它保存下来呢

那我们看下面这个它这个函数

它返回一个临时的变量对吧

这个临时变量本来是没有名字的

我们现在呢想用一个变量

来代表这个返回的这个临时变量

那我们也可以用一个右值引用

来给它这个保管它

就是它下面所写的float&&res=18:59

这样的话呢就把这个retumRvalue

这个函数的返回的一个

没有名字的临时变量

用res这个有名字的右值引用的

这种变量来代表它

当然了右值引用它其实最典型的应用

是在这个函数的参数当中

比方说下面这个AcceptRvalueRef

这样的一个函数那么它就接收了一个s

这是一个右值的引用

那么这个东西的目的呢

主要是为了去减少这个临时变量

它在传给这个函数的时候

它有一个把内容复制过去

这样的一个时间上的开销

我们后面在讲到面向对象的

在这个类呀对象这种

特别是对象的这个函数传递的时候

可能会有些地方就要用到这样的一个

怎么能够把这个变量的拷贝的开销

给它降下来呢

在那个时候这个右值引用

就会起到一个很有益的这种帮助

这就是为什么在新的C++的标准里头

会加入这么一个语法点的原因

面向对象程序设计(C++)课程列表:

第一讲 课程简介与编程环境

-1.0 课程定位、教学内容

--课程定位与教学内容

-1.0 课程定位、教学内容--作业

-1.1 编程环境与工具

--程序结构与编译链接

--源程序拆分

--多文件编译链接的方法

-1.2 main函数的命令行参数

--main函数的命令行参数

-作业一--作业

第二讲 基础语法(1)

-2.1 变量定义

--变量定义

-2.2 变量的初始化、类型推导与基于范围的循环

--变量的初始化、类型推导与基于范围的循环

-2.3 函数重载

--函数重载

-2.4 函数参数的缺省值与追踪返回类型的函数

--函数参数的缺省值与追踪返回类型的函数

-2.5 类的定义

--类的定义

-2.6 类成员的访问权限与友元

--类成员的访问权限与友元

-第二讲 基础语法(1)--作业二

第三讲 基础语法(2)

-3.1 构造函数析构函数

--构造函数析构函数

-3.2 赋值运算符重载

--赋值运算符重载

-3.3 流运算符重载

--流运算符重载

-3.4 函数运算符重载

--函数运算符重载

-3.5 下标运算符与自增减运算符重载

--下标运算符与自增减运算符重载

-3.6 静态成员与常量成员

--静态成员与常量成员

-3.7 对象组合

--对象组合

-3.8 移动构造函数

--Video

--Video

-3.9 default修饰符

--Video

-第三讲 基础语法(2)--作业三

第四讲 基础语法(3)

-4.1 继承

--Video

-4.2 函数重写

--Video

-4.3 虚函数

--Video

--Video

-4.4 自动类型转换

--Video

-4.5 禁止自动类型转换

--Video

-4.6 强制类型转换

--Video

-4.7 函数模板

--Video

-4.8 类模板

--Video

-4.9 成员函数模板

--Video

-4.10 模板特化

--Video

-作业四--作业

第五讲 找到对象,确定接口

-5.0 引言

--Video

-5.1 从FOP到OOP

--Video

-5.2 对象在哪里

--Video

-5.3 接口在哪儿

--Video

-5.4 实现接口

--Video

-5.5 变与不变:多态的威力

--Video

第六讲 算法横向拆分,分离步骤

-6.0 引言

--讨论

-6.1 从负载监视器的设计开始

--从负载监视器的设计开始

-6.2 接口的分离与单一责任原则

--接口的分离与单一责任原则

-6.3 委托与接口的进一步分解

--委托与接口的进一步分解

-6.4 分离不同层面的可变性

--分离不同层面的可变性

第七讲 算法纵向拆分,分离表示

-7.0 引言

--Video

-7.1 迭代器

--Video

-7.2 迭代器的实现

--Video

-7.3 迭代器与模板

--Video

-7.4 算法与数据的解耦

--Video

-7.5 抽象结构与类模板

--Video

-7.6 函数对象与算法分解

--Video

-7.7 基于模板的策略模式

--Video

第八讲 基于接口组合,应对复杂变化

-8.0 引言

--Video

-8.1 已有资源的组合

--Video

-8.2 适当引入接口

--Video

-8.3 接口不变时的功能变化

--Video

-8.4 装饰

--Video

-8.5 责任的传递与责任链

--Video

-8.X 小结

--Video

第九讲 增加抽象层级,隔离复杂变化

-9.0 引言

--Video

-9.1 通过封装增加隔离、应对变化

--Video

--Video

-9.2 增加抽象层,应对变化

--Video

--Video

-9.3 相互关联对象的创建

--Video

-9.4 示例:自动组卷系统设计

--Video

-9.5 设计思路(上)

--Video

-9.6 设计思路(中)

--Video

-9.7 设计思路(下)

--Video

-9.X 小结

--Video

-课程总结

--Video

期末考试

-期末考试--作业

变量定义笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。