C++ 为什么要让 struct 可以定义成员函数？好像功能上struct完全可以被class取代。如果只是为了前向兼容的话保留c的struct型式应该就可以了吧。从语义上看，struct是用来定义较为复杂的数据结构形式，而函数更像是一种方法，放在数据结构里好像意义上也说不太通。c++这样设计感觉很奇怪。
历史原因。

因为最开始设计的时候，class就是struct，只是个语法糖，用来触发预处理器或者编译器的特定处理而已。或者说，C++的所有class相关功能，实际上就是在struct上实现的。

换句话说，C++作者一开始实现编译器的时候，class支持相关的代码已经直接写进了struct的代码中，之后的其它的C++实现，也就必须保持「struct其实就是一个class」的特性，不然会导致代码不兼容。

为什么当初这么选择，因为当初写C++的时候还没有C++，是在C语言基础上实现的，而C语言只有struct。自然只能基于struct来实现。

结果就是，C++中的struct跟class没有任何本质区别（防杠声明：如果你非要声称默认private跟默认public算是区别的话，那么好的，struct跟class有那么一丁点区别）。

在C++中，无论struct还是class都需要保证POD，才能与C语言struct兼容。这一点其实也没有区别。

回答有关题主提出的问题：

「成员函数」更多的只是某种逻辑概念，非虚函数的成员不会在结构体内写入任何东西，所以它被定义为成员函数还是独立函数并无本质差别。允许struct定义成员函数并不会影响struct本身的结构，所以没有必要禁止。

从现在的工程实践上看：绝大多数编程规范会建议把类的公共成员写在前边，而private成员写在最后。

这种编程规范实际上等同于建议所有的类都使用struct。因为struct就是公共成员在前，最后如果需要补充private就加一个private区域。

而class则刚好相反，它的语法默认了你把私有字段写在最前面，而其它类型（比如public）写在后边，这违背了当今主流对编程风格的推荐。因而，个人建议所有C++代码只使用struct。

或许从设计上讲，class这个关键字本来就是不需要存在的。C++只是单纯的扩展了struct的用途而已。