c++陷阱之临时变量
来源:互联网 发布:js引用js文件 编辑:程序博客网 时间:2024/04/28 09:58
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的地址。
零时变量,尤其是整型,编译其一般都把它放在寄存器里。
所以随着寄存器中值的变化,输出的值会不同。
- c++陷阱之临时变量
- c++陷阱之临时变量
- C语言交换变量之临时变量使用指针
- C/C++中的临时变量
- 交换两个数不使用临时变量的陷阱
- C陷阱与缺陷之词法陷阱
- C陷阱与缺陷之语法陷阱
- C语言中也有 临时定义变量
- [C++]引用参数与临时变量
- C语言小编程之不创建临时变量,交换两个数的值
- [c/c++]临时变量、局部变量,return的效率
- 记录自已学习之临时匿名变量
- 临时变量
- 临时变量
- C语言变量类型隐式转换小陷阱
- C陷阱与缺陷之(一)
- 读书笔记之《C陷阱与缺陷》
- C指针陷阱之传值指针
- 什麽是PCB
- Java多核线程笔记-volatile的原理与技巧
- 折半查找
- 非常有用的Java日期时间操作函数代码一览
- 顺序栈
- c++陷阱之临时变量
- 顺序表
- 链式队列
- C# 杨辉三角形
- fseek () 函数
- 猴子吃桃问题
- 在Eclipse中使用VSS Plugin插件,强烈推荐!
- 【JAVA】关于static
- ATM基础知识