我有一个只有一个函数“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();
}
答案 0 :(得分:4)
我不确定你在问什么,但是希望下面的说明包含你正在寻找的答案。
变量ex1
,ex2
,ex3
和exCopy
都与ClassName
的不同实例相关联。
ex1
指向堆分配的实例。因为你永远不会在它上面调用delete
,所以实例在程序退出时会泄漏,这在这种情况下并不重要,但如果ClassName
有一个非平凡的析构函数,则可能会导致问题在退出前被叫。ex2
是一个默认初始化的堆栈实例,对于所有意图而言,它将在age
和sex
中包含随机值。ex3
是成员初始化的堆栈实例。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();
(虽然我很确定这不是你想要的。)