【C++Primer---C++知识点记录III---表达式、语句、函数】

目录

基础

递增和递减运算符

成员访问运算符

位运算符

sizeof运算符

语句

try语句块和异常处理

局部对象

函数声明

const形参和实参

数组形参(此处还需学习)

含有可变形参的函数

数组返回值

特殊用途语言特性

函数指针


基础

左值和右值

lvalue代表一个在内存中占有确定位置的对象(换句话说就是有一个地址)。
rvalue通过排他性来定义,每个表达式不是lvalue就是rvalue。因此从上面的lvalue的定义,rvalue是在不在内存中占有确定位置的表达式。

在C++中一个简单的归纳:当一个对象被用作右值时,用的是对象的值(内容),当一个对象被用作左值时,用的是对象的身份(在内存中的位置)

一个重要的原则是在需要右值的地方可以用左值来代替,但是不能把右值当做左值使用

右值引用(C++11)

【C++Primer---C++知识点记录III---表达式、语句、函数】_第1张图片

有四种运算符明确规定了运算对象的求值顺序

&&——要求先求左侧运算对象的值,只有当左侧运算对象的值为真时才继续求右侧运算对象的值

||     ?:    ,

进行比较运算时除非比较的对象是布尔类型,否则不要使用布尔字面值true和false进行比较

