- This post aims to cover all the major topics that C programmers need to know before
- they start writing C++ programs. I kept this post as short and concise as possible to
- enable people to use this as a quick reference to quickly jump into C++. This post assumes
- that you have prior knowledge of both C and object oriented-programming concepts. Each topic
- is quickly covered in a code snippet and some additional explanation is provided if necessary.
-
- ## Input/Output
-
- Input and output in C++ is easy, you use "cout" and "cin". When printing with
- "cout", you separate what your printing with "<<"; "endl" prints a new line.
-
- ```c++
- using namespace std; //namespaces talked about below
- #include <iostream> //Include statement for terminal IO.
-
- int main()
- {
- cout << "Hello World" << endl; // HELLO WORLD!
-
- int a;
- cin >> a; //inputs an int into a -- notice how arrows face the direction of IO
-
- cout << "You entered: " << a << endl; //prints what you entered
-
- return 0; // return sucess code
- }
- ```
-
-
- Save your C++ programs with the extension ".cpp", you then
- can compile and run it with g++. Compiling a C++ program with g++ is nearly the same
- as compiling a C program with GCC.
-
- ex:
-
- ```bash
- g++ helloWorld.cpp -o hello
- ./hello
- ```
-
-
- ## Namespaces
-
- Name spaces are used to enable you to have multiple functions/methods called the
- same thing and not conflict with one another. You use "namespacename::function/variable"
- to access something inside of a specific namespace. To prevent you from always having to type
- "namespacename::", you can use a namespace which makes that namespace default.
-
- ```c++
- using namespace std; //tells compiler we want to use std namespace
-
- #include <iostream>
-
- namespace foo //declares a namespece named foo
- {
- int a, b;
-
- void fun()
- {
- cout << "Inside foo namespace" << endl;
- }
- }
-
-
- namespace bar
- {
- void fun() //declares a function with the same name as another function
- {
- cout << "Inside bar namespace" << endl;
- }
- }
-
-
- using namespace foo; //start useing foo instead of std as selected namespace
- int main()
- {
- fun();
-
- bar::fun();
-
- int a = 5;
-
- foo::a = 12;
-
- std::cout << "a: " << a << endl; //had to use std::cout since the default namespace is foo
- std::cout << "foo::a: " << foo::a << endl;
-
- return 0;
- }
- ```
-
-
- ## Global Variable
-
- Global variables are similar to C, however, you can now reference a global members with the "::"
- accessor.
-
- ```c++
- using namespace std;
- #include <iostream>
-
- double bar = 64;
-
- int main ()
- {
- double bar = 12;
-
- cout << "Local bar: " << bar << endl; //prints 12
- cout << "Global bar: " << ::bar << endl; //prints 64
-
- return 0;
- }
- ```
-
- ## Multiple Names for a Variable/Aliasing
-
- This is NOT simply a pointer. In the following example pi, and x now are treated as
- the same exact variable. You cannot later change the pointer destination for x.
-
-
- ```c++
- double pi = 3.145;
- double &x = pi; //pi is x
-
- x = 2.1;
-
- cout << "pi: " << pi << " x: " << x << endl; // prints pi: 2.1 x: 2.1
- ```
-
-
- ## Passing Variables by Reference
-
- In C, everything was passed by value; C++ allows us to pass variables by reference. This is very powerful, in
- languages like Java, only Objects are passed by reference. C++ lets you decide exactly
- what gets passed by reference or by value -- even primitives.
-
- ```c++
- using namespace std;
- #include <iostream>
-
- void change (int &r, int s) //& infront of variable means that it will get passed by reference
- {
- r = 100;
- s = 200;
- }
-
- int main()
- {
- int x = 1;
- int y = 2;
- cout << x << ", " << y << endl;
- change(x, y);
- cout << x << ", " << y << endl;
-
- return 0;
- }
- ```
-
- Same code in C. This method still works in C++.
-
- ```c
- void change(double *r, double s)
- {
- *r = 100;
- s = 200;
- }
-
- int main()
- {
- int x = 1;
- int y = 2;
- printf("%d, %d", x, y);
- change(&x, y);
- printf("%d, %d", x, y);
-
- return 0;
- }
- ```
-
-
- ## Functions Returning Variables References
-
- A function can return a value reference which can be treated as a variable. In the following example, a function
- returns the reference to the variable which is the smallest.
-
- ```c++
- using namespace std;
- #include <iostream>
-
- int &smallest (int &x, int &y) //smallest returns a reference to a variable
- {
- if (x < y)
- return x;
- else
- return y;
- }
-
- int main ()
- {
- int k = 33;
- int m = 2;
-
- cout << "k: " << k << " m: " << m << endl; // prints k: 33 m: 2
-
- smallest (k, m) = 10; // MAGIC!
-
- cout << "k: " << k << " m: " << m << endl; // prints k: 33 m: 10
-
- return 0;
- }
- ```
-
-
- ## Inline
-
- Inline can be used to replace a function which contains very simple logic -- no
- for loops, etc. Like a macro, this will be inserted everywhere the code is used; a
- drawback to inline methods is that the compiled source will be larger. But, they
- typically run faster.
-
- ```c++
- using namespace std;
- #include <iostream>
-
- inline int square(int x) //macro like method
- {
- return x * x;
- }
-
- int main()
- {
- int k = 4;
-
- cout << square(k) << endl; //prints 16
-
- return 0;
- }
- ```
-
- ## Exceptions
-
- Exceptions might help you stop segmentation faulting. The important thing to notice
- is that you can throw about any type in a try block.
-
- ```c++
- int x;
- cout << "Type a number: ";
- cin >> x;
- cout << endl;
-
- try
- {
- if(a > 150)
- throw 150;
- if(a < 15)
- throw 15;
- throw a % 2;
- }
- catch(int result)
- {
- cout << result << " was thrown." << endl;
- }
- ```
-
-
- ## Default Parameters for Functions
-
- This is exactly like default parameters in Python. If a function is called without
- the parameter, it is assumed to be that value.
-
- ```c++
- double multiply(double x, double y = 5) // y has the default value of 5
- {
- return x * y;
- }
-
- int main()
- {
- cout << multiply(4) << endl; // 20
- cout << multiply(4, 4) endl; // 16
-
- return 0;
- }
- ```
-
-
- ## Function Overloading
-
- Like Java and Python, you can overload methods in C++. Not only can you overload the
- methods, but, the return type of the methods which are overloaded don't have to match.
-
-
- ```c++
- double add(double x)
- {
- return x;
- }
-
- double add(double x, double y)
- {
- return x + y;
- }
-
- int add(int x, int y)
- {
- return x + y;
- }
-
- int main()
- {
- cout << add(4) << endl; // 4
- cout << add(4.0, 4.0) << endl; // 8
- return 0;
- }
- ```
-
-
- ## Operator Overloading
-
- You can redefine basic operators like (+,/,-,<<,>>, +=) for certain data types by using
- operator overloading.
-
- ```c++
- using namespace std;
- #include <iostream>
-
- struct tuple //since tuple is defined elsewhere, we need to use :: to access it
- {
- int x;
- int y;
- };
-
- ::tuple operator + (int a, ::tuple b)
- {
- ::tuple r; //creates the tuple from our file -- tuple is defined elsewhere
-
- r.x = a + b.x;
- r.y = a + b.y;
-
- return r;
- }
-
-
- ::tuple operator * (int a, ::tuple b)
- {
- ::tuple r; //creates the tuple from our file -- tuple is defined elsewhere
-
- r.x = a * b.x;
- r.y = a * b.y;
-
- return r;
- }
-
- int main ()
- {
- ::tuple k, m; // No need to type "struct vector"
-
- k.x = 2; // To be able to write
- k.y = -1; // k = vector (2, -1)
- // see chapter 19.
-
- m = 3 + k; // Magic!
-
- cout << "(" << m.x << ", " << m.y << ")" << endl;
-
- return 0;
- }
- ```
-
- ## Functions with Generic Parameter Types
-
- In C++ you can use a template class to create a method which has generic
- return and parameter types.
-
- ```c++
- template <class ttype> //function with 1 generic type
- ttype max (ttype a, ttype b)
- {
- ttype r;
-
- r = a;
- if (b < a)
- r = b;
-
- return r;
- }
-
-
-
- template <class type1, class type2> //function with 2 generic types
- type1 maximum (type1 a, type2 b)
- {
- type1 r, b_converted;
- r = a;
- b_converted = (type1) b;
- if (b_converted > a)
- r = b_converted;
- return r;
- }
- ```
-
-
- ## Replacement for malloc and free
-
- Malloc and free still exists in C++, however, people typically
- use "new" and "delete" instead because it is cleaner.
-
- ```c++
- int *i = new int; //i = malloc(sizeof(int)); //c code
- *i = 55;
- delete i; //free(i); // c code
-
- i = new int[15];
- i[0] = 99;
- delete i;
- ```
-
-
- ## Struct Functions
-
- You can now add functions to structs.
-
- ```c++
- struct pair
- {
- int i;
- int x;
-
- int sum()
- {
- return i + x;
- }
- };
- ```
-
-
- # Classes
-
- The syntax of a class is similar to a struct.
-
- ```c++
- class Pair
- {
- public: // encapsulation covered in 2 sections
- int i;
- int x;
-
- int sum()
- {
- return i + x;
- }
- };
- ```
-
- ## Class Constructor and De-constructor
-
- Class constructors are similar to constructors in Java. Class destructor
- are simply the name of the class with a "~" sign in front of it. It is important to
- free any allocated memory in the class deconstruct since C++ does not have a garbage collector.
-
- ```c++
- class Pair
- {
- public:
- int i;
- int x;
-
- Pair(int i1, int i2) //constructor
- {
- i = i1;
- x = i2;
- }
-
- ~Pair() //class deconstructor
- {
- //delete any memory you have!
- }
-
- int sum()
- {
- return i + x;
- }
- };
-
-
- // in main or somewhere
- Pair t (12, 14); //creates a tuple on the stack
-
- Pair* tt = new Pair(12, 15); //allocates memory for the tuple on the heap
-
- cout << t.sum() << endl; //prints 26
- cout << tt->sum() << endl; //prints 27
- ```
-
- ## Encapsulation
-
- Like Java, you can declare who can view access certain members of a class.
-
- - protected: Only members of the class and children can view the variables/methods.
- - public: Everyone has access to the variables/methods.
- - private: Only this class can access the variables/methods.
-
- ```c++
- class Person
- {
- protected:
- int age;
- string name;
-
- public:
- Person(int age, string name)
- {
- }
-
- ~Person()
- {
- }
-
- private:
- void increaseAge()
- {
- age++;
- }
- };
- ```
-
- ## This keyword
-
- When you use the "this" key word, you are getting the pointer to the class that you are
- in.
-
- ```c++
- class Person
- {
- protected:
- int age;
- string name;
-
- public:
- Person(int age, string name)
- {
- this->age = age;
- this->name = name;
- }
-
- ~Person()
- {
- }
-
- private:
- void increaseAge()
- {
- age++;
- }
- };
- ```
-
-
- ## Class Inheritance
-
- Classes can inherit variables and methods from other classes. The most important thing to
- remember is that if you ever want to override a method in a child class, you must
- declare the method as "virtual".
-
- ```c++
- class Pair
- {
- protected:
- int x;
- int y;
-
- public:
- Pair(int i1, int i2)
- {
- x = i1;
- y = i2;
- }
-
- virtual int sum()
- {
- return x + x;
- }
- };
-
- class Triple: public Pair
- {
- protected:
- int z;
-
- public:
- Triple(int i1, int i2, int i3): Pair(i1, i2) //calls the parent's constructor
- {
- z = i3;
- }
-
- int sum()
- {
- return x + y + z;
- }
- };
- ```
-
- ## Abstract Classes
-
- Abstract classes are simply classes which cannot be instantiated. To do this in C++
- you simply set a virtual function equal to zero.
-
- ```c++
- class Animal
- {
- public:
- virtual void speak()=0;
- };
-
-
- class Cat: public Animal
- {
- public:
- void speak()
- {
- cout << "Meow" << endl;
- }
- };
- ```
-
- ## Method Prototypes for Classes
-
- If you wish to use a method prototype in a class, you must use namespace
- syntax to define the method elsewhere. This is particularly useful for breaking classes
- into multiple files. It is common to declare the class in a header file and then
- implement the functions in a cpp file.
-
- ```c++
- class Animal
- {
- public:
- virtual void speak()=0;
- };
-
- class Cat: public Animal
- {
- public:
- void speak()
- {
- cout << "Meow" << endl;
- }
-
- int fly(); //method prototype
- };
-
-
- int Cat::fly()
- {
- return 42;
- }
- ```
-
- ## Strings
-
- Since C++ has classes, you can work with strings in a pleasant way.
-
- ```c++
- using namespace std;
-
- #include <iostream>
-
- int main()
- {
- string str1 = "Hello"; // string "Hello"
- string str2("World"); // string "World"
- string str1Copy(str1); // string "Hello"
-
-
- //initializes string by a character and number of occurrences
- string str4(5, '$'); // string "$$$$$$"
-
- //string concatenation
- string greeting = str1 + " " + str2;
- cout << greeting << endl;
-
- //length of a string
- int len = str1.size();
- cout << "str1.size(): " << len << endl;
-
- //clear all characters from a string
- greeting.clear();
- cout <<"Greeting: "<< greeting << endl;
-
-
- string numbers = "0123456789";
-
- //returns first character in string
- char first = numbers.front();
-
- //returns last character in string
- char back = numbers.back();
-
- //gets a character at a certain position
- char second = numbers.at(1);
- char secondAlt = numbers[1]; //array syntax still works on strings
-
- cout << "first: " << first << endl;
- cout << "back: " << back << endl;
- cout << "second: " << second << endl;
-
-
- //substr(a, b) function returns a substring of b length
- //starting from index a. If there is no second argument, it
- //goes to the end.
- cout << numbers.substr(2, 7) << endl;
-
-
- //replace(a, b, str) replaces b character from a index by str
- string str6 = "This is a examples";
- str6.replace(2, 7, "ese are test");
- cout << str6 << endl;
-
- return 0;
- }
- ```
-
-
- # File IO
-
- File IO is significantly different from C. I will quickly glance over
- a few examples which should give you most of what you need to start writing basic programs.
-
- ## Reading from File
-
- Reading a file example by character.
-
- ```c++
- using namespace std;
-
- #include <iostream>
- #include <fstream> // header for files
-
- int main()
- {
- fstream f;
- char c;
- f.open("p022_names.txt", ios::in);
-
- while(!f.eof())
- {
- f.get(c);
- cout << c;
- }
- f.close();
- }
- ```
-
- Reading lines from a file using strings.
-
- ```c++
- using namespace std;
-
- #include <iostream>
- #include <fstream>
- #include <string>
-
- int main ()
- {
- string line;
- ifstream myfile ("example.txt");
- if(myfile.is_open()) //checks to see if file open successfully
- {
- while(getline(myfile,line)) //gets contents of file and puts them in a string
- {
- cout << line << '\n';
- }
- myfile.close();
- }
- else
- {
- cout << "Unable to open file";
- }
-
- return 0;
- }
- ```
-
- ## Writing to File
-
- Writing to a file example.
-
- ```c++
- using namespace std;
-
- #include <iostream>
- #include <fstream> // Header for files
-
- int main()
- {
- fstream f;
- char c;
- f.open("p022_names.txt", ios::out);
-
- f << "stuff in the file " << endl;
-
- int i = 4;
-
- f << i << " this is also in the text file" << endl;
-
- f.close();
- }
- ```
-
- ## Resources
-
- You now know enough C++ to start programming with it. If you want to take your
- skills to the next level, I would recommend start working on a few projects in C++ and get
- a comprehensive C++ book.
-
- - [Online C++ Guide](https://www.programiz.com/cpp-programming)
- - Kochan: Programming in C _p4 (4th Edition) (Developer's Library) 4th Edition -- Really good book if you don't know C yet.
- - [Tutorials Point C++](https://www.tutorialspoint.com/cplusplus/index.htm)
|