本章节主要是对C++基础知识的回顾,不会涉及太简单的知识点,比如=和==的区别,也不会涉及太复杂的知识,比如volatile关键字的作用。
(1) 空间命名规则
#ifndef NAMESPACE_H
#define NAMESPACE_H
// namespaces.h
namespace mycode {
void foo();
}
#endif // NAMESPACE_H
#include "namespace.h"
#include <iostream>
void mycode::foo()
{
std::cout << "foo() called in the mycode namespace" << std::endl;
}
#include "namespace.h"
using namespace std;
using namespace mycode;
int main(int argc, char *argv[])
{
foo();
}
output:
foo() called in the mycode namespace
(2) 变量的定义, 操作符,循环语句全部都是基础知识。
(3) 枚举类型
typedef enum { kPieceTypeKing, kPieceTypeQueen, kPieceTypeRook,
kPieceTypePawm
} PieceT;
(4) Stack 和 Heap的区别
stack分配的空间一般都是程序自动管理,heap用于new分配,delete删除。
(5)综合举例,一个管理员工系统
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
// employee.h
#include <iostream>
namespace Records {
const int kDefaultStartingSalary = 30000;
class Employee {
public:
Employee();
void promote(int inRaiseAmount = 1000);
void demote(int inDemeritAmount = 1000);
void hire();
void fire();
void display();
void setFirstName(std::string inFirstName);
std::string getFirstName();
void setLastName(std::string inLastName);
std::string getLastName();
void setEmployeeNumber(int inEmployeeNumber);
int getEmployeeNumber();
void setSalary(int inNewSalary);
int getSalary();
bool getIsHired();
private:
std::string mFirstName;
std::string mLastName;
int mEmployeeNumber;
int mSalary;
bool fHired;
};
}
#endif // EMPLOYEE_H
#include "employee.h"
#include <iostream>
using namespace std;
namespace Records {
Employee::Employee()
{
mFirstName = "";
mLastName = "";
mEmployeeNumber = -1;
mSalary = kDefaultStartingSalary;
fHired = false;
}
void Employee::promote(int inRaiseAmount)
{
setSalary(getSalary() + inRaiseAmount);
}
void Employee::demote(int inDemeritAmount)
{
setSalary(getSalary() - inDemeritAmount);
}
void Employee::hire()
{
fHired = true;
}
void Employee::fire()
{
fHired = false;
}
void Employee::display()
{
cout << "Employee: " << getLastName() << ", " << getFirstName() << endl;
cout << "-------------------------" << endl;
cout << (fHired ? "Current Employee" : "Former Employee") << endl;
cout << "Employee Nmber: " << getEmployeeNumber() << endl;
cout << "Salary: $" << getSalary() << endl;
cout << endl;
}
void Employee::setFirstName(std::__cxx11::string inFirstName)
{
mFirstName = inFirstName;
}
std::__cxx11::string Employee::getFirstName()
{
return mFirstName;
}
void Employee::setLastName(std::__cxx11::string inLastName)
{
mLastName = inLastName;
}
std::__cxx11::string Employee::getLastName()
{
return mLastName;
}
void Employee::setEmployeeNumber(int inEmployeeNumber)
{
mEmployeeNumber = inEmployeeNumber;
}
int Employee::getEmployeeNumber()
{
return mEmployeeNumber;
}
void Employee::setSalary(int inNewSalary)
{
mSalary = inNewSalary;
}
int Employee::getSalary()
{
return mSalary;
}
bool Employee::getIsHired()
{
return fHired;
}
}
#ifndef DATABASE_H
#define DATABASE_H
#include "employee.h"
#include <iostream>
// Database.h
namespace Records {
const int kMaxEmployees =100;
const int kFirstEmployeeNumber = 1000;
class Database {
public:
Database();
~Database();
Employee &addEmployee(std::string inFirstName, std::string inLastName);
Employee &getEmployee(int inEmployeeNumber);
Employee &getEmployee(std::string inFirstName, std::string inLastName);
void displayAll();
void displayCurrent();
void displayFormer();
protected:
Employee mEmployees[kMaxEmployees];
int mNextSlot;
int mNextEmployeeNumber;
};
}
#endif // DATABASE_H
// Database.cpp
#include <iostream>
#include <stdexcept>
#include "database.h"
using namespace std;
namespace Records {
Database::Database()
{
mNextSlot = 0;
mNextEmployeeNumber = kFirstEmployeeNumber;
}
Database::~Database()
{
}
Employee &Database::addEmployee(string inFirstName, string inLastName)
{
if (mNextSlot >= kMaxEmployees) {
cerr << "There is no more room to add the new employee!" << endl;
throw exception();
}
Employee &theEmployee = mEmployees[mNextSlot++];
theEmployee.setFirstName(inFirstName);
theEmployee.setLastName(inLastName);
theEmployee.setEmployeeNumber(mNextEmployeeNumber++);
theEmployee.hire();
return theEmployee;
}
Employee &Database::getEmployee(int inEmployeeNumber)
{
for (int i = 0; i < mNextSlot; i++) {
if (mEmployees[i].getEmployeeNumber() == inEmployeeNumber) {
return mEmployees[i];
}
}
cerr << "No empolyee with employee number " << inEmployeeNumber << endl;
throw exception();
}
Employee &Database::getEmployee(string inFirstName, string inLastName)
{
for (int i = 0; i < mNextSlot; i++) {
if (mEmployees[i].getFirstName() == inFirstName &&
mEmployees[i].getLastName() == inLastName) {
return mEmployees[i];
}
}
cerr << "No match with name " << inFirstName << " " << inLastName << endl;
}
void Database::displayAll()
{
for (int i = 0; i < mNextSlot; i++) {
mEmployees[i].display();
}
}
void Database::displayCurrent()
{
for (int i = 0; i < mNextSlot; i++) {
if (mEmployees[i].getIsHired()) {
mEmployees[i].display();
}
}
}
void Database::displayFormer()
{
for (int i = 0; i < mNextSlot; i++) {
if (!mEmployees[i].getIsHired()) {
mEmployees[i].display();
}
}
}
}
#include <iostream>
#include "database.h"
using namespace std;
using namespace Records;
int main(int argc, char *argv[])
{
Database myDB;
Employee &emp1 = myDB.addEmployee("Greg", "Wallis");
emp1.fire();
Employee &emp2 = myDB.addEmployee("Scott", "Kleper");
emp2.setSalary(100000);
Employee &emp3 = myDB.addEmployee("Nick", "Solter");
emp3.setSalary(10000);
emp3.promote();
cout << "all employee: " << endl;
cout << "current employee: " << endl;
cout << endl;
myDB.displayCurrent();
cout << endl;
cout << "former employee: " << endl;
cout << endl;
myDB.displayFormer();
}
output:
all employee:
current employee:
Employee: Kleper, Scott
-------------------------
Current Employee
Employee Nmber: 1001
Salary: $100000
Employee: Solter, Nick
-------------------------
Current Employee
Employee Nmber: 1002
Salary: $11000
former employee:
Employee: Wallis, Greg
-------------------------
Former Employee
Employee Nmber: 1000
Salary: $30000