2014-09-11 02:04:18 +04:00
|
|
|
---
|
|
|
|
language: c++
|
|
|
|
filename: learncpp.cpp
|
|
|
|
contributors:
|
|
|
|
- ["Steven Basart", "http://github.com/xksteven"]
|
|
|
|
lang: en
|
|
|
|
---
|
|
|
|
|
|
|
|
I am writing this to highlight the differences and
|
|
|
|
additions that C++ has with respect to C. My
|
|
|
|
suggestion would be to follow the C tutorial first
|
|
|
|
then look here for the additions and differences.
|
|
|
|
|
|
|
|
```c++
|
|
|
|
///////////////////////////////////////
|
|
|
|
// C++ differences
|
|
|
|
///////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
//In C++
|
|
|
|
//cannot use void main()
|
|
|
|
int main() { //or int main(int argc, char **argv)
|
|
|
|
//cannot end with return;
|
|
|
|
return 0;
|
|
|
|
//Can also end without return statement
|
|
|
|
}
|
|
|
|
|
|
|
|
//In C++
|
|
|
|
/*
|
|
|
|
//This could lead to compiler errors and is discouraged
|
|
|
|
//#if 0 #endif pairs are encouraged instead
|
|
|
|
*/
|
|
|
|
|
|
|
|
//In C++
|
|
|
|
sizeof(10) //Typically 4
|
|
|
|
sizeof('c') == 1
|
|
|
|
|
|
|
|
//In C
|
|
|
|
sizeof('c') == sizeof(10) //true chars are passed as ints
|
|
|
|
|
|
|
|
|
|
|
|
//In C++ strict prototyping
|
|
|
|
void func(); //function which accepts no arguments
|
|
|
|
|
|
|
|
//In C
|
|
|
|
void func(); //function which may accept arguments
|
|
|
|
|
|
|
|
|
|
|
|
//In C++
|
|
|
|
for(int i = 0; i < 10; i++) {;}
|
|
|
|
//In C must int i must be declared before
|
|
|
|
|
|
|
|
|
|
|
|
//C++ Supports Function overloading
|
|
|
|
//Provided each function takes different
|
|
|
|
//parameters
|
|
|
|
|
|
|
|
void printing(char const *myString)
|
|
|
|
{printf("String %s\n",myString);} //Hello
|
|
|
|
|
|
|
|
void printing(int myInt)
|
|
|
|
{printf("My int is %d",myInt);} //15
|
|
|
|
|
|
|
|
int main ()
|
|
|
|
{
|
|
|
|
printing("Hello");
|
|
|
|
printing(15);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//C++ Default Function Arguments
|
|
|
|
void two_ints(int a = 1, int b = 4);
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
two_ints(); // arguments: 1, 4
|
|
|
|
two_ints(20); // arguments: 20, 4
|
|
|
|
two_ints(20, 5); // arguments: 20, 5
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//C++ added the nullptr which is different from 0
|
|
|
|
int *ip = nullptr; // OK
|
|
|
|
int value = nullptr; // error: value is no pointer
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////
|
|
|
|
// C++ Additions ontop of C
|
|
|
|
///////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////
|
|
|
|
// C++ Namespace
|
|
|
|
///////////////////////////////////////
|
|
|
|
|
|
|
|
//Namespaces allow you to define your own
|
|
|
|
//functions and variables for use
|
|
|
|
|
|
|
|
// Use '::' to change variable (or function) scope
|
|
|
|
// Putting '::' before a function or variable will
|
|
|
|
// reference a global scope
|
|
|
|
|
|
|
|
// This allows you to make normal c library calls
|
|
|
|
// std is for standard library
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
int counter = 50; // global variable
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
for (int counter = 1; // this refers to the
|
|
|
|
counter < 2; // local variable
|
|
|
|
counter++)
|
|
|
|
{
|
|
|
|
printf("Global var %d local var %d\n",
|
|
|
|
::counter, // global variable
|
|
|
|
counter); // local variable
|
|
|
|
// => Global var 50 local var 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Namespaces can be nested
|
|
|
|
|
|
|
|
|
|
|
|
namespace myFirstNameSpace
|
|
|
|
{
|
|
|
|
namespace myInnerSoul
|
|
|
|
{
|
|
|
|
cos(int x)
|
|
|
|
{
|
|
|
|
printf("My inner soul was made to program.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace anotherNameSpace
|
|
|
|
{
|
|
|
|
cos(int x) {;} //does nothing
|
|
|
|
}
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
//Specify the full path because main is outside of both namespaces.
|
|
|
|
//Will print out My inner soul was made to program.
|
|
|
|
myFirstNameSpace::myInnerSoul::cos(60);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////
|
|
|
|
// C++ Strings
|
|
|
|
///////////////////////////////////////
|
|
|
|
|
|
|
|
//Strings in C++ are Objects and have many functions
|
|
|
|
myString = "Hello";
|
|
|
|
myOtherString = " World";
|
|
|
|
|
|
|
|
myString + myOtherString; // => "Hello World"
|
|
|
|
|
|
|
|
myString + ' You'; // => "Hello You"
|
|
|
|
|
|
|
|
myString != myOtherString; //True
|
|
|
|
|
|
|
|
//An example of a string method
|
|
|
|
myString.append(" Dog"); // => "Hello Dog"
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////
|
|
|
|
// C++ Input Output
|
|
|
|
///////////////////////////////////////
|
|
|
|
|
|
|
|
//C++ input and output streams
|
|
|
|
//cin, cout, cerr, << is insertion and >> is extraction operator
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
|
|
|
|
int myInt;
|
|
|
|
|
|
|
|
//Prints to stdout (or terminal/screen)
|
2014-09-13 13:04:49 +04:00
|
|
|
cout << "Enter your fav number:\n";
|
2014-09-11 02:04:18 +04:00
|
|
|
//Takes in input
|
|
|
|
cin >> myInt;
|
|
|
|
|
|
|
|
//cout can also be formatted
|
2014-09-13 13:04:49 +04:00
|
|
|
cout << "Your fav number is " << myInt << "\n";
|
2014-09-11 02:04:18 +04:00
|
|
|
//Your fav number is ##
|
|
|
|
|
2014-09-13 13:04:49 +04:00
|
|
|
cerr << "Used for error messages";
|
2014-09-11 02:04:18 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////
|
|
|
|
// C++ Classes
|
|
|
|
///////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
//First example of classes
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
//define a class
|
|
|
|
class Doggie
|
|
|
|
{
|
|
|
|
std::string name;
|
|
|
|
int weight;
|
|
|
|
|
|
|
|
// These are only the declarations
|
|
|
|
//Can also have private and protected
|
|
|
|
public:
|
|
|
|
//The public methods (can also include variables)
|
|
|
|
|
|
|
|
// Default constructor
|
|
|
|
Doggie();
|
|
|
|
|
|
|
|
void setName(std::string dogsName);
|
|
|
|
void setWeight(int dogsWeight);
|
|
|
|
void printDog();
|
|
|
|
|
|
|
|
//Can define functions within class declaration too
|
|
|
|
void dogBark() {std::cout << "Bark Bark\n"}
|
|
|
|
|
|
|
|
//Destructors are methods that free the allocated space
|
|
|
|
~doggieDestructor();
|
|
|
|
//if no destructor compiler defines the trivial destructor
|
|
|
|
|
|
|
|
//Classes are similar to structs and must close the } with ;
|
|
|
|
};
|
|
|
|
|
|
|
|
// This is the implementation of the class methods
|
|
|
|
// Also called the definition
|
|
|
|
void Doggie::Doggie () {
|
|
|
|
std::cout << "A doggie is born. Woof!\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
void Doggie::setName (std::string doggie_name) {
|
|
|
|
name = doggie_name;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Doggie::setWeight (int doggie_weight) {
|
|
|
|
weight = doggie_weight;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Doggie::printDog () {
|
|
|
|
std::cout << "Dog is " << name << " weighs" << weight << "\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
void Doggie::~doggieDestructor () {
|
|
|
|
delete[] name;
|
|
|
|
delete weight;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main () {
|
|
|
|
Doggie deedee; // prints out a doggie is born. Woof!
|
|
|
|
deedee.setName ("Barkley");
|
|
|
|
deedee.setWeight(1000000);
|
|
|
|
deedee.printDog;
|
|
|
|
//prints => Dog is Barkley weighs 1000000
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//C++ Class inheritance
|
|
|
|
|
|
|
|
class German_Sheperd
|
|
|
|
{
|
|
|
|
//This class now inherits everything public and protected from Doggie class
|
|
|
|
Doggie d_dog;
|
|
|
|
|
|
|
|
//Good practice to put d_ in front of datatypes in classes
|
|
|
|
std::string d_type;
|
|
|
|
|
|
|
|
public:
|
|
|
|
void dogType() {d_type = "German Sheperd";}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////
|
|
|
|
// C++ Exception Handling
|
|
|
|
///////////////////////////////////////
|
|
|
|
|
|
|
|
try {
|
|
|
|
throw 12.25; // throws a double no handler declared
|
|
|
|
} catch (int errorNum)
|
|
|
|
{
|
|
|
|
std::cout << "I caught an int " << errorNum << "\n";
|
|
|
|
//default catcher
|
|
|
|
} catch (...)
|
|
|
|
{
|
|
|
|
std::cout << "I got an error. Not sure what but I can pass it up.";
|
|
|
|
throw;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////
|
|
|
|
// C++ Operator Overloading
|
|
|
|
///////////////////////////////////////
|
|
|
|
|
|
|
|
// In C++ you can overload operators such as +, -, new, etc.
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
class Vector {
|
|
|
|
public:
|
|
|
|
double x,y;
|
|
|
|
Vector () {};
|
|
|
|
Vector (double a, double b) : x(a), y(b) {}
|
|
|
|
Vector operator + (const CVector&);
|
|
|
|
Vector operator += (const CVector&);
|
|
|
|
};
|
|
|
|
|
|
|
|
Vector Vector::operator+ (const Vector& rhs)
|
|
|
|
{
|
|
|
|
Vector temp;
|
|
|
|
temp.x = x + rhs.x;
|
|
|
|
temp.y = y + rhs.y;
|
|
|
|
return temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
Vector Vector::operator+= (const Vector& rhs)
|
|
|
|
{
|
|
|
|
x += rhs.x;
|
|
|
|
y += rhs.y;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main () {
|
|
|
|
Vector up (0,1);
|
|
|
|
Vector right (1,0);
|
|
|
|
Vector result;
|
|
|
|
// This calls the Vector + operator
|
|
|
|
// Vector up calls the + (function) with right as its paramater
|
|
|
|
result = up + right;
|
|
|
|
// prints out => Result is upright (1,1)
|
|
|
|
cout << "Result is upright (" << result.x << ',' << result.y << ")\n";
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
Futher Reading
|
|
|
|
|
|
|
|
for more resources see: http://www.icce.rug.nl/documents/cplusplus/
|
|
|
|
for other reference material: http://www.cplusplus.com/doc/tutorial/
|