老帖子了,希望这一次,有人解答,该如何解决
老帖子了,希望这一次,有人解答C/C++ codeclass Test2{public:int avoid Print() const{couthelloen
老帖子了,希望这一次,有人解答
C/C++ codeclass 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* 加偏移强制转换即可
[解决办法][解决办法]C/C++ codeTest2* p = 0 ;p->Print();