C++
qxq_sunshine
持之以恒
展开
-
STL——string字符串的插入和删除、子串的功能
代码实现:#include<iostream>#include<string>using namespace std;//字符串的插入和删除void test01(){ string str1 = "hello"; //字符串的插入 str1.insert(1, "111");//从第一个位置起,插入111 cout << "str1=" <<str1<< endl; //字符串的删除 str1.erase(1, 3原创 2021-05-07 17:14:23 · 782 阅读 · 0 评论 -
STL——string字符串比较、字符存取
一、string字符串比较功能描述:字符串之间的比较比较方式:字符串是按照ASCII码进行比较的,=返回0>返回1<返回-1函数原型:int compare(const string &s) const; //与字符串s比较int compare(const char *s) const; //与字符串s比较Demo:#include<iostream>#include<string>using namespa原创 2021-05-07 16:17:02 · 1265 阅读 · 0 评论 -
STL——string查找和替换
功能描述:查找:查找指定的字符串是否存在替换:在指定位置替换字符串函数原型:* int find(const string& str, int pos=0) const;//查找str第一次出现的位置,从pos位置开始查找* int find(const char*s, int pos=0) const; //查找字符c第一次出现的位置,从pos的位置开始查找* int find(const char*s, int pos, int n) const; //从pos的位置开始查找原创 2021-05-07 16:00:32 · 805 阅读 · 0 评论 -
STL——string的赋值操作
功能:给string字符串进行赋值 string字符串拼接操作赋值的函数原型:共有2种,分别为operate=和assign两种。string& operator=(const char *s); //char*类型字符串 赋值给当前的字符串string& operator=(const string *s); //把当前的字符串s赋值给当前的字符串string& operator=(char c); //字符赋值给当前的字符串string& ass原创 2021-05-07 13:39:35 · 1455 阅读 · 0 评论 -
STL——String
一、基本概念1、string是C++风格的字符串,而string本质是一个类2、string和char*的区别:char*是一个指针string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器3、特点:string类内部封装了很多成员方法如,查找find,拷贝copy,删除delete,替换replace,插入insert4、string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责。二、基本操作构造函数原型:原创 2021-05-07 11:07:59 · 106 阅读 · 0 评论 -
C++——迭代器
Vector可理解为数组容器:vector算法:for_each迭代器:vector<int>::iterator小demo:#include <iostream>#include<vector>#include<algorithm>using namespace std;void myPrint(int val){ cout << val << endl;}void test01()原创 2021-05-06 22:55:51 · 141 阅读 · 0 评论 -
STL——初识
一、诞生1、C++ 面向对象和泛型编程的思想,目的就是代码复用性的提升。(1)面向对象的三大特性是:封装:将一些属性和行为抽象出来形成一个整体,形成一个事和物,提高代码复用性。继承:子类继承父类,将父类中的行为和属性都可以拿到,提高代码的复用性;多态:父类指针指向子类对象,由于子类对象不同,调用同一个接口会产生不同的形态,提高代码的复用性。(2)泛型编程主要是模板,将参数模板化后,使得函数更加通用化。2、STL算法是Standard Template libaray,即标准模板库原创 2021-05-06 10:47:44 · 142 阅读 · 0 评论 -
C++_opencv透视变换应用—抠图和换广告牌
透视变换作用:将图片映射到一个新的视平面,也称为投影映射。透视变换和仿射变换的区别:(1)、仿射变换,它可以将矩形转换成平行四边形,也可以将矩形的边压扁但必须保持边是平行的,也可以将矩形旋转或者按比例缩放。透视变换除了能够处理仿射变换的操作外,还可以将矩形转换成梯形。即仿射变换后还是平行四边形,透视变换后是四边形。因此可以说仿射变换是透视变换的一个子集。(2)、在OpenCV中,基于2*3矩阵进行的变换,是图像的仿射变换;基于3*3矩阵进行的变换,是图像的透视变换或者单应性映射。图像透视变换多用原创 2021-04-25 11:48:23 · 1439 阅读 · 1 评论 -
C++——隐式调用动态库.dll
1、依据上个项目中创建的DemoDll工程。在此工程中添加新建项目,控制台程序。然后再新建一个.cpp文件。里面的内容如下:// XianshiInvokeDll.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>#include <Windows.h>//第一步,创建一个别名,它引用的的函数类型需要和dll中的导出函数一致typedef int (*LPDO_ARRAY) (int* pArr, int原创 2021-03-31 17:00:04 · 1635 阅读 · 0 评论 -
C++——编写和调用动态库
1、编写动态库,新建项目——》冬天链接库(DLL)2、新建mydll.h 和mydll.cpp在mydll.h中添加一个导出函数如下:#pragma once//高亮显示的部分说明是有效的#ifdef BUILD_MYDLL#define API_SYMBOL __declspec(dllexport)#else#define API_SYMBOL __declspec(dllimport)#endifextern "C" API_SYMBOL int convert.原创 2021-03-31 12:00:46 · 2881 阅读 · 0 评论 -
C++——编写和调用静态库
1、新建静态库,流程和代码如下。写类,demoStaticLib.h#pragma onceclass ArrayTool{public: //找出数组中最大值的元素 int MaxElem(const int* lpHead, const int nLength); //数组元素求和 int Sum(const int* lpHead, const int nLength);};写demoStaticLib.cpp// demoStaticLib.cpp...原创 2021-03-31 11:04:10 · 1068 阅读 · 0 评论 -
C++——python调用C++动态库
疑问:1、python是动态语言;c++是静态语言。python调用C++的程序,在数据类型上怎么适配?2、使用的例子是动态库的导出函数,他的输入参数是数组。python里的元组和列表是类似数组的数据结构,但是不是数组,在数据结构上怎么做到适配?3、是否还有其他的问题?vscode作为python的IDEimport ctypes,cypes.util定义2个函数,用命令行运行代码。直接写:python a.pypython安装的是64位的,则需要将VS项目编译成原创 2021-03-30 22:53:32 · 626 阅读 · 0 评论 -
C++动态库调用——显示调用
1、第一步,创建一个别名,它引用的函数类型需要和dll中的导出函数一致typedef int (*LPDO_ARRAY) (int * pArr, int nlen);2、定义一个实例句柄,引用动态库HINSTANCE hdll;3、定义一个函数指针,用来指向导出函数LPDO_ARRAY 1pDo_array;4、引入window头文件#include<window>5、第二步,加载DemoDll.dll动态库if(hDll!=NULL)//判断获取成功或者失原创 2021-03-30 22:38:37 · 989 阅读 · 0 评论 -
C++——模板基本概念
1、C++的另一种编程思想称为 泛型编程, 利用 的技术是模板C++提供了两种模板机制:函数模板和类模板2、函数模板的作用建立一个通用的函数,其函数返回值和形参类型可以不具体制定,用一个虚拟的类型来代表。语法: template <typename T>----template:声明创建模板;----typename:表明后面的符号是一种类型,可以用class代替。—T: 通用的数据类型,名称可以替换,通常为大写字母示例:...原创 2021-03-23 09:57:52 · 213 阅读 · 0 评论 -
普通函数与函数模板的调用规则
普通函数与函数模板的自动类型匹配,规则如下:1、普通函数可以自动类型匹配2、函数模板在显示调用的情况下可以自动类型匹配3、函数模板在隐式调用下不能自动类型匹配普通函数的自动类型匹配:void my swap(int a,int b){ return a+b;}void test01(){ int a=3; int b="c"; cout<<myAdd(a,b)<<endl;//...原创 2021-03-23 08:42:57 · 559 阅读 · 0 评论 -
函数模板案例—选择排序
案例描述:1、利用函数模板封装一个排序算法,可以对不同数据类型数组进行排序2、排序规则从大到小,排序算法为选择排序3、分别利用char数组和int数组进行测试#include<iostream>using namespace std;//实现 通用对数组进行排序函数,从大到小//char,int数组测试//交换的函数模板template<class T>void mySwap(T&a,T&b){ T temp=a;原创 2021-03-22 23:09:32 · 1016 阅读 · 0 评论 -
C++——值传递和地址传递
在C++调用函数时,会存在值传递和地址传递,也叫“传引用和传值”,正好用到这方面内容,因此做个总结,加深一下理解,如果有不到位或者不准确的地方,请小伙伴们多指教。1、地址传递时,形参和实参是同一个变量,即使用相同的内存空间,二者有相同的地址。而传值时二者地址不同;2、地址传递时,由于没有新建变量,所以对于类对象参数,不会产生构造和析构。而如果是传值调用,调用时会进行构造,退出函数时会进行析构;3、由于地址传递使用的是原本实参的地址,所以对引用参数值会做修改,会在退出函数后体现在主调函数中,而传值调用原创 2021-03-04 19:46:12 · 1796 阅读 · 1 评论 -
C++——通过函数对象调用和通过指针调用的优缺点探讨
前言:由于本人初步使用C++,所以第一步保证能正常运行就行了。也没有考虑过内存和运行速度上的问题。现状(问题):本人在对类的调用时,常常按照python的方式初始化一个对象,再访问函数的某个属性,如fun.b来访问类fun的b函数。而身边有同事为此感到嘲笑。他说道:你还是用python的编程思维在写C++, 应该 fun *f=new fun();再用f来调用fun。由此:在网上查一些资料,通过指针调用的优点(相对于通过函数对象访问):指针只需要Double Word(2个字节的原创 2021-03-01 20:16:51 · 911 阅读 · 0 评论 -
C++将一张小图贴到一张大图上
代码实现:#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>using namespace cv;int main(){ Mat image = imread("D:/CF_new/fs_create_fake_sample/image/10.png"); Mat logo = imread("D:/CF_new/fs_create_fake_sample/image/roi.pn原创 2021-02-25 10:46:50 · 1061 阅读 · 0 评论 -
纯虚函数和抽象类——C++
在多态中,通常父类中的虚函数的实现是毫无意义,主要是调用子类重写的内容。因此可以将虚函数改为纯虚函数。virtual 返回值类型 函数名(参数列表)=0; 该类也成为抽象类(无法实例化对象;子类必须重写抽象类中的纯虚函数,否则子类也属于抽象类)。代码示例:使用相同的接口(makeDrink),完成不同的功能(只需在子类中重写父类的虚函数便可)。#include<iostream>using namespace std;//多态案例2——制作饮品class AbstractDr原创 2021-02-02 14:59:21 · 100 阅读 · 0 评论 -
多态的案例——C++
多态的优点:1、代码组织结构清晰2、可读性强3、利于前期和后期的扩展和维护代码实现:#include<iostream>using namespace std;/*多态的优点:1、代码组织结构清晰2、可读性强3、利于前期和后期的扩展和维护*///分别利于普通和多态来实现计算器//普通写法class Calculator{public: int result(string oper) { if (oper == "+") return m_n原创 2021-02-01 21:22:13 · 119 阅读 · 0 评论 -
多态——C++
多态分为: 静态多态,含有函数重载和运算符重载(复用函数名)——地址早绑定(编辑阶段确定) 动态多态,含有派生类和虚函数——地址晚绑定(运行阶段确定)//动态多态是地址晚绑定#include<iostream>using namespace std;/*多态分为: 静态多态,含有函数重载和运算符重载(复用函数名)——地址早绑定(编辑阶段确定) 动态多态,含有派生类和虚函数——地址晚绑定(运行阶段确定)*///动态多态是地址晚绑定class Animal...原创 2021-01-31 21:36:00 · 97 阅读 · 0 评论 -
多态的基本概念——C++
1、多态是C++面向对象三大特征之一,多态分类:静态多态:函数重载和运算符重载都属于静态多态, 复用函数名 动态多态:派生类和虚函数实现运行时多态2、区别:静态多态函数地址早绑定,编译阶段确定函数地址 动态多态的函数地址晚绑定,运行阶段确定函数地址3、动态多态满足条件有继承关系 子类重写父类的虚函数(重写:返回值、函数名、形参列表 都完全一样)4、动态多态的使用父类的指针或者引用 指向子类对象void doSpeak(Animal &animal) //Anima.原创 2021-01-14 23:00:24 · 2878 阅读 · 1 评论 -
继承中的数据类型C++(查看数据结构)
关于继承的子类所占的内存空间,可以通过本程序验证,代码如下:#include<iostream>using namespace std;class parents{public: int m_a;protected: int m_b;private: int m_c;};class son :public parents{public: int m_d;};//利用开发人员命令提示工具查看对象模型的结构//跳转到具体路径下,查看命名//c1 /dl原创 2021-01-11 10:00:02 · 296 阅读 · 0 评论 -
C++继承
一、继承的基础语法1、继承的好处:减少重复代码(将公共的东西写成父类,然后用子类继承)2、语法:class 子类: 继承方式 父类3、子类也成为派生类 ,父类也成为 基类4、派生类包含两大成分:从基类中继承过来的(表现共性) 自己增加的成员(体现个性)二、继承方式公共继承 保护继承 私有继承...原创 2021-01-10 21:17:54 · 79 阅读 · 0 评论 -
等号运算符重载——C++
C++中=为浅拷贝,在实现类时可以赋值操作,但是delete的时候会存在重复释放内存的错误。所以,需要用到等号运算符重载。代码实现如下:#include<iostream>using namespace std;//等号运算符重载,深拷贝class person{public: int *m_age; person(int age) { m_age = new int (age); } ~person() { if (m_age != NULL)原创 2021-01-10 20:17:27 · 6740 阅读 · 2 评论 -
++运算符重载——C++
c++中的++有前置递增和后置递增之分,实现起来需要注意二者不同。代码实现:#include<iostream>using namespace std;class myInteger{ friend ostream& operator<<(ostream &cout, myInteger myint);public: myInteger() //构造函数初始化 { m_num=0; } //1、前置++运算符重载 myInteger&原创 2021-01-10 17:43:57 · 822 阅读 · 0 评论 -
左移运算符重载——C++
场景:如果一个类person中有2个属性,想要同时输出是不可能的,必须要一个一个的指定,然后输出。如下person p;cout<<p.m_a<<p.m_b<<endl;但是直接用cout<<p<<endl;会报错。实现这种直接输出就可以用左值运算符重载实现。代码实现:#include<iostream>using namespace std;//左移运算符重载class person{ friend o原创 2021-01-10 16:58:00 · 194 阅读 · 0 评论 -
运算符重载C++
概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型如加法,可以实现两个自定义的数据类型相加对于内置的数据类型,编译器知道如何运算。黑马程序员老师讲的:代码实现:#include<iostream>using namespace std;//加号运算符重载class Person{public: int m_a; int m_b; //1、成员运算符重载 /*Person operator+(Person &p) {原创 2021-01-09 22:30:42 · 92 阅读 · 2 评论 -
友元—C++
在程序里一些私有属性也想让类外特殊的一些函数或者类进行访问,需要用到友元技术。友元的目的就是让一个函数或者类访问一个类中的私有成员,关键字为friend.友元的三种实现:全局函数做友元; 类做友元; 成员函数做友元。1、全局函数做友元friend + void + 函数名();放在类的里面,告诉类该函数为该类的友元,则该函数就可以访问私有成员。代码例子如下:#include<iostream>#include<string>using namesp原创 2021-01-09 18:06:19 · 631 阅读 · 0 评论 -
拷贝构造函数的调用时机
使用时机:使用一个已经创建完毕的对象来初始化一个新的对象 值传递的方式给函数参数传值 值方式返回局部对象。代码示例:#include<iostream>using namespace std;class Person3{public: Person3() { cout << "默认构造函数" << endl; } Person3(int age) { cout << "有参构造函数" << endl;原创 2021-01-03 21:38:54 · 484 阅读 · 0 评论 -
构造函数的分类及调用C++
构造函数分类按照参数分为:有参构造和无参构造 按照类型分为:普通构造和拷贝构造三种调用方式:括号法、显示法、隐式转换法代码示例:#include<iostream>using namespace std;//对象的初始化和清理class Person2{public: //构造函数 Person2() { cout << "person2 无参(默认)构造函数调用" << endl; } Person2(int a) {原创 2021-01-02 23:00:12 · 137 阅读 · 0 评论 -
构造函数和析构函数C++
对象的初始化和清理是两个非常重要的安全问题。一个对象或者变量没有初始化状态,对其使用后果是未知 如果使用一个变量没有及时清理,也会造成一定的安全问题。C++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理的工作。编译器提供的构造函数和析构函数是空的。构造函数:用于创建对象时,为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用。用法:类名(){}构造函数没有返回值,也不写void; 函数名和类名相同; 构造函数可以有参数,因此可以发原创 2021-01-02 22:15:52 · 204 阅读 · 1 评论 -
结构体案例——英雄——C++
代码实现:#include<iostream>#include<string>#include<ctime>using namespace std;//英雄结构体struct Hero { string name; int age; string sex;};//冒泡排序void BubbleSort(struct Hero heroArray[],int len){ for (int i = 0; i < len - 1; ...原创 2020-12-13 21:22:41 · 895 阅读 · 0 评论 -
结构体案例——C++
题意:有3名老师,含关键字姓名和学生。每位老师带5名学生,含姓名和分数。使用结构体表示,并打印出信息。#include<iostream>#include<string>#include<ctime>using namespace std;//定义学生结构体struct Student { string sname; int score;};struct Teacher { string name; struct Student sArra原创 2020-12-13 20:42:37 · 98 阅读 · 0 评论 -
结构体指针中const的使用——C++
const使用后,结构体的内容不能被修改,防止误操作。#include<iostream>#include<string>using namespace std;//定义学生结构体struct Student { string name; int age; int score;};//将函数中的形参改为指针,可以节省内存空间。//而且不会复制一个新的副本出来。void PrintStuInfo1(const struct Student *p){原创 2020-12-13 20:15:16 · 836 阅读 · 0 评论 -
结构体做函数参数——c++
作用:将结构体作为参数箱函数中传递传递的方式:值传递:形参修饰后,不会改变实参的值。 地址传递:形参发生改变实参也会改变。#include<iostream>#include<string>using namespace std;//定义学生结构体struct Student { string name; int age; int score;};//打印学生信息的函数//1、值传递void PrintStuInfo(struct Stude原创 2020-12-13 20:03:14 · 178 阅读 · 0 评论 -
结构体指针和结构体数组——C++
#include<iostream>#include<string>#include<cstdlib>using namespace std;//语法 struct 类型名称{ 类型 名称};struct Student { string name; int age; int score;};int main(){ //结构体数组 struct Student stuArray[3]{ {"张三",18,100}, { "李四".原创 2020-12-13 15:55:00 · 262 阅读 · 0 评论 -
C++实现COLOR系列封装
\033[A1;A2;A3;...An m假设封装4种颜色#define RED(msg) "\033[0;1;31m"_msg_"\033[0m"#define GREEN(msg)"\033[0;1;32m"_msg_"\033[0m"#define YELLO(msg)"\033[0;1;33m"_msg_"\033[0m"#define BlUE(msg)"\033[0;1;34m"_msg_"\033[0m"_msg_"hello world" 等价于"hello"原创 2020-10-13 21:28:45 · 361 阅读 · 0 评论 -
opencv C++旋转操作操作
1、cv::polylines将点连成线。2、从几何学观点来看,图形放大就是一个相似变换,放大前后的两个图形是完全相似的。而zoom in 或zoom out则不同,这是一个透视变换原创 2020-09-18 10:40:06 · 3000 阅读 · 1 评论