C++: Difference between revisions
(→Tips) |
|||
Line 75: | Line 75: | ||
Use ''scoped enums'' to specify the underlying (storage) type for enums (available since c++11, ie. gcc/clang option <code>-std=c++11</code>): |
Use ''scoped enums'' to specify the underlying (storage) type for enums (available since c++11, ie. gcc/clang option <code>-std=c++11</code>): |
||
<source lang= |
<source lang=cpp> |
||
typedef enum : unsigned char { zero, one, two } enum8_t; |
typedef enum : unsigned char { zero, one, two } enum8_t; |
||
typedef enum : unsigned short { zero16, one16, two16 } enum16_t; |
typedef enum : unsigned short { zero16, one16, two16 } enum16_t; |
||
Line 81: | Line 81: | ||
assert (sizeof(enum8_t) == 1); |
assert (sizeof(enum8_t) == 1); |
||
assert (sizeof(enum16_t) == 2); |
assert (sizeof(enum16_t) == 2); |
||
</source> |
|||
=== Finally blocks === |
|||
From [http://stackoverflow.com/questions/161177/does-c-support-finally-blocks-and-whats-this-raii-i-keep-hearing-about stackoverflow.com]: |
|||
<source lang=cpp> |
|||
int * array = new int[10000000]; |
|||
try { |
|||
// Some code that can throw exceptions |
|||
// ... |
|||
throw std::exception(); |
|||
// ... |
|||
} catch (...) { |
|||
// The finally-block (if an exception is thrown) |
|||
delete[] array; |
|||
// re-throw the exception. |
|||
throw; |
|||
} |
|||
// The finally-block (if no exception was thrown) |
|||
delete[] array; |
|||
</source> |
|||
Note that the finally block may throw an exception, hence discarding the original exception. |
|||
To avoid the double <code>delete</code>: |
|||
<source lang=cpp> |
|||
std::exception_ptr e; |
|||
try { |
|||
/*try block*/ |
|||
} |
|||
catch (...) { |
|||
/*finally block*/ |
|||
e = std::current_exception(); |
|||
} |
|||
if (e) { // e evaluates to 'false' if no exception! |
|||
std::rethrow_exception(e); |
|||
} |
|||
</source> |
</source> |
||
Line 90: | Line 127: | ||
|Overloading operators <code>i++</code> or <code>++i</code><br/>See [http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14] for more details. |
|Overloading operators <code>i++</code> or <code>++i</code><br/>See [http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14] for more details. |
||
| |
| |
||
{{nb|1=<source lang=" |
{{nb|1=<source lang="cpp"> |
||
class Number { |
class Number { |
||
public: |
public: |
||
Line 103: | Line 140: | ||
|Reset <code>ostringstream</code> |
|Reset <code>ostringstream</code> |
||
| |
| |
||
{{nb|1=<source lang=" |
{{nb|1=<source lang="cpp"> |
||
ostringstream oss; |
ostringstream oss; |
||
oss << "Hello," << 123 << endl; |
oss << "Hello," << 123 << endl; |
Revision as of 06:07, 29 September 2016
References
See also C references.
- www.cplusplus.com — C++ Reference
- Including C Language Library
- and ... IOStream Library
- SGI — Standard Template Library Programmer's Guide
- C++ FAQ
- Evolving a language in and for the real world: C++ 1991-2006, Bjarne Stroustrup (pdf)
- manpage stl-manual (from SGI)
sudo apt-get install stl-manual
ln -s /usr/share/doc/stl-manual/html /var/www/sgi # Now the manual is available at http://localhost/sgi
References - local copy
# Make a local copy of www.cplusplus.com - use option -P http://proxy:port if needed
httrack http://www.cplusplus.com/ -W -O /var/www -%v "-www.cplusplus.com/forum/*" "-www.cplusplus.com/src/*" "-www.cplusplus.com/member/*"
Books
C++0x
- C++0x - the next ISO C++ standard (Bjarne Stroustrup)
- C++0x support in GCC
- The Biggest Changes in C++11 (and Why You Should Care)
- auto_ptr deprecated
- unique_ptr and shared_ptr
- Using unique_ptr, Part I
Basically, unique_ptr permits move from rvalues with copy syntax using a move constructor (which binds to rvalues), while blocking the copy from lvalues by making the copy constructor (which binds to lvalues) private:
template <class T>
class unique_ptr
{
public:
unique_ptr(unique_ptr&& u); // rvalues bind here
private:
unique_ptr(const unique_ptr&); // lvalues bind here
};
- http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=239 The shared_ptr Class]
- rvalue references (and move semantics)
Benchmark
Between compilers
- g++
- EKOPath4, a recently open-sourced compiler with much better performance than gcc/g++.
- Intel compiler
- pathCC, PathScale compiler
Between languages
- C++ reported to be the fastest language, even faster than C and java. See The Computer Language Benchmarks Game
- C++ the Clear Winner In Google's Language Performance Tests
Nested Classes
See Nested classes on ibm.com.
Virtual destructors
Rule of thumb: make your destructor virtual if your class has any virtual functions.
Virtual destructors are needed when a derived class is explicitly deleted via delete
, but using a reference/pointer to a base class.
Tips
Scoped enums
Use scoped enums to specify the underlying (storage) type for enums (available since c++11, ie. gcc/clang option -std=c++11
):
typedef enum : unsigned char { zero, one, two } enum8_t;
typedef enum : unsigned short { zero16, one16, two16 } enum16_t;
assert (sizeof(enum8_t) == 1);
assert (sizeof(enum16_t) == 2);
Finally blocks
From stackoverflow.com:
int * array = new int[10000000];
try {
// Some code that can throw exceptions
// ...
throw std::exception();
// ...
} catch (...) {
// The finally-block (if an exception is thrown)
delete[] array;
// re-throw the exception.
throw;
}
// The finally-block (if no exception was thrown)
delete[] array;
Note that the finally block may throw an exception, hence discarding the original exception.
To avoid the double delete
:
std::exception_ptr e;
try {
/*try block*/
}
catch (...) {
/*finally block*/
e = std::current_exception();
}
if (e) { // e evaluates to 'false' if no exception!
std::rethrow_exception(e);
}
Miscellaneous
Problem | Solution |
---|---|
Overloading operators i++ or ++i See [1] for more details. |
class Number {
public:
// prefix ++ - Must return (*this)
Number& operator++ ();
// postfix ++ - Must never return (*this) by reference
Number operator++ (int); // ... OR ....
void operator++ (int);
};
|
Reset ostringstream
|
ostringstream oss;
oss << "Hello," << 123 << endl;
string s = oss.str();
oss.str(""); // oss empty now - we can reuse it
oss << "World!" << 456 << endl;
|
Binary I/O
See [2] for reference:
- Open a file. Binary file must be opened with mode ios::binary.
- Read from a file. Complex data must be casted to
(char*)
. - Write to a file. Complex data must be casted to
(char*)
.
// Open a file for input
ifstream myFile ("data.bin", ios::in | ios::binary);
// Open a file for output
ofstream myFile;
...
myFile.open ("data2.bin", ios::out | ios::binary);
// Open a file for input and output
fstream myFile;
myFile.open ("data3.bin", ios::in | ios::out | ios::binary);
#include <fstream.h>
...
char buffer[100];
ifstream myFile ("data.bin", ios::in | ios::binary);
myFile.read (buffer, 100);
if (!myFile) {
// An error occurred!
// myFile.gcount() returns the number of bytes read.
// calling myFile.clear() will reset the stream state
// so it is usable again.
}
...
if (!myFile.read (buffer, 100)) {
// Same effect as above
}
#include <fstream.h>
...
char buffer[100];
ofstream myFile ("data.bin", ios::out | ios::binary);
myFile.write (buffer, 100);
Security Tips
Problem | Solution |
---|---|
Use mlock() to prevent a section of memory from swapping to disk(source: "Building Secure Software," John Viega & Gary McGraw) |
Tools
GNU cflow
GNU cflow analyzes a collection of C source files and prints a graph, charting control flow within the program.
GNU cflow is able to produce both direct and inverted flowgraphs for C sources. Optionally a cross-reference listing can be generated. Two output formats are implemented: POSIX and GNU (extended).
<iostream.h> or <iostream>
<iostream>
is the standard compliant library.<iostream.h>
is deprecated since many many years.<iostream>
contains a set of templatized I/O classes which support both narrow and wide characters (by contrast,<iostream.h>
classes are confined to char exclusively).- Third, the C++ standard specification of iostream's interface was changed in many subtle aspects. Consequently, the interfaces and implementation of
<iostream>
differ from<iostream.h>
. - Finally,
<iostream>
components are declared in namespacestd
whereas<iostream.h>
components are declared in the global scope.
Note that both libraries cannot be mixed in one program.