一、 基本语法
1. 基本数据类型
|类型|32位系统|64位系统| |—|—:|:—:| |bool|1|1| |char|1|1| |unsigned char|1|1| |short|2|2| |unsigned short|2|2| |int|4|4| |unsigned int|4|4| |long|4|8| |unsigned long|4|8| |long long|8|8| |float|4|4| |double|8|8| |long double|16|16| |*(地址)|4|8|
2. 匿名函数–lambda 函数
3. 随机数
#include <iostream>
#include <ctime>
using namespace std;
int main() {
srand((unsigned)time(NULL));
for(int i=0;i<10;i++)
{
cout << rand() << endl;
}
}
4. 数组
int arr[10];
int arr2[] = {1,2,3};
5. 字符串
//1. c 风格 char数组
//2. string 类
6. 引用 & 指针
- 引用必须连接到一块合法的内存
- 不能变更引用。 指针可以变更指向的对象
- 引用在创建时必须初始化
7. 日期 & 时间
需要引入<ctime>
库文件
二、面向对象
1. 定义
#include <iostream>
using namespace std;
class Line
{
public:
static int objectCount; //static关键字
void setLength( double len );
double getLength( void );
static int getCount()
{
return objectCount; //静态成员函数只能访问静态成员变量,没有this指针
}
Line(); // 这是构造函数声明
Line( const Line &obj); // 拷贝构造函数
~Line(); // 这是析构函数声明
private:
double length;
};
// 成员函数定义,包括构造函数
Line::Line(void)
{
objectCount++;
cout << "Object is being created" << endl;
}
Line::~Line(void)
{
cout << "Object is being deleted" << endl;
}
void Line::setLength( double len )
{
length = len;
}
double Line::getLength( void )
{
return length;
}
int Line::objectCount = 0; //静态成员变量初始化
2. 继承
#include <iostream>
using namespace std;
// 基类 Shape
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// 基类 PaintCost
class PaintCost
{
public:
int getCost(int area)
{
return area * 70;
}
};
// 派生类
class Rectangle: public Shape, public PaintCost
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
// 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl;
// 输出总花费
cout << "Total paint cost: $" << Rect.getCost(area) << endl;
return 0;
}
3. 重载
//函数重载
class printData
{
public:
void print(int i) {
cout << "整数为: " << i << endl;
}
void print(double f) {
cout << "浮点数为: " << f << endl;
}
void print(char c[]) {
cout << "字符串为: " << c << endl;
}
};
//运算符重载
class Box
{
public:
double getVolume(void)
{
return length * breadth * height;
}
void setLength( double len )
{
length = len;
}
void setBreadth( double bre )
{
breadth = bre;
}
void setHeight( double hei )
{
height = hei;
}
// 重载 + 运算符,用于把两个 Box 对象相加
Box operator+(const Box& b)
{
Box box;
box.length = this->length + b.length;
box.breadth = this->breadth + b.breadth;
box.height = this->height + b.height;
return box;
}
private:
double length; // 长度
double breadth; // 宽度
double height; // 高度
};
4. 多态、抽象类
#include <iostream>
using namespace std;
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
virtual int area() = 0; //父类定义为纯虚函数,否则调用父类的方法, 至少有一个纯虚函数,则称此类为抽象类
};
class Rectangle: public Shape{
public:
Rectangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{
cout << "Triangle class area :" <<endl;
return (width * height / 2);
}
};
// 程序的主函数
int main( )
{
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
// 存储矩形的地址
shape = &rec;
// 调用矩形的求面积函数 area
shape->area();
// 存储三角形的地址
shape = &tri;
// 调用三角形的求面积函数 area
shape->area();
return 0;
}
三、高级内容
1. 文件和流
写文件:ofstream 读文件:ifstream
#include <fstream>
#include <iostream>
using namespace std;
int main ()
{
char data[100];
// 以写模式打开文件
ofstream outfile;
outfile.open("afile.dat");
cout << "Writing to the file" << endl;
cout << "Enter your name: ";
cin.getline(data, 100);
// 向文件写入用户输入的数据
outfile << data << endl;
cout << "Enter your age: ";
cin >> data;
cin.ignore();
// 再次向文件写入用户输入的数据
outfile << data << endl;
// 关闭打开的文件
outfile.close();
// 以读模式打开文件
ifstream infile;
infile.open("afile.dat");
cout << "Reading from the file" << endl;
infile >> data;
// 在屏幕上写入数据
cout << data << endl;
// 再次从文件读取数据,并显示它
infile >> data;
cout << data << endl;
// 关闭打开的文件
infile.close();
return 0;
}
2. 异常处理
#include <iostream>
using namespace std;
double division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!";
}
return (a/b);
}
int main ()
{
int x = 50;
int y = 0;
double z = 0;
try {
z = division(x, y);
cout << z << endl;
}catch (const char* msg) {
cerr << msg << endl;
}
return 0;
}
3. 动态内存
char* pvalue = NULL; // 初始化为 null 的指针
pvalue = new char[20]; // 为变量请求内存
delete [] pvalue;
4. 命名空间
定义的一个范围, 它可作为附加信息来区分不同库中相同名称的函数、类、变量等
5. 模板
5.1 函数模板
template <typename T> //or class
void display(T a)
{
cout << a << endl;
}
5.2 类模板
template <typename T>
class Stack {
private:
vector<T> elems;
public:
void push(T const&);
void pop();
T top() const;
bool empty() const {
return elems.empty();
}
}
template <typename T>
void Stack<T>::push(T const& elem) {
elems.push_back(elem);
}
6. 预处理器
6.1 参数宏
#define Max(a,b) a>b?a:b
6.2 条件编译
#ifdef DEBUG
cerr <<"Variable x = " << x << endl;
#endif
7. 信号
#include <iostream>
#include <csignal>
#include <unistd.h>
using namespace std;
void signalHandler( int signum )
{
cout << "Interrupt signal (" << signum << ") received.\n";
// 清理并关闭
// 终止程序
exit(signum);
}
int main ()
{
int i = 0;
// 注册信号 SIGINT 和信号处理程序
signal(SIGINT, signalHandler);
while(++i){
cout << "Going to sleep...." << endl;
if( i == 3 ){
raise( SIGINT); //SIGABRT、SIGFPE、SIGTERM、SIGSEGV
}
sleep(1);
}
return 0;
}
8. 线程
#include <iostream>
#include <pthread.h>
using namespace std;
#defind NUM_THREAD 5
void say_hello(void* args)
{
cout << "Hello World!" << endl;
return 0;
}
int main()
{
//存线程id的变量
pthread_t tids[NUM_THREAD];
for(int i=0; i<NUM_THREADS;++i)
{
//参数依次是:创建的线程id,线程参数,调用的函数,传入的函数参数
int iRet = pthread_create(&tids[i], NULL, say_hello, NULL);
if(iRet!=0)
{
cout << "pthread_create error: error_code=" << ret << endl;
}
}
//等各个线程退出后,进程才结束,否则进程强制结束了,线程可能还没反应过来;
pthread_exit(NULL);
}