笨蛋学C++【C++基础第九弹】

C++基础第八弹

    • 5.C++模板
      • 函数模板
      • 类模板
    • 6.C++预处理器
      • #define 预处理
      • 参数宏
      • 条件编译
      • # 和 ## 运算符
      • C++ 中的预定义宏
    • 7.C++信号处理
      • signal() 函数
      • raise() 函数

5.C++模板

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

函数模板

  • 语法:

    template <typename type> 返回的数据类型 函数名(相关参数){函数部分代码
    }
    //声明函数模板
    template <typename T>
    void swap(T &a,T &b){T temp = a;a = b;b = temp;
    }//调用
    swap(10,20)
    swap<int>(a,b);
    
    //
    // Created by 16690 on 2024/4/22.
    //#include <iostream>using namespace std;template<typename T>
    inline T const &Max(T const &a, T const &b) {return a < b ? b : a;
    }int main(void) {int i =39;int j = 20;cout << "Max(i,j):" << Max(i, j) << endl;double f1 = 13.5;double f2 = 20.7;cout << "Max(f1,f2):" << Max(f1, f2) << endl;char c1 = 'a';char c2 = 'b';cout << "Max(c1,c2):" << Max(c1, c2) << endl;return 0;
    }
    

类模板

  • 语法

    template <class type> class 类名{类代码说明
    }
    
    #include <iostream>
    #include <vector>
    #include <cstdlib>
    #include <string>
    #include <stdexcept>using namespace std;template <class T>
    class Stack { private: vector<T> elems;     // 元素 public: void push(T const&);  // 入栈void pop();               // 出栈T top() const;            // 返回栈顶元素bool empty() const{       // 如果为空则返回真。return elems.empty(); } 
    }; template <class T>
    void Stack<T>::push (T const& elem) 
    { // 追加传入元素的副本elems.push_back(elem);    
    } template <class T>
    void Stack<T>::pop () 
    { if (elems.empty()) { throw out_of_range("Stack<>::pop(): empty stack"); }// 删除最后一个元素elems.pop_back();         
    } template <class T>
    T Stack<T>::top () const 
    { if (elems.empty()) { throw out_of_range("Stack<>::top(): empty stack"); }// 返回最后一个元素的副本 return elems.back();      
    } int main() 
    { try { Stack<int>         intStack;  // int 类型的栈 Stack<string> stringStack;    // string 类型的栈 // 操作 int 类型的栈 intStack.push(7); cout << intStack.top() <<endl; // 操作 string 类型的栈 stringStack.push("hello"); cout << stringStack.top() << std::endl; stringStack.pop(); stringStack.pop(); } catch (exception const& ex) { cerr << "Exception: " << ex.what() <<endl; return -1;} 
    }
    

6.C++预处理器

  • 预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理
  • 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。
  • 预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。

#define 预处理

  • #define 预处理指令用于创建符号常量,该符号常量通常称为

  • 语法:

    #define 常量名 常量值
    
    #include <iostream>
    using namespace std;#define PI 3.14159int main ()
    {cout << "Value of PI :" << PI << endl; return 0;
    }
    

参数宏

//
// Created by 16690 on 2024/4/22.
//#include <iostream>
using namespace std;#define MIN(a,b) (a<b ? a:b)
int main(void){int i,j;i=100;j=30;cout << "MIN(i,j) = " << MIN(i,j) << endl;return 0;
}

条件编译

  • 有几个指令可以用来有选择地对部分程序源代码进行编译

    #ifdef NULL#define NULL 0 
    #endif
    
    #ifdef DEBUGcerr << "Variable x = " << x <<endl;
    #endif
    
  • 如果在指令 #ifdef DEBUG 之前已经定义了符号常量 DEBUG,则会对程序中的 cerr 语句进行编译

    #if 0不进行编译的代码
    #endif
    
    #include <iostream>
    using namespace std;
    #define DEBUG#define MIN(a,b) (((a)<(b)) ? a : b)int main ()
    {int i, j;i = 100;j = 30;
    #ifdef DEBUGcerr <<"Trace: Inside main function" << endl;
    #endif#if 0/* 这是注释部分 */cout << MKSTR(HELLO C++) << endl;
    #endifcout <<"The minimum is " << MIN(i, j) << endl;#ifdef DEBUGcerr <<"Trace: Coming out of main function" << endl;
    #endifreturn 0;
    }
    

# 和 ## 运算符

  • # 运算符用于将宏的参数转换为一个字符串字面量

  • ## 运算符用于在预处理阶段将两个标记(tokens)连接为一个

//
// Created by 16690 on 2024/4/22.
//
#include <iostream>
#include <stdio.h>
using namespace std;#define STRING(x) #x #x #x
#define TEXT(x) "class"#x"Info"#define CONCAT(x, y) x ## yint main ()
{int abc = 100;cout << "STRING(abc)=" << STRING(abc) << endl;cout << "TEXT(x)=" << TEXT(abc) << endl;int xy =100;cout << CONCAT(x,y) << endl;//将cout << CONCAT(x,y) << endl;转为cout << xyint test = 222;cout << CONCAT(tes,t) << endl;return 0;
}

C++ 中的预定义宏

描述
LINE这会在程序编译时包含当前行号。
FILE这会在程序编译时包含当前文件名。
DATE这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。
TIME这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。
#include <iostream>
using namespace std;int main ()
{cout << "Value of __LINE__ : " << __LINE__ << endl;cout << "Value of __FILE__ : " << __FILE__ << endl;cout << "Value of __DATE__ : " << __DATE__ << endl;cout << "Value of __TIME__ : " << __TIME__ << endl;return 0;
}

7.C++信号处理

  • 信号是由操作系统传给进程的中断,会提早终止一个程序

    信号描述
    SIGABRT程序的异常终止,如调用 abort
    SIGFPE错误的算术运算,比如除以零或导致溢出的操作。
    SIGILL检测非法指令。
    SIGINT程序终止(interrupt)信号。
    SIGSEGV非法访问内存。
    SIGTERM发送到程序的终止请求。

signal() 函数

C++ 信号处理库提供了 signal 函数,用来捕获突发事件。以下是 signal() 函数的语法:

void (*signal (int sig, void (*func)(int)))(int); 

以下语法格式更容易理解:

signal(registered signal, signal handler)
  • 第一个参数是要设置的信号的标识符,第二个参数是指向信号处理函数的指针。
  • 函数返回值是一个指向先前信号处理函数的指针。如果先前没有设置信号处理函数,则返回值为 SIG_DFL。如果先前设置的信号处理函数为 SIG_IGN,则返回值为 SIG_IGN。‘
//
// Created by 16690 on 2024/4/23.
//
#include <iostream>
#include <csignal>
#include <unistd.h>
using namespace std;
void signalHandler(int signum){cout << "Interrupt signal (" << signum << ") received.\n";exit(signum);
}
int main(void){::signal(SIGINT,signalHandler);while(1){cout << "Going to sleep...." << endl;sleep(1);}return 0;
}

raise() 函数

  • 使用函数raise()生成信号,该函数带有一个整数信号编号作为参数

    int raise(signal sig);
    
    //
    // Created by 16690 on 2024/4/23.
    //
    #include <iostream>
    #include <csignal>
    #include <unistd.h>
    using namespace std;
    void signalHandler(int signum){cout << "Interrupt signal (" << signum << ") received.\n";exit(signum);
    }
    int main(void){signal(SIGINT,signalHandler);int i=0;while(++i){cout << "Going to sleep...." << endl;while(++i){raise(SIGINT);}sleep(1);}return 0;
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/831558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Linux][网络][传输层][UDP]详细讲解

目录 0.预备知识1.端口号的划分范围2.认识知名端口号3.netstat命令4.pidof 1.UDP协议端格式2.UDP特点3.面向数据报4.UDP的缓冲区5.UDP使用注意事项6.基于UDP的应用层协议 0.预备知识 1.端口号的划分范围 端口号的长度是16位&#xff0c;因此端口号的范围是0 ~ 65535 0 ~ 1023…

构建智能化商旅服务:酒店中台云服务架构设计与实践

随着商旅行业的不断发展和智能化趋势的兴起&#xff0c;酒店中台云服务成为了提升服务质量和效率的关键。本文将探讨酒店商旅中台云服务的架构设计与实现&#xff0c;介绍其关键特点和最佳实践&#xff0c;助力商旅行业迈向智能化未来。 1. **需求分析与场景设计&#xff1a;*…

ssm101珠宝首饰交易平台开发+jsp

珠宝首饰交易平台 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于珠宝首饰交易平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了珠宝首饰交易平台&#x…

开源博客项目Blog .NET Core源码学习(20:App.Hosting项目结构分析-8)

本文学习并分析App.Hosting项目中后台管理页面的个人资料页面、修改密码页面。 个人资料页面 个人资料页面用于显示和编辑个人信息&#xff0c;支持从本地上传个人头像。整个页面使用了layui中的表单、日期与时间选择、上传等样式或模块&#xff0c;通过layui.css文件设置样式…

Jenkins流水线部署springboot项目

文章目录 Jenkins流水线任务介绍Jenkins流水线任务构建Jenkins流水线任务Groovy脚本Jenkinsfile实现 Jenkins流水线任务实现参数化构建拉取Git代码构建代码制作自定义镜像并发布 Jenkins流水线任务介绍 之前采用Jenkins的自由风格构建的项目&#xff0c;每个步骤流程都要通过不…

字符串哈希-最易懂的证明

文章目录 题目题目解析&#xff1a;解题思路&#xff1a;具体算法为什么&#xff1f;举个例子再举个例子 代码&#xff1a; 题目 给定一个长度为 n的字符串&#xff0c;再给定 m个询问&#xff0c;每个询问包含四个整数 l1,r1,l2,r2&#xff0c;请你判断 [l1,r1]和 [l2,r2] 这两…

再学Java基础——反射

Java中的反射&#xff08;Reflection&#xff09;是一种强大的工具&#xff0c;它允许程序在运行时检查类、接口、字段和方法的信息&#xff0c;并且允许对这些对象进行实例化、调用等操作。这种能力使Java代码具有高度的动态性和灵活性。 反射的基本概念 反射提供了以下功能…

Baumer工业相机堡盟工业相机如何通过NEOAPISDK获取相机的Statistics图像传输统计信息(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPISDK获取相机的Statistics图像传输统计信息&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机NEOAPI SDK和相机Statistics图像传输统计信息的技术背景Baumer工业相机通过NEOAPISDK获取相机的Statistics图像传输统计信息技术1.引…

重看Spring聚焦BeanDefinition分析和构造

目录 一、对BeanDefinition的理解 &#xff08;一&#xff09;理解元信息 &#xff08;二&#xff09;BeanDefinition理解分析 二、BeanDefinition的结构设计分析 &#xff08;一&#xff09;整体结构体会 &#xff08;二&#xff09;重要接口和类分析 三、构造 BeanDef…

搭建MongoDB分片集群

文章目录 一、什么是分片二、分片集群1、组件构成2、分片集群内各组件间交互 三、数据如何切分四、分片策略1、哈希分片2、范围分片 五、分片集群架构六、搭建分片集群1、涉及主机2、所有主机安装MongoDB3、分片节点副本集的创建3.1、第一套副本集shard13.1.1、准备存放数据和日…

课时114:sed命令_进阶实践_高阶用法1

2.2.3 高阶用法1 学习目标 这一节&#xff0c;我们从 基础知识、缓存实践、小结 三个方面来学习。 基础知识 简介 对于sed命令来说&#xff0c;除了我们经常使用的模式空间之外&#xff0c;它还支持一个叫暂存空间(Hold Space)的模式,所谓的暂存空间&#xff0c;也就是说&a…

计算机网络期末试题

第一章 概述 一. 单选题&#xff08;共13题&#xff0c;36.4分&#xff09; 1. (单选题) 因特网起源于( &#xff09;网络。 A. ARPANETB. EthernetC. CATVD. CERNET 我的答案: A:ARPANET;正确答案: A:ARPANET; 2.8分 2. (单选题)人们把( &#xff09;年作为因特网的诞…

从零开始搭建一个vue项目

从零开始搭建一个vue项目 一、环境准备 1.1 安装node.js 选择合适的LTS版本&#xff0c;然后下载安装&#xff0c;安装地址&#xff1a;https://nodejs.org/en/download 在命令行中查看已安装的node.js版本 node -v v14.14.01.2 切换为淘宝的镜像源 解决国内下载慢的问题,…

(五)SQL系列练习题(上)创建、导入与查询 #CDA学习打卡

目录 一. 创建表 1&#xff09;创建课程表 2&#xff09;创建学生表 3&#xff09;创建教师表 4&#xff09;创建成绩表 二. 导入数据 1&#xff09;导入课程科目数据 2&#xff09;导入课程成绩数据 3&#xff09;导入学生信息数据 4&#xff09;导入教师信息数据 …

Mac OS 笔记

rvm、Ruby、gem、CocoaPods的安装与卸载 安装rvm curl -fsSL https://get.rvm.io | bash -s stable --ruby --autolibsenable --auto-dotfilesrvm -v # 查看版本安装脚本 /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install…

决策树算法

目录 决策树的应用决策树算法分类决策树算法开源实现决策树的使用 决策树是一种常用的数据挖掘方法&#xff0c;它是一种树形结构的算法&#xff0c;用于决策分析和预测。 决策树由节点和分支构成&#xff0c;其中节点分为内部节点和叶节点两种。内部节点表示一个特征或属性&a…

《金融研究》:普惠金融改革试验区DID工具变量数据(2012-2023年)

数据简介&#xff1a;本数据集包括普惠金融改革试验区和普惠金融服务乡村振兴改革试验区两类。 其中&#xff0c;河南兰考、浙江宁波、福建龙岩和宁德、江西赣州和吉安、陕西铜川五省七地为普惠金融改革试验区。山东临沂、浙江丽水、四川成都三地设立的是普惠金融服务乡村振兴…

【bbs02补】注册功能form组件-前端-后端-总结、登录功能(前端、后端、生成验证码)

1 注册功能 1.1 注册功能form组件 1.2 注册功能前端 1.3 注册功能后端 1.4 forms组件和前后端总结 2 登录功能 2.1 登录前端 2.2 生成验证码 1 注册功能 1.1 注册功能form组件 # 注册页面-用户名-密码-确认密码-邮箱-手机号-头像# form组件 可以帮助我们1 快速生成前端页面2 数…

Xamarin.Android项目显示Properties

在 Visual Studio 2022 中&#xff0c;如果您需要调出“Properties”&#xff08;属性&#xff09;窗口&#xff0c;您可以使用以下几种方法&#xff1a; 快捷键&#xff1a; 您可以按 F4 快速打开当前选择项的“Properties”窗口。

pytorch笔记:ReplicationPad1d

torch.nn.ReplicationPad1d(padding) 在 PyTorch 中&#xff0c;ReplicationPad1d 是一种用于一维数据的填充层该层通过复制序列的边缘值来增加数据的长度&#xff0c;这在卷积神经网络中常用于保持数据尺寸主要参数 padding 可以是一个整数或一个元组。 如果是一个整数&…