目录
基础
递增和递减运算符
成员访问运算符
位运算符
sizeof运算符
语句
try语句块和异常处理
局部对象
函数声明
const形参和实参
数组形参(此处还需学习)
含有可变形参的函数
数组返回值
特殊用途语言特性
函数指针
左值和右值
lvalue代表一个在内存中占有确定位置的对象(换句话说就是有一个地址)。
rvalue通过排他性来定义,每个表达式不是lvalue就是rvalue。因此从上面的lvalue的定义,rvalue是在不在内存中占有确定位置的表达式。
在C++中一个简单的归纳:当一个对象被用作右值时,用的是对象的值(内容),当一个对象被用作左值时,用的是对象的身份(在内存中的位置)
一个重要的原则是在需要右值的地方可以用左值来代替,但是不能把右值当做左值使用
右值引用(C++11)
有四种运算符明确规定了运算对象的求值顺序
&&——要求先求左侧运算对象的值,只有当左侧运算对象的值为真时才继续求右侧运算对象的值
|| ?: ,
进行比较运算时除非比较的对象是布尔类型,否则不要使用布尔字面值true和false进行比较
if(val)和if(!val)就可 (只要val是非0值就是真)
前置++是首先将运算对象+1,然后将改变后的对象作为求值结果,将对象本身作为左值返回
后置++也会将运算对象+1,但求值结果是运算对象改变之前的那个值的副本,将对象原始值的副本作为右值返回
建议:除非必须,否则不使用递增运算符的后置版本
在这时候用后置(而且要多用这种间接的写法)
cout<<*p++<
成员访问运算符
ptr->mem 等价于 (*ptr).mem
位运算符
位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合
sizeof运算符
sizeof(type)
sizeof expression
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子句之间传递异常的具体信息
其基本思想是:函数 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] //这里的维度表示我们期望数组含有多少元素,实际不一定
数组是以形参的形式传递给函数的
管理数组实参有三种方法
- 使用标记指定数组长度,比如C风格字符串的空字符
- 传递指向数组首元素和尾后元素的指针
- 显式传递一个表示数组大小的形参
形参还能是数组的引用
void print(int (&arr)[10]){}
含有可变形参的函数
C++11-----initializer_list
如果函数的实参数量未知但是全部实参的类型都相同,我们可以用initializer_list类型的形参。它是一种标准库类型,用于表示某种特定类型的值的数组。定义在同名头文件中。
initializer_list对象中的值都是常量
向该形参中传递一个值的序列,则必须把序列放在一对花括号内
省略符形参(待学)
在return语句中,返回一个值的方式和初始化一个变量或形参的方式完全一样
不要返回局部对象的引用或指针
C++11支持列表初始化返回值
数组返回值
由于数组不能被拷贝,所以函数不能返回数组,不过,函数可以返回数组的指针或引用。
声明一个返回数组指针的函数(p205待加深理解):
int(*func(int))[10]
使用尾置返回类型(C++11)
auto func(int i)->int (*)[10]
可以看出该函数返回一个指向10个整数数组的指针,原来放返回值的地方用auto代替
使用decltype
const_cast和重载(p209)
特殊用途语言特性
默认实参
一旦一个参数有默认实参,它右边都得有
在函数声明中指定默认实参,并放在头文件中
内联函数inline
内联说明只是向编译器发出的请求,编译器可以忽略这个请求
constexpr函数
函数的返回类型,所有形参类型都得是字面值类型,而且函数体中必须有且只有一条return语句
被隐式的指定为内联函数
不一定返回常量表达式
调试帮助(p215)
函数指针
注意*pFunc两边的括号必不可少
当我们把函数名作为一个值使用时,函数自动转换为指针
写不写取地址符都可以
可以直接用函数指针调用函数
函数指针还可以做形参
书p222,使用decltype和typedef,待学
p223返回函数指针(和之前的数组类比,待学)
你可能感兴趣的:(C++,开发语言,c++)