C++Primer 学习笔记——第4,5,6章 表达式,语句和函数

C++语法在这三个单元与C的语法十分相似,所以我只记录C++特有的语法特别是C++11标准的内容。

第4章 表达式

类型转换

隐式转换

1. 算术转换
整型提升
整型提升是把小正数类型转换成较大的整数类型。对于bool,char,signed char , unsigned char , short , unsigned short,只要他们的值可能存在int里,它们就会提升成int类型;否则提升成unsigned类型。
无符号类型的运算对象

  1. 像往常一样,首先执行整型提升。如果结果的类型匹配,无须进一步的转换。
  2. 如果一个运算对象是无符号类型,另外一个运算对象是带符号类型,其中的无符号类型不小于带符号类型,那么带符号类型会转换成无符号类型。
  3. 剩下一种情况是带符号类型大于无符号类型,此时转换的结果依赖于机器。

2. 其他隐式转换
数组转换成指针:在大多数用到数组的表达式中,数组自动转换成数组首元素的指针。
指针的转换:C++还规定了几种其他的指针转换方式,包括常量整数值0或者字面值nullptr能转换成任意指针类型。指向任意非常量的指针能转换成void*;指向任意对象的指针能转换成const void* 。
转换成布尔类型:存在一种从算术类型或指针类型向布尔类型自动转换的机制。如果指针或者算术类型的值为0,转换的结果是false,否则转换的结果是true:
转换成常量:允许指向非常量类型或指针类型转换为指向常量的指针,对于引用也是这样。
类类型定义的转换:类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换。

显示转换

1.static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。例如

double slope = static_cast<double>(j)/i;

当需要把一个较大的算术类型赋给较小的类型时,static_cast非常有用。

const_cast

const char *pc;
char *p=const_cast<char *>pc;

一般称其为去掉const性质

语句

throw语句

程序的异常检测部分使用throw表达式引发一个异常。
throw表达式包含关键字throw和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。

try语句

try{
	program-statements
}catch(exception-declaration){
	handler-statements
}catch(exception-declaration){
	handler-statements
}

函数

函数重载

如果同一作用域内的几个函数名字相同,但形参列表不同,我们称之为重载函数

void print(const char *cp);
void print(const int *beg,const int *end);
void print(const int ia[],size_t size);

这些函数接受的形参类型不一样,但是执行的操作非常类似。当调用这些函数时,编译器会根据传递的实参类型推断想要执行的是哪个函数:

main函数不能重载

定义重载函数

Record lookup(const Account&)
Record lookup(const Phone&)
Record lookup(const Name&)

其中,虽然我们定义的三个函数不同,但它们都有一个名字。编译器根据实参的类型确定应该调用哪一个函数。

但是不允许两个函数除了返回类型外其他要素都相同。

重载和const形参

Record lookup(Phone)
Record lookup(const Phone)//重复声明了Record lookup(Phone)

Record lookup(Phone *)
Record lookup(Phone * const)//重复声明了Record lookup(Phone *)

一个拥有顶层const的形参没有办法与另一个没有顶层const的形参区分开来

Record lookup(Account&)
Record lookup(const Account&)

Record lookup(Account*)
Record lookup(const Account*)

另一方面,可以通过区分其指向的是常量还是非常量实现函数重载。

特殊用途语言特性

默认实参

typedef string::size_type sz;
string screen(sz ht = 24,sz wid = 80,char backgrnd = ' ')

某些函数有这样一种形参,在函数多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参

内联函数和constexpr函数

内联函数可避免函数调用的开销
在大多数机器上,一次函数调用其实包含着一系列工作:调用前要先保存寄存器,并在返回时恢复:可能需要拷贝实参;程序转向一个新的位置继续执行。

将函数指定为内联函数(inline),通常就是将它在调用点上“内联地”展开。

constexpr函数
constexpr函数是指能用于常量表达式的函数。

  • 函数的返回类型及所有的形参类型都得是字面值类型。
  • 有且只有一个return 语句。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alfred young

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值