c++陷阱之临时变量
2010-03-16 12:58
148 查看
1.向上强制类型转化产生临时变量
#include <stdio.h>
class Base
{
public:
int m_b;
Base(){m_b = 1;}
void Say(){
m_b=7;
};
};
class Drived:public Base
{
int m_d;
};
int main()
{
Derived d;
((Base)d).Say();
printf("%d", d.m_b);
return 0;
}
我们开始都会认为在调用Say()之后,对象d的m_b成员变量会被修改为7但是结果却输出“1”,原因如下:
这段代码是将对象d的内容拷贝到临时变量中,并且只拷贝Base中有的部分,这样做
就是所谓的“Slicing”。有些书中说这一步是由拷贝构造函数完成的。概念上是这样的,
但是实际上,编译器并没有生成一个真正意义上的拷贝构造函数。
这更进一步说明C++产生了一个临时对象作为强制转换的中间结果。然后以这个临时
对象代替我们的对象d,来调用函数Say()。那么结果自然是,临时变量的m_b被改变,
而我们的d.m_b没有发生变化
这种强制类型转换就是所谓的"向上转型",upcasting。 也叫Object Slicing。这种操作应该小心使用,甚至避免
2.临时变量被存储在寄存器中
void f1( int * &j)
{
int l=20;
j=&l;
}
void any_function_use_local_variables()
{
int a,b;
a=b=1000;
}
int main()
{
int *j;
f1(j);
cout <<*j <<" ";
any_function_use_local_variables();
cout <<*j <<" ";
cout <<*j <<" ";
*j = 10;
cout << *j;
return 0;
}
上面的例子输出的结果为: 20 1000 4383304
我是这样理解的,如有不妥,还请各位高人指点。
int *&j可以这么理解
typedef int * PINT;
void f1(PINT & j)
{
int l=20;
j=&l;
}
所以这是一个PINT类型的引用,也就是int * 类型的引用。
因为是引用,所以最后j指向了零时变量l的地址。
零时变量,尤其是整型,编译其一般都把它放在寄存器里。
所以随着寄存器中值的变化,输出的值会不同。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jia_xiaoxin/archive/2008/11/09/3262175.aspx
#include <stdio.h>
class Base
{
public:
int m_b;
Base(){m_b = 1;}
void Say(){
m_b=7;
};
};
class Drived:public Base
{
int m_d;
};
int main()
{
Derived d;
((Base)d).Say();
printf("%d", d.m_b);
return 0;
}
我们开始都会认为在调用Say()之后,对象d的m_b成员变量会被修改为7但是结果却输出“1”,原因如下:
这段代码是将对象d的内容拷贝到临时变量中,并且只拷贝Base中有的部分,这样做
就是所谓的“Slicing”。有些书中说这一步是由拷贝构造函数完成的。概念上是这样的,
但是实际上,编译器并没有生成一个真正意义上的拷贝构造函数。
这更进一步说明C++产生了一个临时对象作为强制转换的中间结果。然后以这个临时
对象代替我们的对象d,来调用函数Say()。那么结果自然是,临时变量的m_b被改变,
而我们的d.m_b没有发生变化
这种强制类型转换就是所谓的"向上转型",upcasting。 也叫Object Slicing。这种操作应该小心使用,甚至避免
2.临时变量被存储在寄存器中
void f1( int * &j)
{
int l=20;
j=&l;
}
void any_function_use_local_variables()
{
int a,b;
a=b=1000;
}
int main()
{
int *j;
f1(j);
cout <<*j <<" ";
any_function_use_local_variables();
cout <<*j <<" ";
cout <<*j <<" ";
*j = 10;
cout << *j;
return 0;
}
上面的例子输出的结果为: 20 1000 4383304
我是这样理解的,如有不妥,还请各位高人指点。
int *&j可以这么理解
typedef int * PINT;
void f1(PINT & j)
{
int l=20;
j=&l;
}
所以这是一个PINT类型的引用,也就是int * 类型的引用。
因为是引用,所以最后j指向了零时变量l的地址。
零时变量,尤其是整型,编译其一般都把它放在寄存器里。
所以随着寄存器中值的变化,输出的值会不同。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jia_xiaoxin/archive/2008/11/09/3262175.aspx
相关文章推荐
- c++中临时变量不能作为非const的引用参数
- C++ 临时变量做函数参数时的生命周期
- [C++]引用参数与临时变量
- C++讨厌的临时变量什么时候产生
- C++静态变量、临时变量、性能分析
- C++中函数建立临时变量的机制(const)
- C++临时变量的另类应用:基于iostream的类型安全的log接口设计
- C++ const引用、临时变量 引用参数
- C++中的临时变量
- C++临时变量的生命周期(const 引用后延长临时变量周期)
- C++临时变量的生命周期
- C++中的临时变量
- c++返回临时变量的疑惑 返回常量c风格字符串
- 在某些情况下,实参与引用参数不匹配,C++将生成临时变量
- C++中的临时变量
- C++中的临时变量[转]
- C++中的临时变量
- C/C++中的临时变量
- C++临时变量的生命周期
- C++临时变量的生命周期