一、左值和右值
在c里,左值和右值根本区别就在于,左值是可以被赋值的,而右值不能。
在c++里就大有文章了,最基本的区别在于,左值应该是有地址的,存储在内存中的某个确定位置的,而右值并不在内存中占有确定位置的表达式。
具体可参见(https://blog.csdn.net/xuwqiang1994/article/details/79924310)
(但我个人对里面讲的还不是很理解,先码住,以后再回来看)
二、sizeof运算符
sizeof运算符返回一条表达式或一个类型名字所占的字节数。
sizeof(类型名字)
sizeof 表达式
对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof,再将结果求和。(即对数组进行sizeof,并不会被当成是指针处理)
对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算该元素占用了多少空间
char ia[5];
constexpr size_t sz=sizeof(ia)/sizeof(*ia);//一种可以求得数组元素数量的方法。
int arr[sz];//正确
三、一些隐式类型转换
①数组转换成指针:在很多用到数组的表达式中,数组会被当成是指针处理,但当数组被用作decltype关键字的参数,或者作为取地址符&,sizeof及typeid等运算符的运算对象时,或用一个引用初始化数组时,则数组还是数组。
②在条件语句的括号里,算术类型或指针类型回向布尔类型自动转换。while(cin>>s)//这里实际检查的是istream类型的值,IO库里定义了从istream向布尔值转换的规则,若读入成功为true,反之false
四、显式转换
1、命名的强制类型转换
形式:cast-name<type>(expression);
type是转换的目标类型,而expression是要转换的值,如果type是引用类型,则结果是左值。而cast-name是static_cast, dynamic_cast, const_cast, reinterpret_cast中的一种.
static_cast, 任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。
int i=5,j=6;
double slope =static_cast<double>(j)/i;
static_cast对于编译器无法自动执行的类型转换非常有用。例如,可以用static_cast找回存在于void*指针。void *p=&d;// 任何非常量对象的地址都能存入void*
double dp = static_cast<double *>(p);//将void * 转换回初始的指针类型(前提:指针原先所指的类型必须就是double)
const_cast, 只能改变运算对象的底层const,可以去掉运算对象的底层const
const char*pc;
char *p =const_cast<char *>(pc)//正确,但pc并未指向对象,所有通过p写值是未定义行为,解引用p去赋值会error。
一些例子:const char *cp;
char *q= static_cast<char *>(cp);//错误,static_cast不能改变const性质
static_cast<string>(cp);//正确,将字符串字面值转换成string类型
const_cast<string>(cp);//错误,const_cast只改变常量属性
reinterpret_cast, 通常为运算对象的位模式提供较低层次上的重新解释。本质上依赖机器,要想安全使用,必须对涉及的类型和编译器实现转换的过程都非常了解,这里先不掌握。
2、旧式的强制类型转换
type (expr) //函数形式的强制类型转换
(type) expr //c语言风格的强制类型转换
根据所涉及的类型不同,旧式的强制类型转换分别具有与const_cast, static_cast或reinterpret_cast相似的行为。当我们在某处执行旧式的强制类型转换时,如果换成const_cast, static_cast也合法,则其行为与对应的命名转换一致,若不合法,则其实现的功能相等于reinterpret_cast。
换而言之,在C++,这些强制类型转换更加明确了,是有利于我们去实际调试,排错、使用的。
再插一点try语句部分的内容:
try{
program-statements
}catch (exeception-declaration) {
handelr-statements
}catch (exeception-declaration) {
…
}
其中program-statements是可能会出现error的语句
exeception-declaration是错误的类型
handelr-statements是出现这种错误后,怎么处理。