您的位置:首页 > 编程语言 > C语言/C++

C++ primier(第五版)读书笔记 第四章

2018-01-13 09:09 155 查看
C++中的左值与右值

当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。我们可以在需要右值的地方使用左值来代替,但是不能把右值当成左值使用;(int b=a与int 2=b)

使用关键字decltype时,如果表达式求值结果是左值,decltype将得到一个引用类型。假设p的类型是int *,因为解引用运算符生成左值,那么decltype(*p)得到的结果是int&;另一方面,由于取地址运算符生成右值,所以decltype(&p)的结果是int**。

函数优先级问题

f()+g()*f()+h(),这些函数首先要进行求值,这些函数的求值顺序是没有明确规定的,如果这些函数影响同一对象,那么结果将是未定义的。

运算符

除法:如果运算数同号,则取同号,否则异号,结果向0取整。

取余运算:取余运算遵从法则(m/n)*n+m%n==m 这就是说m%(-n)==m%n而(-m)%n==-(m%n)

(当数据量较大时,尝试使用常量引用)

在一条语句中混合使用解引用和递增运算符

auto pbeg=b.begin();
//输出元素直到遇到第一个负值为止
while(pbeg!=v.end()&&*pbeg>=0)
cout<<*pbeg++<<endl;
后置运算符的优先级高于解引用运算符。

前置递增运算符将对象自己作为一个左值返回,后置递增运算符将对象未修改的值作为一个右值返回。

箭头运算符作用于一个指针类型的运算对象,结果是一个左值;点运算符所属的对象如果是右值,则返回右值,如果是左值,则返回左值。

由于解引用运算符的级别低于点运算符,因而

*p.size();
这种写法一定是错误的。而

iter++->size()

是正确的,因为箭头的优先级高于++.

移位运算符(IO运算符)满足左结合律,故cout << "aa" << "bb" << endl;
((cout << "hi") << "bb") << endl;这两个语句是等效的。
cout << 10 < 42;
//现在用移位的思想来看这个语句,
//就是把数字10写到cout中,然后用cout与42进行比较
//当然这是illegal
}
Sizeof
对数组执行sizeof得到整个数组所占空间的大小//对指针执行sizeof得到指针所占空间大小//对string或vector实行sizeof只返回该类型固定部分的大小。

string a = "aaaa";
string b = "b";
cout << sizeof(a) << sizeof(b) << sizeof(string);
//输出结果全部为24

如果逗号右侧的运算对象是左值,那么逗号表达式最后求职结果也是左值。


类型转换

类型转换的形式为:
cast-name<type>(expression)

static-cast:任何具有明确定义的类型转换,只要不包含底层ocnst,都可以使用static-cast
int i = 5, j = 2;
double slope = static_cast<double>(i) / j;
cout << slope << endl;
double val = 1.3;
void *p = &val;
double *dp = static_cast<double*>(p);
const-cast只能改变运算对象的底层const,他将会去掉某个对象的const属性。
const char *pc;
char *p = const_cast<char*>(pc);
//通过p写入值是一个未定义的行为

const char *cp;
char *q = static_cast<char*>(cp);
//static-cast不能去掉const
static_cast<string>(cp);//正确
const_cast<string>(cp);
//const-cast不能改变对量类型
reinterpret-cast实现的类型转换模式为:它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。
int i = 30;
int *pi = &i;
char *cp = reinterpret_cast<char*>(pi);
cout << *cp << endl;
//输出一个非法字符
在上面的例子之中,cp会认为它指向了一个char,但是实际上它指向的是一个int,当输出时自然会遇到错误。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: