C++ 补充教程

C++ 文件和流

iostream 标准库:它提供了 cincout 方法分别用于从标准输入读取流和向标准输出写入流。

fstream 标准库:从文件读取流和向文件写入流。定义了三个新的数据类型:
在这里插入图片描述

  • 打开文件:void open(const char *filename, ios::openmode mode); 在从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstreamfstream 对象都可以用来打开文件进行写操作,如果只需要打开文件进行读操作,则使用 ifstream 对象。

    ofstream outfile;
    outfile.open("file.dat", ios::out | ios::trunc );
    
  • 关闭文件:void close();

  • 写入文件:ofstreamObj <<

  • 读取文件:ifstreamObj >>

  • 文件位置指针:seekgseekp 的参数通常是一个长整型,第二个参数可以用于指定查找方向。查找方向可以是 ios::beg(默认的,从流的开头开始定位),也可以是 ios::cur(从流的当前位置开始定位),也可以是 ios::end(从流的末尾开始定位)。

异常处理

  • trycatch 关键字:捕获异常

  • throw 关键字:抛出异常

    #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;
    }
    
  • std::exception 类:定义新的异常

动态内存

  • 栈:在函数内部声明的所有变量都将占用栈内存。
  • 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。

您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。

  • new 运算符:为给定类型的变量在运行时分配堆内的内存,返回所分配的空间地址。

  • delete 运算符:删除之前由 new 运算符分配的内存。

    int *p = new int[10];  //分配10个int型的内存空间
    delete[] p;
    
    int *p = new int;  //分配1个int型的内存空间
    delete p;  //释放内存
    

    new 也是在堆区分配内存,必须手动释放,否则只能等到程序运行结束由操作系统回收。为了避免内存泄露,通常 new 和 delete、new[] 和 delete[] 操作符应该成对出现。
    内存泄漏:程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。

命名空间

命名空间:作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。

  • namespace 定义命名空间:namespace namespace_name { // 代码声明},命名空间可以嵌套。
  • 调用命名空间成员:name::code; // code 可以是变量或函数
  • using namespace 指令:using namespace namespace_name; using 指令也可以用来指定命名空间中的特定项目,如using std::cout;

模板

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

模板是创建泛型类或函数的蓝图或公式,可以使用模板来定义函数和类。

  • 函数模板:template <typename type> ret-type func-name(parameter list) { // 函数的主体 }
template <typename T>
inline T const& Max (T const& a, T const& b) 
{ 
    return a < b ? b:a; 
} 
  • 类模板:template <class type> class class-name { . . . }

预处理

  • #define 预处理:#define macro-name replacement-text 创建符号常量,称为。当这一行代码出现在一个文件中时,在该文件中后续出现的所有宏都将会在程序编译之前被替换为 replacement-text。

  • 参数宏: #define MIN(a,b) (a<b ? a : b)

  • 条件编译:

    #ifdef NULL
       #define NULL 0
    #endif
    
  • ###运算符:# 运算符会把 replacement-text 令牌转换为用引号引起来的字符串。## 运算符用于连接两个令牌。

信号处理

  • void (*signal (int sig, void (*func)(int)))(int);:捕获突发事件,调用格式 signal(registered signal, signal handler)
  • int raise (signal sig);:生成信号,sig 是要发送的信号的编号,这些信号包括:SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP
    int main ()
    {
        int i = 0;
        // 注册信号 SIGINT 和信号处理程序
        signal(SIGINT, signalHandler);  
     
        while(++i){
           cout << "Going to sleep...." << endl;
           if( i == 3 ){
              raise( SIGINT);
           }
           sleep(1);
        }
     
        return 0;
    }
    

多线程

Web编程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值