- 论坛徽章:
- 0
|
在著名的“c++编程思想”这本书中,第七章《常量》里面,对于临时变量谈到了这样一个观点:“它们自动地成为常量”(在第8页)。我个人感觉这是个比较合理的解释。在书中的第10页还举了一个例子证明,代码如下:
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <backward/strstream>
#include <cassert>
#include <exception>
using namespace std;
class X { };
X f() { return X(); }
void g1(X&) { }
void g2(const X&) { }
int
main(void)
{
g1(f()); // A temporary object will be created here, we name it with 'T1'
g2(f());
return(0);
}
在我用的AIX服务器上,编译这段程序时会如期望的那样报错:
a.cpp: In function `int main()':
a.cpp:21: error: invalid initialization of non-const reference of type 'X&'
from a temporary of type 'X'
a.cpp:14: error: in passing argument 1 of `void g1(X&)'
我们假设f()产生一个临时对象T1,而T1具有const属性,所以你不能把它作为一个非const引用所指向的对象。因为这样可能会破坏const的常量性限定,所以编译器禁止此做法。
但是我们知道,如果一个对象具有const属性,那么它的特征之一就是只能调用它的const成员函数。那么据此判断,如果上例中的类X有成员函数,那么临时变量T1就只能调用其中的const成员函数。真的是这样吗,我把书里面的代码稍微改了一下:
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <backward/strstream>
#include <cassert>
#include <exception>
using namespace std;
class X {
int i;
public:
X (int I=100) : i(I) { }
void Print_X() {
i++;
cout << "Now i is " << i << endl;
}
};
X f() { return X(); }
int
main(void)
{
f().Print_X(); // A temporary object will be created here, we name it with 'T1'
return(0);
}
大家猜猜编译的结果是什么?顺利通过!执行编译好的程序,输出如下:
Now i is 101
可以看到,不仅非const成员函数调用成功,而且临时对象T1的成员值实实在在地被改变了!也就是说,从这个例子看,T1并不具备const属性。
两个程序得到了两个相反的结论。我的感觉是:对于一个临时对象,当你把它和其它的对象发生联系时(比如你把这个临时变量的地址赋给一个指针,或者你把这个临时变量作为另一个引用所指向的对象),它的const限定才会起作用;但如果它不和其它的对象发生关系,似乎不去关心它是否有const属性。
这只是我的猜测,没什么理论根据。非常希望能听听大家的意见,更希望能有高手给一个明确的答复。谢谢!
[ 本帖最后由 羽人 于 2006-8-16 14:22 编辑 ] |
|