C++中的类C过程?

8
是否需要用类编写所有代码才能符合C++的正确编程风格,还是允许使用类似C语言的过程式编程?如果我要将一些代码交给别人,只要其中包含std::vector和std::string(而不是char *),它就会被接受为C++吗?还是必须全部都是类?
int number = 204;
std::string result = my_procedure(number);

OR

MyClass machine;
std::string result = machine.get(number);

在一些源代码中,程序员是否需要或允许使用类似于C的过程?您是否曾经不得不做过这样的事情?

在这个问题的背景下,CC++之间的边界在哪里(如果有的话)?

我希望我的问题清晰并符合规定。


仅仅为了将整数转换为字符串而编写200-300行的代码? - slartibartfast
1
请注意,这个问题并不是在问这是否是合法的C++代码,而是在问这是否是良好的编程实践。仅仅观察到有很多C++代码是这样编写的,并不能真正回答这个问题。 - Cody Gray
@Muggen,我的意思是针对这样一个简单的任务,200-300行代码有点太多了。你应该看一下教程。 - slartibartfast
请看这个链接:http://en.wikipedia.org/wiki/Itoa - slartibartfast
@myrkos,啊不是itoa。输入:142将返回字符串一百四十二。你知道我的意思吗?就像将整数转换为单词一样。 - user418748
显示剩余4条评论
6个回答

10

在你的代码中使用自由函数完全可以--这是架构问题,而不是C++。对于小程序来说,甚至没有必要全部使用类,因为OO真正起作用的时候是用于管理复杂性。如果本来就没有复杂性,为什么还要费劲呢?

你的第二个问题,何时划分界限,没有简短的答案。显然,C标准与C++标准不同的地方就是划分的线。但是,如果你正在寻找C++具有而C语言不具备的一些高级语言特性的列表,以下是其中一些:

  • 类类型和OO(当然)
  • STL
  • 函数/运算符重载
  • 引用
  • 模板
  • new/delete 管理内存

8
C++是一种多范式语言,其中包括面向对象、过程化、泛型/生成和函数式范式,前三种更常用。您应该使用最适合问题的范式:使代码易于正确编写和维护,并且难以出错。
类的实用性在于将数据(状态)与相关函数打包在一起。如果您的“wordify”函数不需要在调用之间保留任何状态,则无需使用类/对象。尽管如此,如果您可以预测到即将需要状态,则使用类可能会有用,这样客户端代码就不需要改变太多。
例如,想象一下向函数添加一个参数以指定输出是否应为“first”、“second”,而不是“one”、“two”。您希望设置行为一次并记住,但应用程序中的其他某些代码也可能使用功能,但更喜欢另一个设置。最好使用对象来保存状态,并安排每个对象的生命周期和可访问性与将使用它的代码对齐。
编辑:
在这个问题的背景下,C和C ++之间的差距在哪里(如果有的话)?
C++只是提供了一组更丰富的处理编程任务的方式,每种方式都有其必要的优缺点。很多时候,最好的方法仍然是与C中的方法相同。如果C++程序员选择了更差的方式,只因为它只在C++中可行,那将是荒谬的。尽管如此,在无数级别上存在这样的选择,因此很常见有一个非[类]成员函数,它接受一个const std::string&参数,将过程式函数调用与由模板生成的面向对象数据结合在一起:所有这些都能很好地协同工作。

最后两段的例子很好。 - user418748

1

C++ 允许多种编程风格,其中过程式编码是其中之一。

使用哪种风格取决于您试图解决的问题。 C 和 C++ 的差距在于您是否使用 C++ 编译器编译代码。

我有时会在我的代码中使用过程函数。有时它最好地解决了问题。


1

C++代码即使没有类,仍然可以是有效的C++代码。类更多地是一种特性,不是每个代码片段都需要。

C++基本上是带有更多功能的C语言,因此两种语言之间并没有真正的“边界”。


1

如果你读过Stroustrup的《设计与演化》,你会发现C++旨在支持多种编程风格。使用最适合问题的那种(不同于总是使用你所知道的那种)。

在传统的实际应用中,往往没有太大的区别。一些C++代码最初是C代码,然后重新编译。慢慢地,它迁移到使用C++特性来提高其质量。

简而言之,是的,C++代码可以是过程式的。但是,如果你在适当的地方使用C++特性,你会发现它与C代码有所不同。

良好的实践需要考虑封装、可测试性和客户端API的可理解性等因素。


0
#include <sstream>
#include <string>
#include <iostream>
using namespace std;

string wordify(int n)
{
   stringstream ss;
   ss << n;     // put the integer into the stream
   return ss.str(); // return the string
}

int main()
{
    string s1 = wordify(42);
    string s2 = wordify(45678);
    string s3 = wordify(-99);

    cout << s1 << ' ' << s2 << ' ' << s3 << '\n';
}

这并不是我想要讨论的内容。而且,我也不是在尝试实现 itoa() 而是 integer-to-words。例如:142 --> 一百四十二,而不是 142 --> "142"。我只是用这段代码片段作为例子。另外,欢迎来到 SO。下次请尝试使用 {} 按钮格式化您的代码。 - user418748

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接