if(val)和if(!val)就可 (只要val是非0值就是真

递增和递减运算符

前置++是首先将运算对象+1,然后将改变后的对象作为求值结果,将对象本身作为左值返回

后置++也会将运算对象+1,但求值结果是运算对象改变之前的那个值的副本,将对象原始值的副本作为右值返回

建议:除非必须,否则不使用递增运算符的后置版本

在这时候用后置(而且要多用这种间接的写法)

cout<<*p++<

成员访问运算符

ptr->mem 等价于 (*ptr).mem

位运算符

位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合

【C++Primer---C++知识点记录III---表达式、语句、函数】_第2张图片

sizeof运算符

sizeof(type)

sizeof expression

【C++Primer---C++知识点记录III---表达式、语句、函数】_第3张图片

sizeof并不会计算其运算对象的值!

命名的强制类型转换p144 

-------------------------------------------------------------------------------------------------------------------------------

语句

空语句:在程序某处语法上需要一条语句,但逻辑上不需要,就可以用只有一个分号的空语句

*使用空语句应加上注释

符合语句(块):花括号括起来,语法上需要一条语句,但逻辑上需要多条语句

switch语句:

  •         注意别忘记写break
  •         即便什么都不做,定义一个default:标签也是有用的

for循环语句头中定义的对象只在for循环体内可见

跳转语句

break:

        负责终止离它最近的while,do while,for,switch语句,并从这些语句之后的第一条语句开始执行

continue:

        终止最近的循环中的当前迭代并立刻开始下一次迭代,只能出现在for,while和do while循环的内部。它同样也作用于离它最近的

try语句块和异常处理

throw表达式,异常检测部分使用throw表达式来表示它遇到了无法处理的问题,我们说throw引发了异常

try语句块,异常处理部分使用try语句块处理异常,try语句块以try关键字开始,以一个或多个catch子句结束。try语句块中代码抛出的异常通常会被某个catch子句处理。catch子句也被称为异常处理代码

一套异常类,用于在throw表达式和相关的catch子句之间传递异常的具体信息

【C++Primer---C++知识点记录III---表达式、语句、函数】_第4张图片

其基本思想是:函数 A 在执行过程中发现异常时可以不加处理,而只是“拋出一个异常”给 A 的调用者,假定为函数 B。

拋出异常而不加处理会导致函数 A 立即中止,在这种情况下,函数 B 可以选择捕获 A 拋出的异常进行处理,也可以选择置之不理。如果置之不理,这个异常就会被拋给 B 的调用者,以此类推。

如果一层层的函数都不处理异常,异常最终会被拋给最外层的 main 函数。main 函数应该处理异常。如果main函数也不处理异常,那么程序就会立即异常地中止。

throw  表达式;
try {
    语句组
}
catch(异常类型) {
    异常处理代码
}
...
catch(异常类型) {
    异常处理代码
}

try…catch 语句的执行过程是:
执行 try 块中的语句,如果执行的过程中没有异常拋出,那么执行完后就执行最后一个 catch 块后面的语句,所有 catch 块中的语句都不会被执行;
如果 try 块执行的过程中拋出了异常,那么拋出异常后立即跳转到第一个“异常类型”和拋出的异常类型匹配的 catch 块中执行(称作异常被该 catch 块“捕获”),执行完后再跳转到最后一个 catch 块后面继续执行

(80条消息) C++异常处理 详解_Yuyao_Xu的博客-CSDN博客

-----------------------------------------------------------------------------------------------------------------------------

局部对象

形参和函数体内部定义的变量统称为局部变量,仅在函数的作用域内可见。

在所有函数体之外定义的对象存在于程序的整个执行过程中,此类对象在程序启动时被创建,直到程序结束才会销毁。

自动对象:只存在于块执行期间的对象,例如形参

局部静态对象:某些时候,有必要让局部变量的生命周期贯穿函数调用及之后的时间。可以将局部变量定义成static类型从而获得这样的对象。它直到程序终止时才被销毁。如果静态局部对象没有显式的初始值,它将初始化为0。

函数声明

函数的名字必须在使用之前声明。

函数声明要包含函数的三要素----返回类型,函数名,形参类型

函数声明也称为函数原型

和变量一样,建议函数在头文件中声明在源文件中定义

  • 在C++语言中,建议使用引用类型的形参代替指针。
  • 使用引用避免拷贝
  • 如果函数无需改变引用形参的值,最好将其声明为常量引用

const形参和实参

顶层const作用于对象本身,使用实参初始化形参时会忽略掉形参的顶层const。

尽量使用常量引用(书p191-192)

数组形参(此处还需学习)

形参可以写成:

const int *

const int[] //函数的意图是作用于一个数组

const int[10] //这里的维度表示我们期望数组含有多少元素,实际不一定

数组是以形参的形式传递给函数的

管理数组实参有三种方法

  1. 使用标记指定数组长度,比如C风格字符串的空字符
  2. 传递指向数组首元素和尾后元素的指针
  3. 显式传递一个表示数组大小的形参

形参还能是数组的引用

void print(int (&arr)[10]){}

含有可变形参的函数

C++11-----initializer_list

如果函数的实参数量未知但是全部实参的类型都相同,我们可以用initializer_list类型的形参。它是一种标准库类型,用于表示某种特定类型的值的数组。定义在同名头文件中。

initializer_list对象中的值都是常量

向该形参中传递一个值的序列,则必须把序列放在一对花括号内

【C++Primer---C++知识点记录III---表达式、语句、函数】_第5张图片

省略符形参(待学)

在return语句中,返回一个值的方式和初始化一个变量或形参的方式完全一样

不要返回局部对象的引用或指针

C++11支持列表初始化返回值

数组返回值

由于数组不能被拷贝,所以函数不能返回数组,不过,函数可以返回数组的指针或引用。

声明一个返回数组指针的函数(p205待加深理解):

        int(*func(int))[10]    

使用尾置返回类型(C++11)

           auto func(int i)->int (*)[10]

可以看出该函数返回一个指向10个整数数组的指针,原来放返回值的地方用auto代替

使用decltype

        【C++Primer---C++知识点记录III---表达式、语句、函数】_第6张图片

const_cast和重载(p209)

特殊用途语言特性

默认实参

一旦一个参数有默认实参,它右边都得有

在函数声明中指定默认实参,并放在头文件中

内联函数inline

内联说明只是向编译器发出的请求,编译器可以忽略这个请求

constexpr函数

函数的返回类型,所有形参类型都得是字面值类型,而且函数体中必须有且只有一条return语句

被隐式的指定为内联函数

不一定返回常量表达式

调试帮助(p215)

函数指针

【C++Primer---C++知识点记录III---表达式、语句、函数】_第7张图片

注意*pFunc两边的括号必不可少

当我们把函数名作为一个值使用时,函数自动转换为指针

写不写取地址符都可以

可以直接用函数指针调用函数

函数指针还可以做形参

【C++Primer---C++知识点记录III---表达式、语句、函数】_第8张图片

 书p222,使用decltype和typedef,待学

p223返回函数指针(和之前的数组类比,待学)

你可能感兴趣的:(C++,开发语言,c++)