编译器为了实现引用必须生成一个临时对象,引用实际上指向该对象但用户不能访问它例如当我们写
double dval = 1024;
const int &ri = dval;
编译器将其转换成
int temp = dval;
const int &ri = temp;
如果我们给ri 赋一个新值,则这样做不会改变dval,而是改变temp。
对用户来说就好像修改动作没有生效这对于用户来说这并不总是好事情
”如果我们给ri 赋一个新值“ 这句话说错了吧。
ri=3; 根本就不能编译通过。我想作者的本意是 dval=5; 之后 dval的值改变了,而ri的值并没有改变。这一点却是比较危险。怎么杜绝这一点危险呢?
double dval = 1024;
const int &ri = dval;
编译器将其转换成
int temp = dval;
const int &ri = temp;
如果我们给ri 赋一个新值,则这样做不会改变dval,而是改变temp。
对用户来说就好像修改动作没有生效这对于用户来说这并不总是好事情
”如果我们给ri 赋一个新值“ 这句话说错了吧。
ri=3; 根本就不能编译通过。我想作者的本意是 dval=5; 之后 dval的值改变了,而ri的值并没有改变。这一点却是比较危险。怎么杜绝这一点危险呢?
这么写本来就有问题.
类型应该是相同的.防止编辑器自作聪明的加临时变量.
const int &ra=a;
ra=1; //错误
a=1; //正确
Matrix operator+( Matrix *m1, Matrix *m2 )
{
Matrix result;
// 在 result 中计算
return result;
}
就得这么调用 &a + &b; // 不太好, 但也不是不可能.
而且 &a + &b + &c; 不能工作
必须 (&a + &b) +&c
// 使用引用参数的新实现
Matrix operator+( const Matrix &m1, const Matrix &m2 )
{
Matrix result;
// 在 result 中进行计算
return result;
}
该实现支持如下形式的Matrix 对象的加法
a + b + c
add(&m1,&m2,&result)函数来运算了.因为+号,要求返回对象的,要进行对象的构造和拷贝,效率会低一些.非常细节的问题,今天终于明白了.