首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

老帖子了,希望这一次,有人解答,该如何解决

2012-04-27 
老帖子了,希望这一次,有人解答C/C++ codeclass Test2{public:int avoid Print() const{couthelloen

老帖子了,希望这一次,有人解答

C/C++ code
class Test2{public:    int a;    void Print() const    {        cout<<"hello"<<endl;    }public:    Test2( int val=23):a(val){}    ~Test2(){}};int main(){ Test2* p =(Test2* )( operator new( sizeof(Test2))); //只分配内存,没有调用构造函数    //Test2* p= new Test2(34); p->a=32; p->Print(); //operator delete (p); p->~Test2(); //析构operator delete(p); //释放内存    return 0;}疑问: 当 operator new之后,没调用构造函数,为什么 p->a  ,p->Print() 可以运行????对象不是没有构造吗????? 仅仅是分配了内存而已。如果没有构造,为什么表型出 类的行为来


[解决办法]
这有啥?
一切都是二进制,一切都是规则.
规则不是绝对的,绕过就是了.
char *p=new char[1024];
Test2 &t=*(Test2*)p;
t.Print();
[解决办法]
没必要纠结这种问题
C++的规则是建立在它的语法上的
到底层 成员函数仅仅就是个普通函数而已 只是不能直接调用 _thiscall把调用对象的指针mov ecx [ebp+offset]
然后call ........
所以只要符合了a是一个符合 的对象类型 它都这样调用 但是这个行为是未定义的

就像结构体访问它的元素 你厉害的话也可以直接用首地址加偏移访问各个元素(当然可能有对齐) 但是这个已经不是C++赋予我们的规则了

就像private成员 我有个对象 依然可以访问到它 获取对象的首地址 转成char* 加偏移强制转换即可
[解决办法]
探讨

多谢,又对构造函数 有了新的认识了!!!


再问个关于构造函数的问题


如果没提供构造函数, 但是提供了拷贝构造函数。。。

vs2010是无法编译的。。。。。。。。。。。。。

[解决办法]
C/C++ code
Test2* p = 0 ;p->Print(); 

热点排行