Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:什么时候适合在类之外定义函数_C++_Oop - Fatal编程技术网

C++ C++;:什么时候适合在类之外定义函数

C++ C++;:什么时候适合在类之外定义函数,c++,oop,C++,Oop,可能重复: 在某些情况下,最好在类外定义函数,还是在类内使用静态函数?有些函数需要在类外定义。例如,strcpy()之类的函数不作用于类类型。但是它们应该放在一个名称空间中。自由函数也是正确编写泛型代码的好方法(就像在泛型编程中一样),因为它有助于扩展接口,而无需侵入性地修改现有代码 C++是面向对象和通用编程的。挑你的;) 有些情况必须是非成员函数: 运算符重载不能是静态成员函数(它们可以是非静态成员函数),尤其是大多数二进制运算符重载更适合作为非成员函数,因为对于自由运算符重载,可以在L

可能重复:


在某些情况下,最好在类外定义函数,还是在类内使用静态函数?

有些函数需要在类外定义。例如,strcpy()之类的函数不作用于类类型。但是它们应该放在一个名称空间中。

自由函数也是正确编写泛型代码的好方法(就像在泛型编程中一样),因为它有助于扩展接口,而无需侵入性地修改现有代码


C++是面向对象和通用编程的。挑你的;)

有些情况必须是非成员函数:

  • 运算符重载不能是静态成员函数(它们可以是非静态成员函数),尤其是大多数二进制运算符重载更适合作为非成员函数,因为对于自由运算符重载,可以在LHS和RHS上进行隐式转换,但对于成员运算符重载,只能在RHS上进行隐式转换

  • std::swap
    通常被称为使用std::swap的
    ;互换(x,y)以便类可以通过ADL“重载”它。因此,实现
    swap
    通常需要一个非成员函数,即使只是作为调用成员函数的包装器。设计为ADL重载的其他函数也是如此

  • 从技术上讲,静态成员函数不能有“C”链接,因此在与其他语言接口时不适合作为回调函数。在实践中,C++ ABIS往往使静态函数调用与C兼容,当然,在C.

  • 中,它们的参数和返回类型都是存在的。
到目前为止,我可以想到一种情况,它必须是静态成员函数,而不是自由函数:

  • 您想使用访问说明符
    受保护
    。私有静态成员函数通常是无意义的,因为通常最好在.cpp文件中定义一个具有内部链接的自由函数,在该文件中,没有其他人可以看到它,更不用说调用它了。但我想你偶尔也会想要一个

除此之外,这实际上是一个风格问题,静态成员函数和自由函数之间没有太大的实际区别。

自由函数的重要用途是当同一函数需要访问多个对象时。任何只访问一个对象的函数都应该是成员函数,但如果它更改了多个对象,则应该是自由函数。

大多数专家建议,如果函数不需要访问类的私有成员,则非友元非成员函数比任何类型的成员函数(静态或其他)更可取,因为你通过最小化胶囊内的代码量来最大化封装。但是,C++大师们不一定会把OOP放在优先顺序的首位。据推测,当詹姆斯·高斯林过去使用C++编写时,他没有使用很多自由函数,因为他显然认为它们是不必要的;并没有真正回答这个问题。正如在std::string类中一样,您将strcpy的等价物实现为成员方法运算符=()@Martin,这值得进行向下投票,是吗?如果我向下投票,我通常会在评论中输入-1。当我不喜欢一个答案时,你真的能看出来。即使现在,我仍然很受诱惑。