作者:liguisen
blog:http://blog.youkuaiyun.com/liguisen/
C++:
例如:
#include <iostream.h>
class A
{
public:
int i;
A()
{
i = 1;//this在这里的值变成0x241ff2c
cout<<"A() i="<<i<<endl;
};
A(int j)
{
A(); //通过debug发现,this在这里的值是0x241ff5c,i是一不确定的值37879712
cout<<"A(int) i="<<i<<endl;
};
};
int main(int argc, char *argv[])
{
A aa(2);
cout<<aa.i<<endl<<endl;
return 0;
}
使用mingw2.95(gcc2.95.2)编译
结果显示:
A() i=1
A(int) i=37879712
37879712
分析:
A(int j)里面的A()是在这个函数内部生成了一个临时局部对象,this所指的对象和原先的没有任何关系,或者说
编译器初始化一个临时局部对象,而不是初始化this对象。
或者,再思考一下仅仅把那个j改成i呢?
JAVA:
可以通过this关键字来进行调用,如下程序将不能通过编译(JDK1.5)
public class Test
{
int i=0;
Test()
{
i=1;
System.out.println(i);
}
Test(int j)
{
Test();
System.out.println(i);
}
public static void main(String[] args)
{
Test temp=new Test(2);
System.out.println(temp.i);
}
}
可改为如下程序:
public class Test
{
int i=0;
Test()
{
i=1;
System.out.println(i);
}
Test(int j)
{
this();//改为this,如果还有更多的构造函数,可以通过参数来进行区分
System.out.println(i);
}
public static void main(String[] args)
{
Test temp=new Test(2);
System.out.println(temp.i);
}
}
输出
1
1
1
再看:
public class Test
{
int i=0;
Test(int j)
{
i=j;
System.out.println(i);
}
Test()
{
this(2);
System.out.println(i);
}
public static void main(String[] args)
{
Test temp=new Test();
System.out.println(temp.i);
}
}
输出:
2
2
2