总是创建类的实例?

时间:2010-07-11 10:22:38

标签: c++

我有一个只有一个函数“Print()”和两个属性“age,sex”的类。我试图了解何时在内存上创建对象?

我总是可以访问对象的道具和函数,即使我没有调用它的构造函数。

该类中是否有创建对象的规则?

在C#中,这不会在内存上创建对象:ClassName cls; 但这会创建:ClassName cls = new ClassName(); 在C ++中有没有办法在内存中创建对象,直到我需要调用它的构造函数?

#include <QtCore/QCoreApplication>
#include "iostream"

using namespace std;

class ClassName{
public:
    void print(){
        cout<< "Age: " <<age <<endl;
        cout<< "Sex: " <<sex <<endl;
    }
    int age;
    char sex;


};


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    ClassName *ex1 = new ClassName();
    ex1->print();

    ClassName ex2;
    ex2.print();

    ClassName ex3= {10,'e'};
    ex3.print();

    ClassName exCopy(ex3);
    exCopy.print();

    return a.exec();
}

6 个答案:

答案 0 :(得分:4)

我不确定你在问什么,但是希望下面的说明包含你正在寻找的答案。

变量ex1ex2ex3exCopy都与ClassName的不同实例相关联。

  1. ex1指向堆分配的实例。因为你永远不会在它上面调用delete,所以实例在程序退出时会泄漏,这在这种情况下并不重要,但如果ClassName有一个非平凡的析构函数,则可能会导致问题在退出前被叫。
  2. ex2是一个默认初始化的堆栈实例,对于所有意图而言,它将在agesex中包含随机值。
  3. ex3是成员初始化的堆栈实例。
  4. exCopy是一个复制构造的堆栈实例。

答案 1 :(得分:2)

  

在C ++中有没有办法不创建   对象在内存中,直到我需要调用   它的构造函数?

是 - 动态创建:

ClassName * p = 0;   // nothing created
...                  // wait a bit
p = new ClassName;   // create instance
...                  // wait a bit
delete p;            // get rid of it

答案 2 :(得分:2)

  

在C#中,这不会在内存上创建对象:ClassName cls;但这将创建:ClassName cls = new ClassName();在C ++中有没有办法在内存中创建对象,直到我需要调用它的构造函数?

使用C ++的C#示例等效如下:

//pointer to ClassName, not initialized
ClassName* cls1;
//alternatively
ClassName* cls2 = 0;
//initialize after declaring it but before using it
cls1 = new ClassName();
cls1->print();
//after initializing it, don't forget to delete it again later
delete cls1;
cls1 = 0;
//this is an error (using uninitialized pointer)
cls2->print();

C#类是'引用'类型,类似于C ++'指针'类型。

答案 3 :(得分:1)

也许您可能想要了解构造函数http://www.parashift.com/c++-faq-lite/ctors.html和复制构造函数http://www.cplusplus.com/articles/jsmith1/

答案 4 :(得分:0)

所以你要问的是:“如何在C ++中创建一个未绑定的引用?” - 嗯,你只能用指针,普通指针或像Boosts shared_ptr这样的智能指针来做到这一点,这应该是首选。

{
    tr1::shared_ptr<ClassName> p; // p is a NULL-pointer

    p.reset(new ClassName()); // now a new object is created on the heap and p points to it.
} // no delete needed, shared_ptr counts references and deletes object when no more reference exis

答案 5 :(得分:0)

  

在C ++中有没有办法在内存中创建对象,直到我需要调用它的构造函数?

可以先分配内存,然后再初始化对象。这是你的意思吗?

unsigned char memory[sizeof(ClassName)];

// ...

ClassName* p = new(memory) ClassName();
p->print();

// ...

p->~ClassName();

(虽然我很确定这不是你想要的。)