2011-06-08 69 views
0

以下两种创建对象的方法有什么区别?对象创建差异

Test* t = new Test(); 

Test* t; 

你的回答第二个样本匹配什么,我认为这会做(没有创建对象),但

class Test { 
     public: 
       void bla(void) { 
         std::cout << "test" << std::endl; 
       }; 
}; 

int main(void) { 
     Test* test; 
     test->bla(); 
} 

给我输出的“测试”。 ..所以,实际上有一个对象

+0

我修复了你的格式。第一次编辑的免费;-) – Johnsyweb 2011-06-08 11:41:58

+0

你确定你不是指第二个片段中的'Test t'? – 2011-06-08 11:49:31

+2

你的意思是创建一个对象和不创建对象之间的区别? – 2011-06-08 12:16:47

回答

4

第二个完全不创造任何对象,并试图对其进行访问将导致坏事™。

+0

多数民众赞成多多少少我认为 – yogi 2011-06-08 12:04:14

7

第一个做4两件事:

第二个刚刚创建的指针Test。并没有初始化。


@yogi - 为您的编辑 - 这是完全未定义行为,当指针未初始化。不,它是而不是的一个对象。有关更多信息,请参阅C++ function called without object initialization

+0

+1,你还可以补充说,它在第一种情况下,它的价值初始化使用'()'后'测试'。 – iammilind 2011-06-08 11:55:35

+0

@iammilind - 是的,当然,谢谢!我错过了括号(: – 2011-06-08 12:14:58

1

第一个是创建对象实例的方法。

第二个不是创建对象实例的方法。它只是声明一个指针,它仍然未初始化。

2

这是一个指针,分配在堆栈上,并使用32或64位内存。

Test * t; 

这将在堆上创建类型测试的对象(你需要desalocate吧)

t = new Test(); 

这将在栈上创建类型测试的对象(无需desalocate它它会在您退出当前上下文尽快disapear)

Test t2; 

编辑

你的例子的工作原理是因为编译器优化了你的代码:它注意到你不使用任何成员,所以它可能不会使你寻找实例的努力。

1

更新之后:它仍然成功调用bla()的原因只是未定义的行为。因为这正是C++标准定义了使用不安全内存时发生的情况(在这种情况下,指针所指向的任意地址) - 行为是未定义的。

0
Test* test;   
test->bla(); 

正如其他答案所述,Test* test不会产生任何对象。这是一个未初始化的指针,指向Test。除非它被初始化为指向有效的对象Test,否则它不会指向任何有效的内容。

取消引用像您这样的未初始化指针是未定义的行为
在你的情况下,它不会崩溃,因为你不是指this里面bla()
尽管如此,它仍然是未定义的行为来解引用单元化的test

重申以上几点,下面的例子大多会崩溃。

#include<iostream> 
class Test 
{ 
    public: 
     int i; 
     void bla(void) 
     { 
      std::cout << "test" << std::endl; 
      std::cout << "test->i" << this->i <<std::endl; 
     } 
}; 

int main(void) 
{ 
    Test* test; 
    test->bla(); 
    return 0; 
} 
0

正如其他人已经说过,你只是幸运,你触发未定义行为恰好是什么样子,你以为你想要的(主要是因为你的Test :: bla(下)几乎就像是一个全球性的免费功能)。要查看你的榜样和好如初,只是添加了一些不平凡的类成员:

class Test { 
public: 
    void bla(void) { 
    std::cout << "test: " << x << std::endl; 
    }; 
    int x; 
}; 

你可以把你原来的例子,作为一个免费的功能

void bla(Test * p) { std::cout << "test" << std::endl; } 

你恰好有一个叫垃圾参数,但由于您不使用参数,所以没有什么不好的事情发生。在我修改的例子中,我们尝试访问p->x并死亡。