2015-11-02 85 views
3

我想知道一些关于C++中的对象初始化。如果可能,我应该避免使用'new'关键字,因为我不需要它提供的内容(动态分配,对吗?),我不想手动删除对象。我有麻烦调用我的对象的初始化,但不使用新的。我有这个类:对象初始化没有“新”C++

class Apodization { 

public: 
    Apodization() 
    { 
    std::cout << "Constructor for Apodization" << std::endl; 
    } 
} 

和验证码:

Apodization* apoObj(); 
// Apodization* apoObj = new Apodization(); 

使用时新创建的对象,但并非没有打印发生如预期。我猜这是因为我只是在上面的例子中创建了一个Apodization类型的指针,但我不知道该从哪里去。我想知道不使用new关键字来初始化Apodization对象的正确方法。谢谢您的帮助!我发现来自Java和Python的C++类有点奇怪。

+5

除非你需要一个指针,你应该有对象:'变迹apoObj();' – NathanOliver

+0

如果你有一个指针,创建什么,直到你调用'new'。如果你有一个堆栈分配的对象,你可以调用初始化器。 – tadman

+0

如果您想要动态分配并且不想手动删除对象,请使用std :: unique_ptr。 – Max

回答

11

一个目的是不new使用RAII初始化(

+0

真棒谢谢你!很棒!我一定会检查编程指南。我可以用它来倾斜C++ –

1

你不能。 new运算符为对象分配内存,调用该对象的构造函数,然后返回指针。在你的代码中,你所做的只是声明指针,而不用为它留出任何内存,或者构造函数正在做任何工作。这只是一个指向什么都没有的指针。如果你想使用一个指针来访问它,然后指向静态实例

static Apodization apoObj; // This will create an instance of the object. 

static Apodization SapoObj; // This will create an instance of the object. 
static Apodization* apoObj = &SapoObj; 
+3

更具体地说,它是一个*未初始化的指针*,指向某个东西,但没有任何有效。 – tadman

+0

这个问题并不是真的关于新的,而是构造函数的调用。 – legalize

-1

只需创建一个静态实例资源分配是初始化)。这意味着,当你变迹声明的一个实例,内存为实例在栈上分配,然后调用构造函数来设置初始状态。

这意味着简单地写:

int main(){ 
    Apodization apodization; 
    //apodization.doSomething(); 
    return 0; 
} 

是所有你需要让球滚动! (作为一个Java人,我喜欢这个简洁性!)

由于对象被分配到栈上,析构函数会自动在作用域的末尾被调用;无需手动内存管理。

P.S.我强烈建议你阅读Bjarne Stroustrops C++ 11编程指南!

+0

我想你已经被低估了,因为'Apodization apoObj();'在C++中是无效的,它必须是'Apodization apoObj;'。 – jpo38

+0

因为'Apodization * apoObj =&SapoObj;'没有真正的用处,并且如果您不知道'SapoObj'的作用域如果在作用域结束后使用它将如何影响指针'apoObj',会导致问题。 – crashmstr

+0

@ jpo38 - 谢谢 - 最近没有做很多C++! –