Doc fixes
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1800 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -4,52 +4,51 @@ Classes: \helpref{wxString}{wxstring}, \helpref{wxArrayString}{wxarray}, \helpre
|
||||
|
||||
\subsection{Introduction}
|
||||
|
||||
wxString is a class which represents a character string of arbitrary (limited by
|
||||
{\it MAX\_INT} which is usually 2147483647 on 32 bit machines) length and containing
|
||||
arbitrary characters (i.e. ASCII NUL character is allowed, although care should be
|
||||
taken when passing strings containing it to other functions).
|
||||
wxString is a class which represents a character string of arbitrary length (limited by
|
||||
{\it MAX\_INT} which is usually 2147483647 on 32 bit machines) and containing
|
||||
arbitrary characters. The ASCII NUL character is allowed, although care should be
|
||||
taken when passing strings containing it to other functions.
|
||||
|
||||
wxString only works with ASCII (8 bit characters) strings as of this release,
|
||||
however support for UNICODE (16 but characters) is planned for the next one.
|
||||
but support for UNICODE (16 but characters) is planned for the next one.
|
||||
|
||||
This class has all standard operations you can expect to find in a string class:
|
||||
This class has all the standard operations you can expect to find in a string class:
|
||||
dynamic memory management (string extends to accomodate new characters),
|
||||
construction from other strings, C strings and characters, assignment operators,
|
||||
access to separate characters, string concatenation and comparison, substring
|
||||
access to individual characters, string concatenation and comparison, substring
|
||||
extraction, case conversion, trimming and padding (with spaces), searching and
|
||||
replacing and both C-like \helpref{Printf()}{wxstringprintf} and stream-like
|
||||
insertion functions as well as much else - see \helpref{wxString}{wxstring}
|
||||
for the list of all functions.
|
||||
insertion functions as well as much more - see \helpref{wxString}{wxstring}
|
||||
for a list of all functions.
|
||||
|
||||
\subsection{Comparison of wxString to other string classes}
|
||||
|
||||
The advantages of using a special string class instead of working directly with
|
||||
C strings are so obvious (the most imoprtant being, of course, the need to always
|
||||
remember to allocate/free memory for C strings unless the programmer prefers
|
||||
working with fixed size buffers which almost certainly leads to the dreaded
|
||||
buffer overflows) that there is a huge number of such classes available and now,
|
||||
finally, C++ even has one (std::string) in standard. Why use wxString then?
|
||||
C strings are so obvious that there is a huge number of such classes available.
|
||||
The most important advantage is the need to always
|
||||
remember to allocate/free memory for C strings; working with fixed size buffers almost inevitably leads to buffer overflows).
|
||||
At last, C++ has a standard string class (std::string). So why the need for wxString?
|
||||
|
||||
There are several advantages:
|
||||
|
||||
\begin{enumerate}\itemsep=0pt
|
||||
\item {\bf Efficiency} This class was made to be as efficient as possible: both
|
||||
in terms of size (each wxString objects takes exactly the same place as {\it
|
||||
char *} pointer, \helpref{reference counting}{wxstringrefcount}) and speed.
|
||||
in terms of size (each wxString objects takes exactly the same space as a {\it
|
||||
char *} pointer, sing \helpref{reference counting}{wxstringrefcount}) and speed.
|
||||
It also provides performance \helpref{statistics gathering code}{wxstringtuning}
|
||||
which may be enabled to fine tune the memory allocation strategy for your
|
||||
particular application - and the gain might be quite big.
|
||||
\item {\bf Compatibility} This class tries to combine almost full compatibility
|
||||
with the old wxWindows 1.xx wxString class, some reminiscence to MFC CString
|
||||
class and 90\% of functionality of std::string class.
|
||||
class and 90\% of the functionality of std::string class.
|
||||
\item {\bf Rich set of functions} Some of the functions present in wxString are
|
||||
very useful but don't exist in most of other string classes: for example,
|
||||
\helpref{AfterFirst}{wxstringafterfirst},
|
||||
\helpref{BeforeLast}{wxstringbeforelast}, \helpref{operator<<}{wxstringoperatorout}
|
||||
or \helpref{Printf}{wxstringprintf}. Of course, all the standard string
|
||||
operations are supported as well.
|
||||
\item {\bf UNICODE} In this release, wxString only supports construction from
|
||||
an UNICODE string, but in the next one it will be capable of also storing its
|
||||
\item {\bf UNICODE} In this release, wxString only supports {\it construction} from
|
||||
a UNICODE string, but in the next one it will be capable of also storing its
|
||||
internal data in either ASCII or UNICODE format.
|
||||
\item {\bf Used by wxWindows} And, of course, this class is used everywhere
|
||||
inside wxWindows so there is no performance loss which would result from
|
||||
@@ -73,15 +72,15 @@ in both wxWindows and other programs (by just typedefing wxString as std::string
|
||||
when used outside wxWindows) and by staying compatible with future versions of
|
||||
wxWindows which will probably start using std::string sooner or later too.
|
||||
|
||||
In the situations when there is no correspondinw std::string function, please
|
||||
In the situations where there is no correspondinw std::string function, please
|
||||
try to use the new wxString methods and not the old wxWindows 1.xx variants
|
||||
which are deprecated and risk to disappear in future versions.
|
||||
which are deprecated and may disappear in future versions.
|
||||
|
||||
\subsection{Some advice about using wxString}\label{wxstringadvices}
|
||||
|
||||
Probably the main trap with using this class is the implicit conversion operator to
|
||||
{\it const char *}. It is advised that you use \helpref{c\_str()}{wxstringcstr}
|
||||
instead of it to clearly indicate when the conversion is done. Specifically, the
|
||||
instead to clearly indicate when the conversion is done. Specifically, the
|
||||
danger of this implicit conversion may be seen in the following code fragment:
|
||||
|
||||
\begin{verbatim}
|
||||
@@ -120,7 +119,7 @@ The second bug is that returning {\it output} doesn't work. The implicit cast is
|
||||
used again, so the code compiles, but as it returns a pointer to a buffer
|
||||
belonging to a local variable which is deleted as soon as the function exits,
|
||||
its contents is totally arbitrary. The solution to this problem is also easy:
|
||||
just make the function return wxString instead of C string.
|
||||
just make the function return wxString instead of a C string.
|
||||
|
||||
This leads us to the following general advice: all functions taking string
|
||||
arguments should take {\it const wxString\&} (this makes assignment to the
|
||||
@@ -131,13 +130,13 @@ variables.
|
||||
|
||||
\subsection{Other string related functions and classes}
|
||||
|
||||
As any program operates with character strings, the standard C library provides quite a
|
||||
few of functions to work with them. Unfortunately, some of them have rather non
|
||||
intuitive behaviour (like strncpy() which doesn't always terminate the resulting
|
||||
string with a NUL) and are in general not very safe (passing NULL to them will
|
||||
probably lead to program crash). Moreover, some of very useful functions are not
|
||||
As most programs use character strings, the standard C library provides quite a
|
||||
few functions to work with them. Unfortunately, some of them have rather
|
||||
counter-intuitive behaviour (like strncpy() which doesn't always terminate the resulting
|
||||
string with a NULL) and are in general not very safe (passing NULL to them will
|
||||
probably lead to program crash). Moreover, some very useful functions are not
|
||||
standard at all. This is why in addition to all wxString functions, there are
|
||||
also a few of global string functions which try to correct these problems:
|
||||
also a few global string functions which try to correct these problems:
|
||||
\helpref{IsEmpty()}{wxstringisempty} verifies whether the string is empty (returning
|
||||
TRUE for NULL pointers), \helpref{Strlen()}{wxstringstrlen} also handles NULLs correctly
|
||||
and returns 0 for them and \helpref{Stricmp()}{wxstringstricmp} is just a
|
||||
@@ -149,17 +148,17 @@ There is another class which might be useful when working with wxString:
|
||||
be broken into tokens and replaces the standard C library {\it
|
||||
strtok()} function.
|
||||
|
||||
And the very last string related class is \helpref{wxArrayString}{wxarray}: it
|
||||
And the very last string-related class is \helpref{wxArrayString}{wxarray}: it
|
||||
is just a version of the "template" dynamic array class which is specialized to work
|
||||
with strings. Please note that this class is specially optimized (it uses its
|
||||
knowledge of internal structure of wxString) for storing strings and so it is
|
||||
vastly better from performance point of view than wxObjectArray of wxString.
|
||||
with strings. Please note that this class is specially optimized (using its
|
||||
knowledge of the internal structure of wxString) for storing strings and so it is
|
||||
vastly better from a performance point of view than a wxObjectArray of wxStrings.
|
||||
|
||||
\subsection{Reference counting and why you shouldn't care about it}\label{wxstringrefcount}
|
||||
|
||||
wxString objects use a technique known as {\it copy on write} (COW). This means
|
||||
that when a string is assigned to another, no copying really takes place: only
|
||||
the reference count on the shared string data is increased and both strings
|
||||
the reference count on the shared string data is incremented and both strings
|
||||
share the same data.
|
||||
|
||||
But as soon as one of the two (or more) strings is modified, the data has to be
|
||||
@@ -183,8 +182,8 @@ call to this operator may modify the string, its data is unshared (COW is done)
|
||||
and so if the string was really shared there is some performance loss (both in
|
||||
terms of speed and memory consumption). In the rare cases when this may be
|
||||
important, you might prefer using \helpref{GetChar()}{wxstringgetchar} instead
|
||||
of array subscript operator for this reasons. Please note that
|
||||
\helpref{at()}{wxstringat} method has the same problem as subscript operator in
|
||||
of the array subscript operator for this reasons. Please note that
|
||||
\helpref{at()}{wxstringat} method has the same problem as the subscript operator in
|
||||
this situation and so using it is not really better. Also note that if all
|
||||
string arguments to your functions are passed as {\it const wxString\&} (see the
|
||||
section \helpref{Some advice}{wxstringadvices}) this situation will almost
|
||||
@@ -200,7 +199,7 @@ also read the preceding section about
|
||||
|
||||
For the performance reasons wxString doesn't allocate exactly the amount of
|
||||
memory needed for each string. Instead, it adds a small amount of space to each
|
||||
allocated block which allows it to not reallocate memory (this is a relatively
|
||||
allocated block which allows it to not reallocate memory (a relatively
|
||||
expensive operation) too often as when, for example, a string is constructed by
|
||||
subsequently adding one character at a time to it, as for example in:
|
||||
|
||||
|
Reference in New Issue
Block a user