您的位置:首页 > 编程语言 > C语言/C++

Professional C++ 01 A Crash Course in C++ 快速的C++基础知识复习

2017-02-27 23:12 826 查看
本章节主要是对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: $" <&
4000
lt; 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: