Cpp 异常处理
C++提供了一套复杂的异常处理机制,虽然很多第三方库都禁止使用异常,但是至少在标准库中广泛采用了异常机制, 因此学习一下相关的语法是有必要的,至于在编程实践中是否采用异常,仍然是值得讨论的。 简单示例 从一个简单的例子开始,这里调用的函数processInput对于非法的输入参数会抛出异常,在main函数中调用时使用try-catch语句块捕获异常进行处理。 123456789101112131415161718192021222324252627#include <iostream>#include <stdexcept>void processInput(int value) { if (value == 0) { throw std::invalid_argument("Input cannot be zero!"); } if (value < 0) { throw std::out_of_range("Input cannot be...
Cpp和Python相互调用
记录一下在Cpp程序和Python脚本中相互调用的方法。 Cpp调用Python 在C++程序中调用Python解释器,包括执行简单Python语句(字符串形式),以及执行整个py脚本(文件形式)。 执行简单命令 最简单的例子:调用Python解释器,输出HelloWorld,C++源文件如下 main.cpp12345678910111213141516#ifdef _DEBUG#undef _DEBUG#include <Python.h>#define _DEBUG 1#else#include <Python.h>#endifint main() { Py_Initialize(); PyRun_SimpleString("print('Hello, world! (from Python)')"); Py_Finalize(); return...
C/Cpp 输出语句的变迁
C语言 printf 这是C语言提供的输出语句,示例如下 1234567#include <stdio.h>int main() { int number = 42; printf("The answer is %d.\n", number); return 0;} printf支持不定参数,占位符采用%d等,常见类型的占位符如下: %c:字符 %s:字符串 %d或%i:(十进制)int %ld:(十进制)`long int`` %lld:(十进制)long long int %u:(十进制)unsigned...
C语言 结构体笔记
关于C语言中的结构体的语法,这是C++自定义类型的基础。 C++的类提供了非常丰富的功能,但是也会尽量兼容C语言的结构体。 简单示例 下面是针对学生信息的结构体的使用示例,包括了结构体对象的定义和读写,以及通过指针传递给函数。 123456789101112131415161718192021222324252627282930313233343536373839#include <stdio.h>#include <string.h>struct Person { char name[50]; int age; double height;};void show(struct Person *person) { printf("Name: %s\n", person->name); printf("Age: %d\n", person->age); printf("Height: %.2f\n",...
Cpp new/delete 语句
new和delete是C++中最基础且重要的申请和释放堆内存的语法,以它为线索可以引出C++堆内存管理的相关内容,它也是智能指针所需要的基础知识,值得整理一下。 基本使用 内置类型 new和delete最基础的用法是被设计用来替代C语言中的malloc和free的,分配堆内存来构造指定类型的对象,返回对应类型的指针,例如 12int *p = new int; // uninitializeddelete p; 这两个语句都是非常危险的: 最简单的new语句对内置数据类型不会对内存进行初始化,我们得到值是随机的;(Debug模式下可能内存被清空,改成Release模式可以看到随机值) delete语句不会在释放内存之后将指针置空,指针会变成空悬指针。 我们可以用下面的new语句进行初始化 12345double *p1 = new double; // uninitializeddouble *p2 = new double(); // 0double *p3 = new double{}; // 0double *p4 =...
Cpp 显式加载动态库
在 C++ 中,加载动态库通常有两种方式:显式加载和隐式加载。 隐式加载比较简单,只需要设置链接选项即可自动进行,本文主要学习一下显式加载。 概述 在 C++...
Cpp 奇异递归模板模式 CRTP
CRTP 是一个非常经典的C++静态多态实现方案,在很多库中都有应用,这里整理一下。 概述 奇异递归模板模式(Curiously Recurring Template Pattern, CRTP)是...
Cpp static+extern+inline 学习笔记
整理一下关于C++中的几个关键词(static,extern和inline)的笔记。 static static这个关键词的语义非常复杂,在C语言中本来就有多重语义,C++又添加了额外的语义。 静态函数 默认情况下,函数可以被其它编译单元使用,具有外部链接性,可以使用static将其改为具有内部链接性的静态函数,只有在当前文件中才可以使用此函数。 例如 123static void func();void func(){} 静态全局变量 与静态函数类似,全局变量在默认情况下可以被其它编译单元所使用,具有外部链接性, 可以使用static将其改为静态全局变量,只有在当前文件中才可以使用。 例如 1static int s = 100; 静态局部变量 在函数体内部使用static修饰的局部变量会变成静态局部变量,此时静态的语义不再是对外部不可见,而是延长生命周期,此时变量的存储位置从栈区转移到了数据区,不会因为函数调用的结束而销毁,下次进入函数体时会自动忽略定义和初始化语句,例如 12345int func(){ static int s =...