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

老帖子了,希望这一次,有人解答
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();