引用与指针
没有所谓的null reference
reference一定需要代表某个对象,所以C++要求reference必须有初值。
QString &s;
使用reference可能比使用pointer更高效。
因为reference一定是有效的,而指针可能为空(需要多加一个判断)。
指针可以被重新赋值,指向另一个对象,而引用总是指向初始化时的那个对象。
------
旧式的C转型方式:几乎允许你将任何类型转换为任何其他类型。
pointer-to-const-object ---> pointer-to-non-const-object
改变对象的常量性
---
static_cast基本上和C旧式转型有相同的威力,限制。
strcut--->int 不可以
double--->pointer 不可以
移除表达式的常量性 不可以
---
const_cast
改变表达式中的常量性和变易性
可以将某个变量的常量性去除。
---
C++中真正的临时对象是不可见的---不会在源代码中出现。
只要产生了一个non-heap object,没有命名,就产生了一个临时对象。
void test(const std::string & str)
{
}
char buffer[10];
test(buffer);
从char数据--->const string &
此时类型是不吻合的,编译器此时会产生一个类型为string的临时对象。
一个临时对象的构造和析构,有其非必要的成本。
---
如果对象被传递给一个reference-to-non-const参数,并不会发生此类转换。
编译器会阻止的。
void test(std::string & str)
{
}
char buffer[10];
test(buffer);
思考:因为如果此时产生了一个临时变量string,那么,在函数中如果改变它的值,对buffer是没有影响的,这就违背了我们编写该函数的目的。
---
函数返回一个对象时,会产生临时对象。
此时我们应该做的是,努力降低返回对象的成本。
存在一种特殊写法,在函数返回对象时,可以让编译器消除临时对象的成本 ,就是返回constructor arguments来取代对象。
这样还是会产生临时对象。
但编译器不需要产生“函数内的临时对象”和“函数返回的临时对象”,它们可以将return表达式定义的对象构造于c的内存中。此时没有任何临时变量被产生出来。
const reational operator*(const reational& lhs,const reational& rhs)
{
return reational(lhs.num()*rhs.num(),lhs.count()*rhs.count());
}
rational a = 10;
rational b(1,2);
retional c = a * b;