
C/C++
文章平均质量分 82
C语言,C++语言
天山老妖
多年私募基金量化IT工程师从业经验,专注于Linux/C++、Qt、Python、量化IT技术,具有丰富的中频、高频量化交易系统开发和实盘交易运维经验,熟悉CTP、盛立REM、易达YD、Xele期货柜台API,宽睿OES、华鑫Tora、中泰XTP股票柜台API。
QuantFabric开源:https://github.com/QuantFabric
展开
-
CRTP静态多态
CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)是C++的一种设计模式,特点是利用模板和继承,在基类关联派生类模板参数,来实现静态多态性,不需要使用虚函数实现多态特性。定义一个模板基类Shape,接收一个派生类作为模板参数。public:Shape基类中,area方法内部调用了派生类的computeArea方法,用static_cast可以确保在编译时进行类型检查。定义两个派生类Circle和Rectangle。原创 2024-10-28 08:43:54 · 342 阅读 · 0 评论 -
C++11智能指针
weak_ptr指针通常不单独使用,只能和shared_ptr类型指针搭配使用。std::weak_ptr是C++11引入的一个不拥有所有权的智能指针,与std::shared_ptr配合使用,主要用于解决循环引用问题、观察std::shared_ptr对象而不影响引用计数,以及在需要时提供对底层资源的访问。shared_ptr的类型转换应该使用专门用于shared_ptr类型转换的接口,如果使用一般的static_cast进行的转换将会导致转换后的指针无法再被shared_ptr对象正确管理。原创 2024-02-29 16:49:35 · 1108 阅读 · 0 评论 -
Hello C++(二十)——自定义内存管理
一、统计类对象中成员变量的访问次数mutable是为了突破const函数的限制而设计的,mutable修饰的成员变量将永远处于可改变的状态。mutable成员变量破坏了只读对象的内部状态,而const成员函数保证只读对象的状态不变性,因此mutable成员变量无法保证只读对象状态的不变性。#include<iostream>usingnamespacestd;classTest{public:Test():m_count(0){}...原创 2022-02-23 12:39:46 · 385 阅读 · 0 评论 -
Hello C++(十九)——C++类型识别
一、C++类型识别简介1、C++类型识别简介C++是静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改。C++语言中,静态类型是对象自身的类型,动态类型是指针(引用)所指向对象的实际类型。RTTI(Run-Time Type Information)即运行时类型识别,C++通过RTTI实现对多态的支持。为了支持RTTI,C++提供了一个type_info类和typeid与dynamic_cast两个关键字。2、type_info结构体type_info : 存储特点类原创 2022-02-23 12:39:33 · 2832 阅读 · 0 评论 -
Hello C++(十八)——异常处理
一、C语言异常处理异常是指程序在运行过程中产生可预料的执行分支。如除0操作,数组访问越界、要打开的文件不存在。Bug是指程序中的错误,是不被预期的运行方式。如野指针、堆空间使用结束未释放。C语言中处理异常的方式一般是使用if....else...分支语句。doubledivide(doublea,doubleb){constdoubledelta=0.000000000000001;doubleret=0;if(!((-delta...原创 2022-02-23 12:39:18 · 517 阅读 · 0 评论 -
Hello C++(十七)——模板
一、模板简介泛型(Generic Programming)即是指具有在多种数据类型上皆可操作的含意。 泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。泛型编程最初诞生于C++中,目的是为了实现C++的STL(标准模板库)。其语言支持机制就是模板(Templates)。二、函数模板1、宏实现交换函数定义一个交换两个数的宏#defineSWAP(t,a,b)\do\{...原创 2022-02-23 12:38:59 · 769 阅读 · 0 评论 -
Hello C++(十六)——多继承
一、多继承简介1、多继承简介C++语言支持多继承,一个子类可以有多个父类,子类拥有所有父类的成员变量,子类继承所有父类的成员函数,子类对象可以当作任意父类对象使用。2、多继承语法规则classDerived:publicBaseA, publicBaseB, publicBaseC{};3、多继承派生类的内存布局通过多重继承得到的派生类对象可能具有不同的地址。#include<iostream>usingnamespaces...原创 2022-02-23 12:37:37 · 6381 阅读 · 1 评论 -
Hello C++(十五)——C++抽象类与接口
一、抽象类与接口1、抽象类简介面向对象的抽象类用于表示现实世界的抽象概念,是一种只能定义类型,不能产生对象的类(不能实例化),只能被继承并被重写相关函数,直接特征是相关函数没有完整实现。C++语言没有抽象类的概念,通过纯虚函数实现抽象类。纯虚函数是指定义原型的成员函数,C++中类如果存在纯虚函数就成为了抽象类。抽象类只能用作父类被继承,子类必须实现父类纯虚函数的具体功能,如果子类没实现纯虚函数,子类也为抽象类。抽象类不可以定义对象,但是可以定义指针,指针指向子类对象,当子类中实现了纯虚函原创 2022-02-23 12:36:15 · 336 阅读 · 0 评论 -
Hello C++(十四)——C++类成员函数调用分析
一、C++类成员函数1、C++类成员函数的编译C++中的函数在编译时会根据命名空间、类、参数签名等信息进行重新命名,形成新的函数名。函数重命名的过程通过一个特殊的Name Mangling(名字编码)算法来实现。Name Mangling算法是一种可逆的算法,既可以通过现有函数名计算出新函数名,也可以通过新函数名逆向推导出原有函数名。Name Mangling算法可以确保新函数名的唯一性,只要命名空间、所属的类、参数签名等有一个不同,那么产生的新函数名也不同。不同的编译器有不同的Name M.原创 2022-02-23 12:35:54 · 10901 阅读 · 0 评论 -
Hello C++(十三)——C++对象模型分析
一、C++对象模型分析1、类对象模型的内存布局class是一种特殊的struct,class与struct遵循相同的内存对齐原则,class中的成员函数与成员变量是分开存放的,每个对象拥有独立的成员变量,所有的对象共享类中的成员函数。运行时,类对象退化为结构体的形式:A、所有成员变量在内存中依次排布B、由于内存对齐的存在,成员变量间可能存在内存间隙C、可以通过内存地址访问成员变量D、访问权限关键字在运行时失效#include<iostream>usingn..原创 2022-02-23 12:35:08 · 293 阅读 · 0 评论 -
Hello C++(十二)——C++语言常见函数调用约定
一、C++语言函数调用约定简介C /C++开发中,程序编译没有问题,但链接的时候报告函数不存在,或程序编译和链接都没有错误,但只要调用库中的函数就会出现堆栈异常等现象。上述现象出现在C和C++的代码混合使用的情况下或在C++程序中使用第三方库(非C++语言开发)的情况下,原因是函数调用约定(Calling Convention)和函数名修饰(Decorated Name)规则导致的。函数调用约定决定函数参数入栈的顺序,以及由调用者函数还是被调用函数负责清除栈中的参数等问题,而函数名修饰规则决定编译器使用原创 2022-02-23 12:33:39 · 435 阅读 · 0 评论 -
Hello C++(十一)——多态
一、多态简介C++中的多态(polymorphism)是指由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻系统升级,维护,调试的工作量和复杂度。多态是一种不同层次分类下的重要联系,是一种跨层操作。二、多态实现的前提赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。赋值兼容是一种默认行为,不需要任何的显式的转化步骤,只能发生在public继承方式中,是多态实现的前提条件。赋值兼容规原创 2022-02-23 12:33:09 · 275 阅读 · 0 评论 -
Hello C++(十)——继承与派生
一、类之间的关系1、类之间的组合关系组合关系是整体与部分的关系。组合关系的特点:A、将其它类的对象作为当前类的成员使用B、当前类的对象与成员对象的生命周期相同C、成员对象在用法上与普通对象相同Computer类由其它多个部件类组合而成,当Computer销毁时,其它部件对象同时销毁。#include<iostream>usingnamespacestd;classMemory{public:Memory(){...原创 2022-02-22 11:06:01 · 306 阅读 · 0 评论 -
Hello C++(九)——C++标准库简介
一、C++标准库简介1、C++标准库简介C++标准库(C++ Standard Library),是类库和函数的集合。C++编译器厂商根据C++标准委员会官方的ISO规范并将其转化为代码。C++编译器厂商在实现C++标准库过程中必须依赖其不同操作系统所提供的系统调用接口,因此每个平台都有其自己的C++标准库实现。C++标准库的特点如下:A、C++标准库不是C++语言标准的一部分,由类库和函数库组成。B、C++标准库中定义的类和对象都位于std命名空间中。C、C++标准库的头文件.原创 2022-02-22 11:05:48 · 2500 阅读 · 0 评论 -
Hello C++(八)——操作符重载
一、操作符重载基础1、操作符重载的语法通过operator关键字可以定义特殊的函数,operator本质是通过函数重载操作符。Typeoperatoroperatorname(constTypep1,constTypep2){Typeret;returnret;}2、友元函数重载操作符可以将操作符重载函数声明为友元函数。#include<iostream>usingnamespacestd;classCompl...原创 2022-02-22 11:05:33 · 1765 阅读 · 0 评论 -
Hello C++(七)——友元
一、友元简介1、友元简介面向对象编程的类的设计机制实现了数据的隐藏与封装,类的成员变量一般定义为私有成员,成员函数一般定义为公有的,是类与外部的通信接口。在实践中,类外的某些函数需要频繁地访问类的成员变量,可以将类外的函数定义为类的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但友元破坏了类的封装性和隐藏性,使得非类的成员函数可以访问类的私有成员。友元是C++语言中的一种关系,友元关系发生在函数与类之间或者原创 2022-02-22 11:04:44 · 2073 阅读 · 0 评论 -
Hello C++(六)——二阶构造模式
一、构造函数的问题构造函数存在的问题:A、构造函数只提供自动初始化成员变量的机会B、不能保证初始化逻辑一定成功,如申请系统资源可能失败C、执行return语句后构造函数立即结束构造函数创建的对象可能是半成品对象,半成品对象是合法的对象,但是程序bug的来源之一。因此实际工程开发过程中使用二阶构造模式。二、二阶构造模式1、二阶构造模式简介由于构造函数存在的潜在问题,实际工程开发中类对象的构造过程如下:A、资源无关的初始化操作资源无关的初始化操作一般不会出现异常的情况原创 2022-02-22 11:04:20 · 284 阅读 · 0 评论 -
Hello C++(五)——C++语言中的CV限定符错误
一、CV限定符错误简介1、CV限定符简介CV限定符即cv-qualifier,C++语言中指const和volatile限定符。通常,C++语言中有两种情况不能使用CV限定符进行限定:A、非成员函数不能使用CV限定B、静态成员函数不能使用CV限定2、CV限定符错误信息简介C++语言中CV限定符错误信息如“cannot have cv-qualifier”,常见的CV限定符错误信息如下:A、非成员函数的CV限定符错误信息error: non-member function原创 2022-02-22 11:03:38 · 1643 阅读 · 1 评论 -
Hello C++(四)——类与对象
一、构造函数(constructor)1、构造函数简介C++语言中,构造函数是与类名相同的特殊成员函数。在类对象创建时,自动调用构造函数,完成类对象的初始化。类对象本身是变量,在栈、堆上创建的对象,对象的成员初始化为随机值;在静态存储区创建的对象,对象的成员初始化为0。2、构造函数的定义构造函数声明的语法如下:classname(parameters);没有参数的构造函数称为无参构造函数。当类中没有定义构造函数(包括拷贝构造函数)时,编译器默认提供一个无参构造函数,并且其函数体为原创 2022-02-22 11:03:23 · 354 阅读 · 0 评论 -
Hello C++(三)——封装(Encapsulation)
一、封装简介C语言等面向过程编程中,数据以及数据的相关操作函数都是分离的独立个体;在C++等面向对象编程中,数据以及数据的相关操作被设计为对象,对象包括属性(数据)和操作(函数),两者共同构成对象实体(即类实体)。面向对象编程使程序更模块化,更易读易写,提升了代码重用到一个更高的层次。面向对象编程中,数据和数据的操作封装为了对象。封装可以隐藏实现细节,使得代码模块化,是把过程和数据包围起来,对数据的访问只能通过已定义的接口。封装是一种对外提供服务的模型,封装模型是对世间万物的个体抽象。封装的原创 2022-02-22 11:03:05 · 1129 阅读 · 0 评论 -
Hello C++(二)——C++对C语言基础语法的扩展
C++是基于C语言扩展发展而来的面向对象的程序设计语言,本文将主要讨论C++语言基于C语言扩展的方面。一、实用性增强C语言中变量的定义必须在作用域开始的位置进行定义。#include<stdio.h>intmain(intargc,char*argv[]){inti;//定义变量intj;//使用变量for(i=0;i<10;i++){for(j=0;j<...原创 2022-02-22 11:02:38 · 1544 阅读 · 1 评论 -
Hello C++(一)——C++简介
一、C++简介C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言并不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming)思想,支持面向对象的程序设计语言应运而生。Smalltalk是当时问世的一种面向对象的语言。在实践工作中,由于C语言的广泛使用,在C语言的基础上根据面向对象的思想发展了C语言,形成了Cwith class (带类的C语言)。1982年,美国AT.原创 2022-02-22 11:02:11 · 398 阅读 · 0 评论 -
Hello C(十三)——双链表
一、双链表简介1、双链表的结构双链表是链表的一种,由节点组成,每个数据结点中都有两个指针,分别指向直接后继和直接前驱。2、双链表的节点typedef struct data{ unsigned int id;//学生身份ID char name[LENGTH];//学生姓名 char subject[LENGTH];//科目 unsigned int score;//分数}DATA,*PDATA;typedef struct node{原创 2022-02-22 00:29:58 · 634 阅读 · 0 评论 -
Hello C(十二)——单链表
一、单链表简介1、单链表的结构单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以节点来表示的,每个节点由两部分构成:一个是数据域,存储数据值,另一个是指针域,存储指向下一个节点的指针。2、单链表的节点单链表节点的数据结构如下:typedef struct data{ unsigned int id;//学生身份ID char name[LENGTH];//学生姓名 char subject[LENG原创 2022-02-22 00:29:43 · 203 阅读 · 0 评论 -
Hello C(十一)——静态库函数和动态库函数
一、静态链接库静态链接库是obj文件的一个集合,通常静态链接库以".a"为后缀,名字格式一般为libxxx.a,由程序ar生成。静态链接库是在程序编译过程中链接的,已经将调用的相关函数拷贝到程序内部,程序运行时和静态链接库已经没有任何关系。1、静态链接库的创建A、编写源码库文件源码库文件一般包含.c和.h文件,hello.c文件:#include <stdio.h>void display(void){printf("hello world\n");...原创 2022-02-22 00:29:24 · 606 阅读 · 0 评论 -
Hello C(十)——C语言的安全问题和指针陷阱
C语言是灵活度和自由度较大的编程语言,作为C语言核心的指针更是让C语言程序员可以越过安全的栅栏,对某些内存区域进行破坏性访问,引发安全风险。很多安全问题都能追根溯源到指针的误用。本文将从指针的角度解读C语言常见的安全问题和指针陷阱。一、指针的声明和初始化1、不恰当的指针声明int* ptr1, ptr2;//声明ptr1为int指针,ptr2为整型int *ptr1, *ptr2;//ptr1,ptr2都声明为指针#define PINT int *PINT ptr1, ptr..原创 2022-02-22 00:29:01 · 1372 阅读 · 0 评论 -
Hello C(九)——存储类型、作用域、生命周期、链接属性
一、存储类型C语言中,每个变量和函数都有两个属性:数据类型和数据的存储类型。变量的存储类型是指存储变量值的内存类型。变量的存储类型决定变量何时创建、何时销毁以及它的值将保持多久。计算机中有三个地方可以用于存储变量:普通内存,运行时堆和栈,硬件寄存器。变量的存储类型取决于声明变量的位置。C语言存储类别说明符: 说明符 用 法 auto 只在代码块内变量声明中被允许, 表示变量具有本地生存期 exte...原创 2022-02-22 00:28:40 · 4581 阅读 · 0 评论 -
Hello C(八)——内存字节对齐
一、内存字节对齐简介1、内存字节对齐计算机中内存空间都是按照字节划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但是在程序实际编译过程中,编译器会对数据类型在编译过程中进行优化对齐,编译器会将各种类型数据按照一定的规则在空间上排列,而不是顺序的排放,这就是内存字节对齐。2、内存字节对齐原因不同硬件平台对存储空间的处理是不同的。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如某些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对原创 2022-02-22 00:27:47 · 1527 阅读 · 0 评论 -
Hello C(七)——结构体
一、结构体简介1、结构体定义结构体定义一般有两种方法较为常用:第一种方法:struct person{ char *name; unisgned int age;};第二种方法:typedef struct person{ char *name; unsigned int age;}Person;person实例声明如下:Person person;//声明一个person对象Person *ptrPerson =..原创 2022-02-21 11:08:36 · 408 阅读 · 0 评论 -
Hello C(六)——指针与字符串
一、字符串简介1、字符串声明C语言中没有字符串概念,通过特殊的字符数组模拟字符串,C语言中的字符串是’\0’结尾的字符数组。声明字符串的方式有三种:字面量、字符数组、字符指针。字符串字面量是用双引号引起来的字符序列,本质是存储于程序全局只读存储区的字符数组,常用来进行初始化,位于字符串字面量池中,字符字面量是用单引号引起来的字符。编译器会自动在字符串字面量添加’\0’结束符。字符串字面量池是程序分配的一块内存区域,用来保存组成字符串的字符序列。现代编译器中如GCC会对字符串字面量进行优化原创 2022-02-21 11:07:22 · 208 阅读 · 0 评论 -
Hello C(五)——指针与数组
数组是C语言内建的数据结构,彻底理解数组及其用法是开发高效应用程序的基础。数组和指针紧密关联,但又不是完全可以互换。一、数组简介数组是能用索引访问的同种类型元素的连续集合。数组的元素在内存中是相邻的,中间不存在空隙,数组的元素是相同类型的。1、数组的解读数组的定义:int a[10] = {0,1,2,3,4,5};a[0]:数组的第一个元素,首元素(做左值时表示第0个元素的内存空间)&a:数组的地址,是常量,不能做左值,类型等同int (*)[10](数组指针)。&..原创 2022-02-21 11:05:34 · 214 阅读 · 0 评论 -
Hello C(四)——指针与函数
指针对函数的功能有巨大的贡献,指针能够将数据传递给函数,并且允许函数对数据进行修改。指针对于函数的作用主要有两方面:将指针传递给函数和声明函数指针。一、程序的栈和堆程序的栈和堆是C语言程序运行的运行时元素。1、程序栈程序栈是支持函数执行的内存区域,通常和堆共享一块内存区域,通常程序栈占据内存区域的下部,堆用内存区域的上部。程序栈存放栈帧,栈帧存放函数参数和局部变量。调用函数时,函数的栈帧被推倒栈上,栈向上长出一个栈帧,当函数终止时,函数的栈帧从程序栈上弹出,栈帧所使用的内存不会被清理,但..原创 2022-02-21 11:04:10 · 322 阅读 · 0 评论 -
Hello C(三)——指针
指针是C语言中广泛使用的一种数据类型,是C语言的灵魂。指针提供了动态操控内存的机制,强化了对数据结构的支持,而且实现了访问硬件的功能。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。一、指针的概念在计算机中,所有的数据都是存放在内存中的,一般把内存中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不一样,如int占用4个字节,char占用1个字节。为了正确地访问内存单元,必须为每个内存单元编上号。每个内存单元的编号是唯一的,根据编号可以准确地..原创 2022-02-21 10:59:27 · 334 阅读 · 0 评论 -
Hello C(二)——位运算的使用
ARM是内存与IO统一编址,SoC中有很多控制寄存器,通过对这些寄存器进行位运算对这些控制寄存器进行设置,进而控制外设功能。在修改寄存器某些位的过程中不能修改其他的位。一、位运算基础C语言基本的位操作符有与、或、异或、取反、左移、右移六种位运算符。如下表所示: 符号 描述 运算规则 & 与 两个位都为1时,结...原创 2022-02-21 10:58:49 · 524 阅读 · 0 评论 -
Hello C(一)——C语言基础
一、数据类型1、基本数据类型数据类型是创建变量的模型。变量名是连续存储空间的别名,程序中使用变量命名存储空间,通过变量可以使用存储空间。变量所占的内存大小取决于创建变量的数据类型。2、有符号和无符号有符号数中数据类型的最高位用于标识数据的符号,最高位为1表示为负数,最高位为0表示为正数。计算机中有符号数通常使用补码表示,正数的补码为正数本身,负数的补码为负数的绝对值的各位取反后加1。计算机中无符号数通常使用原码表示,无符号数默认为正数,没有符号位。对于无符号数来说,MA.原创 2022-02-21 10:57:18 · 1510 阅读 · 0 评论