c++基础

Posted by jabin on January 21, 2019

一、 基本语法

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. 引用 & 指针

  1. 引用必须连接到一块合法的内存
  2. 不能变更引用。 指针可以变更指向的对象
  3. 引用在创建时必须初始化

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);
}