#include <stdio.h> | // Insert standard header file |
#include "myfile.h" | // Insert file in current directory |
#define X some text | // Replace X with some text |
#define F(a,b) a+b | // Replace F(1,2) with 1+2 |
#define X \ some text | // Multiline definition |
#undef X | // Remove definition |
#if defined(X) | // Conditional compilation (#ifdef X) |
#else | // Optional (#ifndef X or #if !defined(X)) |
#endif | // Required after #if, #ifdef |
255, 0377, 0xff | // Integers (decimal, octal, hex) |
2147483647L, 0x7fffffffl | // Long (32-bit) integers |
123.0, 1.23e2 | // double (real) numbers |
'a', '\141', '\x61' | // Character (literal, octal, hex) |
'\n', '\\', '\'', '\"' | // Newline, backslash, single quote, double quote |
"string\n" | // Array of characters ending with newline and \0 |
"hello" "world" | // Concatenated strings |
true, false | // bool constants 1 and 0 |
nullptr | // Pointer type with the address of 0 |
#include <cmath> | // Include cmath (std namespace) |
sin(x); cos(x); tan(x); | // Trig functions, x (double) is in radians |
asin(x); acos(x); atan(x); | // Inverses |
atan2(y, x); | // atan(y/x) |
sinh(x); cosh(x); tanh(x); | // Hyperbolic sin, cos, tan functions |
exp(x); log(x); log10(x); | // e to the x, log base e, log base 10 |
pow(x, y); sqrt(x); | // x to the y, square root |
ceil(x); floor(x); | // Round up or down (as a double) |
fabs(x); fmod(x, y); | // Absolute value, x mod y |
#include <vector> | // Include vector (std namespace) |
vector<int> a(10); | // a[0]..a[9] are int (default size is 0) |
vector<int> b{1,2,3}; | // Create vector with values 1,2,3 |
a.size(); | // Number of elements (10) |
a.push_back(3); | // Increase size to 11, a[10]=3 |
a.back()=4; | // a[10]=4; |
a.pop_back(); | // Decrease size by 1 |
a.front(); | // a[0]; |
a[20]=1; | // Crash: not bounds checked |
a.at(20)=1; | // Like a[20] but throws out_of_range() |
for (int& p : a) p=0; |
// C++11: Set all elements of a to 0 |
for (vector *p=0; |
// C++03: Set all elements of a to 0 |
vector<int> b(a.begin(), a.end()); | // b is copy of a |
vector<T> c(n, x); | // c[0]..c[n-1] init to x |
T d[10]; vector<T> e(d, d+10); | // e is initialized from d |
deque<T> is like vector<T>, but also supports:
#include <deque> | // Include deque (std namespace) |
a.push_front(x); | // Puts x at a[0], shifts elements toward back |
a.pop_front(); | // Removes a[0], shifts toward front |
#include <utility> | // Include utility (std namespace) |
pair<string, int> a("hello", 3); | // A 2-element struct |
a.first; | // "hello" |
a.second; | // 3 |
template <class T> T f(T t); | // Overload f for all types |
template <class T> class X { X(T t); }; |
// Class with type parameter T // A constructor |
template <class T> X<T>::X(T t) {} | // Definition of constructor |
X<int> x(3); | // An object of type "X of int" |
template <class T, class U=T, int n=0> | // Template with default parameters |
int x; | // Declare x to be an integer (value undefined) |
int x=255; | // Declare and initialize x to 255 |
short s; long l; | // Usually 16 or 32 bit integer (int may be either) |
char c='a'; | // Usually 8 bit character |
unsigned char u=255; signed char s=-1; |
// char might be either |
unsigned long x = 0xffffffffL; | // short, int, long are signed |
float f; double d; | // Single or double precision real (never unsigned) |
bool b=true; | // true or false, may also use int (1 or 0) |
int a, b, c; | // Multiple declarations |
int a[10]; | // Array of 10 ints (a[0] through a[9]) |
int a[]={0,1,2}; | // Initialized array (or a[3]={0,1,2}; ) |
char s[]="hello"; | // String (6 elements including '\0') |
std::string s = "Hello" | // Creates string object with value "Hello" |
std::string s = R"(Hello World)"; | // Creates string object with value "Hello\nWorld" |
int* p | // p is a pointer to (address of) int |
char* s="hello"; | // s points to unnamed array containing "hello" |
void* p=nullptr; | // Address of untyped memory (nullptr is 0) |
int& r=x; | // r is a reference to (alias of) int x |
enum weekend {SAT,SUN}; | // weekend is a type with values SAT and SUN |
enum weekend day; | // day is a variable of type weekend |
enum weekend{SAT=0,SUN=1}; | // Explicit representation as int |
enum {SAT,SUN} day; | // Anonymous enum |
enum class Color {Red,Blue}; | // Color is a strict type with values Red and Blue |
Color x = Color::Red; | // Assign Color x to red |
typedef String char*; | // String s; means char* s; |
const int c=3; | // Constants must be initialized, cannot assign to |
const int* p=a; | // Contents of p (elements of a) are constant |
int* const p=a; | // p (but not contents) are constant |
const int* const p=a; | // Both p and its contents are constant |
const int& cr=x; | // cr cannot be assigned to change x |
int8_t,uint8_t,int16_t, uint16_t,int32_t,uint32_t, int64_t,uint64_t | // Fixed length standard types |
auto it = m.begin(); | // Declares it to the result of m.begin() |
auto const param = config["param"]; | // Declares it to the const result |
auto& s = singleton::instance(); | // Declares it to a reference of the result |
#include <map> | // Include map (std namespace) |
map<string, int> a; | // Map from string to int |
a["hello"] = 3; | // Add or replace element a["hello"] |
for (auto& p:a) cout << p.first << p.second; |
// Prints hello, 3 |
a.size(); | // 1 |
#include <unordered_map> | // Include map (std namespace) |
unordered_map<string, int> a; | // Map from string to int |
a["hello"] = 3; | // Add or replace element a["hello"] |
for (auto& p:a) cout << p.first << p.second; |
// Prints hello, 3 |
a.size(); | // 1 |
#include <set> | // Include set (std namespace) |
set<int> s; | // Set of integers |
s.insert(123); | // Add element to set |
if (s.find(123) != s.end()) s.erase(123); |
// Search for an element |
cout << s.size(); | // Number of elements in set |
#include <unordered_set> | // Include set (std namespace) |
unordered_set<int> s; | // Set of integers |
s.insert(123); | // Add element to set |
if (s.find(123) != s.end()) s.erase(123); |
// Search for an element |
cout << s.size(); | // Number of elements in set |
int x; | // Auto (memory exists only while in scope) |
static int x; | // Global lifetime even if local scope |
extern int x; | // Information only, declared elsewhere |
x=y; | // Every expression is a statement |
int x; | // Declarations are statements |
; | // Empty statement |
{ int x; } |
// A block is a single statement // Scope of x is from declaration to end of block |
if (x) a; else if (y) b; else c; |
// If x is true (not 0), evaluate a // If not x and y (optional, may be repeated) // If not x and not y (optional) |
while (x) a; | // Repeat 0 or more times while x is true |
for (x; y; z) a; | // Equivalent to: x; while(y) {a; z;} |
for (x : y) a; | // Range-based for loop e.g. // for (auto& x in someList) x.y(); |
do a; while (x); | // Equivalent to: a; while(x) a; |
switch (x) { case X1: a; case X2: b; default: c; } |
// x must be int // If x == X1 (must be a const), jump here // Else if x == X2, jump here // Else jump here (optional) |
break; | // Jump out of while, do, or for loop, or switch |
continue; | // Jump to bottom of while, do, or for loop |
return x; try { a; } |
// Return x from function to caller |
catch (T t) { b; } | // If a throws a T, then jump here |
catch (...) { c; } | // If a throws something else, jump here |
#include <cassert> | // Include iostream (std namespace) |
assert(e); | // If e is false, print message and abort |
#define NDEBUG | // (before #include <assert.h>), turn off assert |
#include <iostream> | // Include iostream (std namespace) |
cin >> x >> y; | // Read words x and y (any type) from stdin |
cout << "x=" << 3 << endl; | // Write line to stdout |
cerr << x << y << flush; | // Write to stderr and flush |
c = cin.get(); | // c = getchar(); |
cin.get(c); | // Read char |
cin.getline(s, n, '\n'); | // Read line into char s[n] to '\n' (default) |
if (cin) | // Good state (not EOF)? // To read/write any type T: |
istream& operator>>(istream& i, T& x) {i >> ...; x=...; return i;} | |
ostream& operator<<(ostream& o, const T& x) {return o << ...;} |
#include <fstream> | // Include filestream (std namespace) |
ifstream f1("filename"); | // Open text file for reading |
if (f1) | // Test if open and input available |
f1 >> x; | // Read object from file |
f1.get(s); | // Read char or line |
f1.getline(s, n); | // Read line into string s[n] |
ofstream f2("filename"); | // Open file for writing |
if (f2) f2 << x; | // Write to file |
#include <string> | // Include string (std namespace) |
string s1, s2="hello"; | // Create strings |
s1.size(), s2.size(); | // Number of characters: 0, 5 |
s1 += s2 + ' ' + "world"; | // Comparison, also <, >, !=, etc. |
s1[0]; | // 'h' |
s1.substr(m, n); | // Substring of size n starting at s1[m] |
s1.c_str(); | // Convert to const char* |
s1 = to_string(12.05); | // Converts number to string |
getline(cin, s); | // Read line ending in '\n' |
int f(int x, int y); | // f is a function taking 2 ints and returning int |
void f(); | // f is a procedure taking no arguments |
void f(int a=0); | // f() is equivalent to f(0) |
f(); | // Default return type is int |
inline f(); | // Optimize for speed |
f() { statements; } | // Function definition (must be global) |
T operator+(T x, T y); | // a+b (if type T) calls operator+(a, b) |
T operator-(T x); | // -a calls function operator-(a) |
T operator++(int); | // postfix ++ or -- (parameter ignored) |
extern "C" {void f();} | // f() was compiled in C |
T::X | // Name X defined in class T |
N::X | // Name X defined in namespace N |
::X | // Global name X |
t.x | // Member x of struct or class t |
p-> x | // Member x of struct or class pointed to by p |
a[i] | // i'th element of array a |
f(x,y) | // Call to function f with arguments x and y |
T(x,y) | // Object of class T initialized with x and y |
x++ | // Add 1 to x, evaluates to original x (postfix) |
x-- | // Subtract 1 from x, evaluates to original x |
typeid(x) | // Type of x |
typeid(T) | // Equals typeid(x) if x is a T |
dynamic_cast< T>(x) | // Converts x to a T, checked at run time. |
static_cast< T>(x) | // Converts x to a T, not checked |
reinterpret_cast< T>(x) | // Interpret bits of x as a T |
const_cast< T>(x) | // Converts x to same type T but not const |
sizeof x | // Number of bytes used to represent object x |
sizeof(T) | // Number of bytes to represent type T |
++x | // Add 1 to x, evaluates to new value (prefix) |
--x | // Subtract 1 from x, evaluates to new value |
~x | // Bitwise complement of x |
!x | // true if x is 0, else false (1 or 0 in C) |
-x | // Unary minus |
+x | // Unary plus (default) |
&x | // Address of x |
*p | // Contents of address p (*&x equals x) |
new T | // Address of newly allocated T object |
new T(x, y) | // Address of a T initialized with x, y |
new T[x] | // Address of allocated n-element array of T |
delete p | // Destroy and free object at address p |
delete[] p | // Destroy and free array of objects at p |
(T) x | // Convert x to T (obsolete, use .._cast |
x * y | // Multiply |
x / y | // Divide (integers round toward 0) |
x % y | // Modulo (result has sign of x) |
x + y | // Add, or \&x[y] |
x - y | // Subtract, or number of elements from *x to *y |
x << y | // x shifted y bits to left (x * pow(2, y)) |
x >> y | // x shifted y bits to right (x / pow(2, y)) |
x < y | // Less than |
x <= y | // Less than or equal to |
x > y | // Greater than |
x >= y | // Greater than or equal to |
x & y | // Bitwise and (3 & 6 is 2) |
x ^ y | // Bitwise exclusive or (3 ^ 6 is 5) |
x | y | // Bitwise or (3 | 6 is 7) |
x && y | // x and then y (evaluates y only if x (not 0)) |
x || y | // x or else y (evaluates y only if x is false (0)) |
x = y | // Assign y to x, returns new value of x |
x += y | // x = x + y, also -= *= /= <<= >>= &= |= ^= |
x ? y : z | // y if x is true (nonzero), else z |
throw x | // Throw exception, aborts if not caught |
x , y | // evaluates x and y, returns y (seldom used) |
class T { | // A new type |
private: | // Section accessible only to T's member functions |
protected: | // Also accessible to classes derived from T |
public: | // Accessible to all |
int x; | // Member data |
void f(); | // Member function |
void g() {return;} | // Inline member function |
void h() const; | // Does not modify any data members |
int operator+(int y); | // t+y means t.operator+(y) |
int operator-(); | // -t means t.operator-() |
T(): x(1) {} | // Constructor with initialization list |
T(const T& t): x(t.x) {} | // Copy constructor |
T& operator=(const T& t) {x=t.x; return *this; } |
// Assignment operator |
~T(); | // Destructor (automatic cleanup routine) |
explicit T(int a); | // Allow t=T(3) but not t=3 |
T(float x): T((int)x) {} | // Delegate constructor to T(int) |
operator int() const {return x;} | // Allows int(t) |
friend void i(); | // Global function i() has private access |
friend class U; | // Members of class U have private access |
static int y; | // Data shared by all T objects |
static void l(); | // Shared code. May access y but not x |
class Z {}; | // Nested class T::Z |
typedef int V; | // T::V means int |
}; | |
void T::f() { | // Code for member function f of class T |
this->x = x;} | // this is address of self (means x=x;) |
int T::y = 2; | // Initialization of static member (required) |
T::l(); | // Call to static member |
T t; | // Create object t implicit call constructor |
t.f(); | // Call method f on object t |
struct T { | // Equivalent to: class T { public: |
virtual void i(); | // May be overridden at run time by derived class |
virtual void g()=0; }; | // Must be overridden (pure virtual) |
class U: public T { | // Derived class U inherits all members of base T |
public: | |
void g(int) override; }; | // Override method g |
class V: private T {}; | // Inherited members of T become private |
class W: public T, public U {}; | // Multiple inheritance |
class X: public virtual T {}; | // Classes derived from X have base T directly |
namespace N {class T {};} | // Hide name T |
N::T t; | // Use name T in namespace N |
using namespace N; | // Make T visible without N:: |
#include <memory> | // Include memory (std namespace) |
shared_ptr<int> x; | // Empty shared_ptr to a integer on heap. Uses reference counting for cleaning up objects |
x = make_shared<int>(12); | // Allocate value 12 on heap |
shared_ptr<int> y = x; | // Copy shared_ptr, implicit changes reference count to 2. |
cout << *y; | // Dereference y to print '12' |
if (y.get() == x.get()) { cout << "Same"; } |
// Raw pointers (here x == y) |
y.reset(); if (y.get() != x.get()) { out << "Different"; } |
// Eliminate one owner of object |
if (y == nullptr) { cout << "Empty"; } |
// Can compare against nullptr (here returns true) |
y = make_shared<int>(15); | // Assign new value |
cout << *y; | // Dereference x to print '15' |
cout << *x; | // Dereference x to print '12' |
weak_ptr<int> w; | // Create empty weak pointer |
w = y; | // w has weak reference to y |
if (shared_ptr<int> s = w.lock()) { cout << *s; } |
// Has to be copied into a shared_ptr before usage |
unique_ptr<int> z; unique_ptr<int> q; |
// Create empty unique pointers |
z = make_unique<int>(16); | // Allocate int (16) on heap. Only one reference allowed. |
q = move(z); | // Move reference from z to q. |
if (z == nullptr){ cout << "Z null"; } cout << *q; shared_ptr<B> r; |
|
r = dynamic_pointer_cast<B>(t); | // Converts t to a shared_ptr<B> |