Namespace + functions versus static methods on a c
添加时间:2013-5-23 点击量:
source:http://stackoverflow.com/questions/1434937/namespace-functions-versus-static-methods-on-a-class
By default, use namespaced functions.
Classes are to build objects, not to replace namespaces.
In Object Oriented code
Scott Meyers wrote a whole Item for his Effective C++ book on this topic, Prefer non-member non-friend functions to member functions. I found an online reference to this principle in an article Herb Sutter:http://www.gotw.ca/gotw/084.htm
The important thing to know is that: In C++ functions in the same namespace than a class belong to that class interface. (because ADL will search those functions when resolving function calls)
namespaced functions, unless declared friend have no access to the class internals, whereas static methods have.
This means, for example, that when maintaining your class, if you need to change your class internals, you will need to search for side effects in all its methods, including the static ones.
Extension I
Adding code to a class interface.
In C#, you can add methods to a class even if you have no access to it. But in C++, this is impossible.
But, still in C++, you can still add a namespaced function, even to a class someone wrote for you.
See the other side, this is important when designing your code, because by putting your functions in a namespace, you will authorize your users to increase/complete the class interface.
Extension II
A side-effect of the previous point, it is impossible to declare static methods in multiple headers. Every methods must be declared in the same class.
For namespaces, functions the same namespace can be declared in multiple headers (the almost-standard swap function is the best example of that).
Extension III
The basic cooless of a namespace is that in some code, you can avoid mentioning it, if you use the keyword using:
#include<string>#include<vector>// Etc.{usingnamespace std ;// Now, everything std is accessible without qualification
string s ;// Okvector v ;// Ok}
string ss ;// COMPILATION ERRORvector vv ;// COMPILATION ERROR
And you can even limit the pollution to one class:
#include<string>#include<vector>{using std::string ;
string s ;// Okvector v ;// COMPILATION ERROR}
string ss ;// COMPILATION ERRORvector vv ;// COMPILATION ERROR
This pattern is mandatory for proper use of the almost-standard swap idiom.
And this is impossible to do with static methods in classes.
So, C++ namespaces have their own semantics.
But it goes further, as you can combine namespaces in a way similar to inheritance.
For example, if you have a namespace A with a function AAA, a namespace B with a function BBB, you can declare a namespace C, and bring AAA and BBB in this namespace with the keyword using.
Conclusion
Namespaces are for namespaces. Classes are for classes.
C++ was designed so each concept is different, and is used differently, in different cases, as solution to different problems.
Dont use classes when you need namespaces.
And in your case, you need namespaces.
文艺不是炫耀,不是花哨空洞的文字堆砌,不是一张又一张的逆光照片,不是将旅行的意义转化为名牌包和明信片的物质展示;很多时候它甚至完全不美——它嘶吼、扭曲,它会痛苦地抽搐,它常常无言地沉默。——艾小柯《文艺是一种信仰》
source:http://stackoverflow.com/questions/1434937/namespace-functions-versus-static-methods-on-a-class
By default, use namespaced functions.
Classes are to build objects, not to replace namespaces.
In Object Oriented code
Scott Meyers wrote a whole Item for his Effective C++ book on this topic, Prefer non-member non-friend functions to member functions. I found an online reference to this principle in an article Herb Sutter:http://www.gotw.ca/gotw/084.htm
The important thing to know is that: In C++ functions in the same namespace than a class belong to that class interface. (because ADL will search those functions when resolving function calls)
namespaced functions, unless declared friend have no access to the class internals, whereas static methods have.
This means, for example, that when maintaining your class, if you need to change your class internals, you will need to search for side effects in all its methods, including the static ones.
Extension I
Adding code to a class interface.
In C#, you can add methods to a class even if you have no access to it. But in C++, this is impossible.
But, still in C++, you can still add a namespaced function, even to a class someone wrote for you.
See the other side, this is important when designing your code, because by putting your functions in a namespace, you will authorize your users to increase/complete the class interface.
Extension II
A side-effect of the previous point, it is impossible to declare static methods in multiple headers. Every methods must be declared in the same class.
For namespaces, functions the same namespace can be declared in multiple headers (the almost-standard swap function is the best example of that).
Extension III
The basic cooless of a namespace is that in some code, you can avoid mentioning it, if you use the keyword using:
#include<string>#include<vector>// Etc.{usingnamespace std ;// Now, everything std is accessible without qualification
string s ;// Okvector v ;// Ok}
string ss ;// COMPILATION ERRORvector vv ;// COMPILATION ERROR
And you can even limit the pollution to one class:
#include<string>#include<vector>{using std::string ;
string s ;// Okvector v ;// COMPILATION ERROR}
string ss ;// COMPILATION ERRORvector vv ;// COMPILATION ERROR
This pattern is mandatory for proper use of the almost-standard swap idiom.
And this is impossible to do with static methods in classes.
So, C++ namespaces have their own semantics.
But it goes further, as you can combine namespaces in a way similar to inheritance.
For example, if you have a namespace A with a function AAA, a namespace B with a function BBB, you can declare a namespace C, and bring AAA and BBB in this namespace with the keyword using.
Conclusion
Namespaces are for namespaces. Classes are for classes.
C++ was designed so each concept is different, and is used differently, in different cases, as solution to different problems.
Dont use classes when you need namespaces.
And in your case, you need namespaces.
文艺不是炫耀,不是花哨空洞的文字堆砌,不是一张又一张的逆光照片,不是将旅行的意义转化为名牌包和明信片的物质展示;很多时候它甚至完全不美——它嘶吼、扭曲,它会痛苦地抽搐,它常常无言地沉默。——艾小柯《文艺是一种信仰》