C++ 新对象的C等价物(构造函数)
下面的C等价物(malloc)是什么C++ 新对象的C等价物(构造函数),c++,c,C++,C,下面的C等价物(malloc)是什么 MyClass* ptr = new MyClass(arg1,arg2); 我想到的第一件事是在堆栈上实例化一个MyClass对象,然后执行malloc(sizeof(MyClass))没有。您可以遵循以下方案: typedef struct NamespaceClassData { ... } NamespaceClass; NamespaceClass* namespace_class_create(T arg1, U arg2) {
MyClass* ptr = new MyClass(arg1,arg2);
我想到的第一件事是在堆栈上实例化一个MyClass对象,然后执行malloc(sizeof(MyClass))然后是一个memcpy(堆栈,到内存)
有更好的方法吗?这不容易做到,因为malloc
(或C语言本身)不知道类似“构造函数”的东西
请注意,对于任何与内存管理相关的操作,以下解决方法都是不安全的
MyClass* ptr = malloc(sizeof(MyClass));
*ptr = MyClass(arg1, arg2);
这不容易做到,因为malloc(或C语言本身)不知道类似“构造函数”的东西
请注意,对于任何与内存管理相关的操作,以下解决方法都是不安全的
MyClass* ptr = malloc(sizeof(MyClass));
*ptr = MyClass(arg1, arg2);
C中构造函数的等价物(或替代物)是初始值设定项。您可以在构造复合文字(另一个C特性)时使用这样的初始值设定项,并通过赋值初始化新对象
MyClass* ptr = malloc(sizeof *ptr);
*ptr = (MyClass){ .a = 1, .b = 34 };
系统地这样做的惯例可能是始终具有“init”函数
然后在指针初始化时调用它
MyClass* ptr = MyClass_init(malloc(sizeof *ptr), arg1,arg2);
C中构造函数的等价物(或替代物)是初始值设定项。您可以在构造复合文字(另一个C特性)时使用这样的初始值设定项,并通过赋值初始化新对象
MyClass* ptr = malloc(sizeof *ptr);
*ptr = (MyClass){ .a = 1, .b = 34 };
系统地这样做的惯例可能是始终具有“init”函数
然后在指针初始化时调用它
MyClass* ptr = MyClass_init(malloc(sizeof *ptr), arg1,arg2);
是的,只需将您需要的任何数据放入malloc
ed内存,这就是构造。是的,只需将您需要的任何数据放入malloc
ed内存,这就是构造。没有。您可以遵循以下方案:
typedef struct NamespaceClassData {
...
} NamespaceClass;
NamespaceClass* namespace_class_create(T arg1, U arg2) {
// malloc and initialize
}
void namespace_class_destroy(MyClass* p) {
// destroy and free
}
注释:虽然结构X是C++中的一种类型,但它只是C中的一个标记(因此TyBueFuffStutt)
< P>没有。您可以遵循以下方案:
typedef struct NamespaceClassData {
...
} NamespaceClass;
NamespaceClass* namespace_class_create(T arg1, U arg2) {
// malloc and initialize
}
void namespace_class_destroy(MyClass* p) {
// destroy and free
}
注释:虽然结构X是C++中的一种类型,但它只是C中的一个标记(因此,TyBeIFF结构)
,这只在类非常简单,支持浅拷贝时才起作用。
我已经有一段时间没有编写c代码了,但我要做的是创建一个init函数(init()),它的作用类似于ctor,并创建一个宏来分配内存(maloc),然后调用init(##init())。
比如:
1 #define NEW(TYPE, NAME) malloc(sizeof(TYPE));\
2 init_ ##TYPE(NAME);
只有当您的类非常简单并且支持浅层复制时,这才有效。
我已经有一段时间没有编写c代码了,但我要做的是创建一个init函数(init()),它的作用类似于ctor,并创建一个宏来分配内存(maloc),然后调用init(##init())。
比如:
1 #define NEW(TYPE, NAME) malloc(sizeof(TYPE));\
2 init_ ##TYPE(NAME);
C语言中没有类-除了malloc,你还想做什么?只需通过ptr->…=arg1
通常,只需调用calloc()
——这将分配空间并将所有字节设置为零。如果需要专门设置值,则单独设置字段。引入一个函数make_my_class
,您可以将其称为MyClass*ptr=make_my_class(arg1,arg2)代码>之前询问-好的做法是使函数类似于构造函数(初始值设定项),其名称与结构名称相同。C中没有类-除了malloc,您还想做什么?只需通过ptr->…=arg1
通常,只需调用calloc()
——这将分配空间并将所有字节设置为零。如果需要专门设置值,则单独设置字段。引入一个函数make_my_class
,您可以将其称为MyClass*ptr=make_my_class(arg1,arg2)代码>之前询问-好的做法是使函数类似于构造函数(初始值设定项),其名称与结构名称相同。哪个编译器支持这一点:*ptr=(MyClass){.a=1,.b=34}代码>?这是标准吗?@Jefferson这是标准C99。似乎VS2012和VS2013都不支持它。@Jefferson,MS拒绝在他们的编译器中实现更新的C标准。他们现在在这件事上几乎是孤军奋战。只是不要将他们的编译器用于C。是的-看起来他们更喜欢C++11(),尽管他们强调C99库支持:哪个编译器支持这个:*ptr=(MyClass){.a=1,.b=34}代码>?这是标准吗?@Jefferson这是标准C99。似乎VS2012和VS2013都不支持它。@Jefferson,MS拒绝在他们的编译器中实现更新的C标准。他们现在在这件事上几乎是孤军奋战。只是不要将他们的编译器用于C。是的-看起来他们更喜欢C++11(),尽管他们强调C99库支持: