何时在c ++中使用void*

Jas*_*son 9 c++ syntax pointers

我试图将我的头脑包围起来void*,以及它的适当用途,如果有任何潜在的滥用,我应该知道.(意思是冷静,没有错).

我不明白如何以及为什么使用void*.如果我理解,我需要将当前指针强制转换为a void*,然后在我想使用它时将其转换回原始指针...?

为什么这有益?不要让事情变得通用,因为我需要知道void*传入什么类型的演员...

任何人都可以帮助我理解 void*

Jer*_*fin 13

C中,void *用于创建泛型集合是相当常见的.例如,如果您想要一个通用链表,您可能会写如下:

typedef struct node  { 
    void *data;
    struct node *next;
} node;
Run Code Online (Sandbox Code Playgroud)

然后,您可以创建一个链接列表foo,另一个链接列表bar,等等.

但是,在C++中,这很少有用.在典型情况下,您需要将等效代码编写为模板:

template <typename T>
class node { 
     T data;
     node *next;
};
Run Code Online (Sandbox Code Playgroud)

使用较旧的编译器,您可以通过组合这两种技术来减少生成的代码.在这种情况下,你会使用指针的集合作废,存储数据,然后有一个刚刚处理铸造模板前端T *void *当您从存储的数据,并返回void *T *当您检索的数据.

编译器/链接器的改进使得这种技术(几乎?)完全过时了.较旧的编译器会为您实例化模板的每种类型生成单独的代码,即使实例化类型无关紧要.当前的编译器(或者工具链,无论如何 - 相当多的是由链接器真正处理的)识别相同的代码序列,并自动将它们合并在一起.

结论:除非您需要C兼容性,或者您正在编写替换operator new/ operator delete,否则使用void *编写良好的C++通常非常少见.