|
|
|
|
Type conversion example
An example in which automatic type
conversion is extremely helpful occurs with any class that encapsulates
character strings (in this case, we will just implement the class using the
Standard C++ string class because it’s simple). Without automatic
type conversion, if you want to use all the existing string functions from the
Standard C library, you have to create a member function for each one, like
this:
//: C12:Strings1.cpp
// No auto type conversion
#include "../require.h"
#include <cstring>
#include <cstdlib>
#include <string>
using namespace std;
class Stringc {
string s;
public:
Stringc(const string& str = "") : s(str) {}
int strcmp(const Stringc& S) const {
return ::strcmp(s.c_str(), S.s.c_str());
}
// ... etc., for every function in string.h
};
int main() {
Stringc s1("hello"), s2("there");
s1.strcmp(s2);
} ///:~
Here, only the strcmp( )
function is created, but you’d have to create a corresponding function for
every one in <cstring> that might be needed. Fortunately, you can
provide an automatic type conversion allowing access to all the functions in
<cstring>:
//: C12:Strings2.cpp
// With auto type conversion
#include "../require.h"
#include <cstring>
#include <cstdlib>
#include <string>
using namespace std;
class Stringc {
string s;
public:
Stringc(const string& str = "") : s(str) {}
operator const char*() const {
return s.c_str();
}
};
int main() {
Stringc s1("hello"), s2("there");
strcmp(s1, s2); // Standard C function
strspn(s1, s2); // Any string function!
} ///:~
Now any function that takes a
char* argument can also take a Stringc argument because the
compiler knows how to make a char* from a
Stringc.
|
|
|