![](https://img-blog.csdnimg.cn/374d543643794a51871a12bd7b5030c2.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
C++
qiuqiuyaq
这个作者很懒,什么都没留下…
展开
-
c++正则表达式的组成和使用
正则表达式的组成正则是一种规则,它用来匹配(进而捕获、替换)原字符串。这种规则需要“模式”、“字符串”这两样东西,“模式”根据正则规则,来处理“字符串”。这种规则被许多语言支持,C++11以后才支持正则。使用正则表达式需要包含 <regex> 库#include<regex>using namespace std;int main(){ //构造正则对象 regex regx("\\w");}具有特殊意义的元字符\:\字符能够改变字符原创 2022-05-08 18:58:02 · 2767 阅读 · 0 评论 -
c++模板 --- 类模板特化
一个模板类可以衍变成多个模板 局部特化 完全特化 类的特化有什么用? 有些数据是特殊形式的,特殊形式的数据在调用原模板时候可能不兼容,可以把它特殊化到一个单独的类中去实现,针对这种独立的数据类型去做处理 折叠参数的展开 采用特化的方式来展开 局部特化//两个未知类型的模板类template <class _Ty1,class _Ty2>class MM {public: MM(_Ty1 one, _Ty2 two) :one(one..原创 2022-02-06 13:29:03 · 589 阅读 · 0 评论 -
可变参函数模板(拓展)
折叠参数:. . . (折叠参数的写法) 可增长(可以理解为可变参)模板参数的 模板函数(类似 c 语言的 print 函数,print 函数的参数也是可以增长的) 可变参函数,一般在函数模板当中去使用,用两个类型去做解析 可增长模板参数的 类模板 . . . Args 代表一个参数包,可以允许使用任何类型1.如何通过参数包定义一个变量:Args . . . args【变量名】 ......原创 2022-05-17 22:57:32 · 205 阅读 · 1 评论 -
c++模板 --- 函数模板重载(隐式调用的顺序问题)
理解先调用哪个,后调用哪个即可 重载:函数名相同,参数类型不同 模板函数和普通函数 ,优先调用类型一致的 --->优先调用普通函数 两个模板同时成立,优先调用类型相似度高的那个 void print(int a, string b) { cout << "普通函数" << endl;}template <class _Ty1,class _Ty2>void print(_Ty1 a, _Ty2 b) { cou...原创 2022-02-06 10:24:05 · 403 阅读 · 1 评论 -
c++模板 --- 模板的嵌套
明白类型是什么即可,可以适当运用using语法起别名 简化代码 函数模板嵌套template <class _Ty1,class _Ty2>class MM {public: MM(_Ty1 one, _Ty2 two) :one(one), two(two) {} friend ostream& operator<<(ostream& out, const MM& mm) { out << mm.one <&..原创 2022-02-06 09:54:20 · 3754 阅读 · 0 评论 -
c++模板 --- 类模板、自定义类型当做模板参数
生成一个类模板用template修饰的类 ---> 类中用到了未知类型多用于数据结构,忽略类型的问题只要用template修饰,有没有用到未知类型都是模板类template<class _Ty>class MM{ public: protected:}//只要被template修饰就是一个模板类,用没用未知类型没关系 类模板调用 只要用template修饰,就是一个模板类,模板类必须采用显式调用 不存在隐式调用(必须要传参....原创 2021-12-17 01:01:10 · 3991 阅读 · 3 评论 -
c++模板 --- 函数模板
什么是模板?把类型当做未知量来处理,写的函数或者类,不因为数据类型的改变,而要修改代码--->数据类型改变,依然适用于代码(代码功能依旧可以使用)例子:求(int类型、string类型...)最大值因为数据类型的不同,需要多个相同的函数--->函数体是一样的,但是类型不同导致的额外代码int Max(int a,int b){ return a > b ? a : b;}声明模板的语法引入模板这个东西,把类型当作未知量//单个未知类型temp原创 2021-12-15 00:54:08 · 1251 阅读 · 0 评论 -
C++异常处理 --- 自定义异常类
抛出自定义类型的类也可以当作异常类(自己写的异常描述类),专门用来描述程序出现的问题 写一个类继承标准库中的异常类去描述异常 自己写的异常描述类 - - - 一般在综合管理错误的处理时使用,可能同一个问题在程序中出现多次class Error{public: Error(const char* str = "未知错误") :str(str) {} const char* what()const { return str.c_str(); }protected: ...原创 2022-02-05 16:04:36 · 1798 阅读 · 0 评论 -
C++异常处理
基本的异常处理 异常处理机制:暂缓问题处理,不在当前函数中处理,在他的调用者中处理(先上车,后补票) 什么是异常:任何东西都可以认为是异常,错误只是异常的一种 异常一旦被抛出,不做处理,如果引发异常,会调用默认abort终止程序 捕获和处理异常 throw 抛出异常:(可以理解为返回值,值是任何类型都可以,是我们处理异常的一个参照) try(检查,捕获)和catch(处理异常):必须是一起出现,并且它们的括号{ }不能省略 tip:..原创 2021-12-13 01:16:05 · 1593 阅读 · 3 评论 -
c++ --- 通讯录管理系统(多文档编程、文件操作、链表)
节点关系node.h#pragma onceclass MM;class Node{public: Node(); Node(MM *data); Node(MM *data,Node* next); Node*& getNext(); //返回指针的引用 MM*& getData(); //提供公有接口方便访问它里面的指针和数据protected: MM *data; Node* next;};node.cpp.h要避免头文件包含.原创 2021-12-11 18:59:34 · 1457 阅读 · 2 评论 -
c++ IO流---文件流
流类体系 ofstream 类 打开文件进行写操作,用这个类去创建对象只能做写操作output输出到文件 ifstream 类 读操作 fstream 类 创建对象可读可写 用的时候包含头文件 #include <fstream> 打开 & 关闭文件(都是类的成员函数) 打开文件: void open(const char* URL,ios::openmode mode);文件路径 + 读写方式(ios::ope....原创 2022-02-04 22:17:58 · 4214 阅读 · 2 评论 -
c++ IO流---字符流
包含头文件 <sstream> 是一个(父)类2个子类---用于做输入、输出流操作tip: c++流类体系就是一个继承体系 istringstream类 //做输入的字符流类 只能作input ostringstream类 //做输出的字符流类 只能作output 一般用stringstream类(中间类)对象即可 获取字符流对象中的数据 string str() ............原创 2021-12-09 15:16:18 · 691 阅读 · 2 评论 -
c++ IO流---输入输出流 & 格式控制字符
流:若干字节数据从一端到另一端我们叫做流例如:操作文件,从程序到文件,数据的流动的操作称为流操作流类体系专门处理输入输出流、字符流、文件流,包含有: 流对象 流运算符 >> << 输入/出流对象 + 流运算符 >> <<---处理输入输出的数据字符流对象 + 流运算符 >> << ---处理字符流文件的对象 + 流运算符 >> << ---读写文件......原创 2021-12-08 13:22:51 · 1308 阅读 · 1 评论 -
c++类型转换 const_cast、dynamic_cast、reinterpret_cast、static_cast
const_cast#include <iostream>using namespace std;/* const_cast<要转换类型>(要转换的目标) 1.去掉const属性(提供一个可以修改的接口去操作const属性的变量) 2.加上const属性(用的比较少)*/class A {public: A(const char* str) :str(const_cast<char *>(str)) {} //this->str=cons原创 2022-02-03 11:35:51 · 980 阅读 · 0 评论 -
c++ --- final & override (新标准引入的说明性关键字)
final 禁止重写:子类中不能存在同名函数 override强制重写:标识作用在子类中用于检查父类中是否存在当前的虚函数 不存在就会报错 继承中的标识性物件,用于修饰成员函数,报错:不能使用"final"修饰符声明非虚函数,用于增加代码的可读性 #include <iostream>using namespace std;class A {public: virtual void print() final { cout <<......原创 2022-02-02 21:18:18 · 493 阅读 · 0 评论 -
c++虚析构函数
虚析构函数---特殊的析构函数在用子类对象初始化父类指针,父类需要虚析构函数做内存释放不正常的赋值操作会存在释放问题子类没有数据成员的内存申请,否则父类的析构函数一定要写成虚析构函数#include <iostream>using namespace std;class parent {public://用virtual修饰的父类析构函数,这样就会调用子类的析构函数 virtual ~parent() { cout << "父类析构" <&l原创 2021-12-06 23:40:42 · 323 阅读 · 0 评论 -
c++纯虚函数(特殊的虚函数)和ADT过程(抽象数据类型)
什么是纯虚函数?纯虚函数也是虚函数(特殊的虚函数)纯虚函数没有函数体 只能在类中函数这样写,把这样的函数叫纯虚函数virtual void print()= 0; //在类中函数 这样写法 或者 原来的虚函数不想写函数体直接=0本质就是重写过程--- 用了别人的框架,别人把具体功能实现了,想要改变某些属性就需要重写例:mfc中创建窗口的过程父类中已经写好了,但是创建的窗口是默认窗口大小,作为用户可能不需要默认大小,想修改宽高--->提供了一.............原创 2021-12-06 23:17:03 · 590 阅读 · 0 评论 -
c++虚函数实现多态
多态的实现一定是公有继承,其他继承方式没有多态的说法--->多态是针对类外的一种说法多态的定义两种相同的行为导致的不同的结果--->因为赋值对象不同,所导致的结果不同多态的必要性原则 父类必须存在虚函数 子类必须采用public继承 必须存在指针的引用(使用)--->一定有指针存在 知道是什么样的赋值调用什么样的函数1.子类中有没有virtual没关系,只要父类中有virtual就可以了 2.子类中要存在同名函数,否则,不存在vi....原创 2021-12-05 21:29:30 · 236 阅读 · 0 评论 -
c++虚函数和虚函数表
什么是虚函数? 用virtual 修饰的成员函数叫虚函数 小知识: 没有虚构造函数普通函数不影响类的内存class MM{public: void print() { cout << "普通函数"<< endl; //普通函数不影响类的内存<--->普通函数存在另一段内存中 }protected:};void testVirtual(){ //C语言不允许存在空的结构体 cout << ....原创 2021-12-05 00:22:09 · 843 阅读 · 0 评论 -
c++继承-----继承中的构造和析构顺序问题
单继承中的构造顺序问题 先构造父类的再构造子类的,析构顺序相反 多继承中构造顺序问题 任何构造顺序问题都和初始化参数列表无关 构造顺序和继承顺序一致 单继承class A {public: A() { cout << "A"; } ~A() { cout << "A" ; }protected:};class B :public A {public: B() { cout << "..原创 2021-12-02 17:00:13 · 815 阅读 · 0 评论 -
c++虚继承|菱形继承(也是继承的同名问题)-----virtual修饰的继承方式
虚继承---满足菱关系才有虚继承引入虚继承:A类中有一个a属性,A继承产生B类也有一个属性a,A继承产生C类也有一个属性a,B、C类继承产生D类--->普通的继承方式让D类中有两个属性a,有两个拷贝本,a由谁决定?解决方案:让相同的a属性只保留一份(让两个a只有一个有效)--->用虚继承--->这份a必须让A的构造函数初始化(在D类中调用A类(祖先类)的构造函数)用虚继承的方式class B :virtual public A{};用virt.原创 2021-12-02 14:56:13 · 358 阅读 · 0 评论 -
c++继承-----继承中的同名问题
数据成员同名 成员函数同名 正常赋值调用 非正常赋值调用学会在继承中不同的初始化方式中谁调用谁数据成员同名#include <iostream>using namespace std;class MM{public: MM(string name, int age) :name(name), age(age) {}protected: string name; //有同名数据......原创 2021-12-03 10:19:12 · 278 阅读 · 0 评论 -
c++继承-----继承中构造函数写法
父类的属性需要通过父类的 构造函数/成员函数 的方式初始化子类中的构造函数: 1.必须要调用父类构造函数 2.必须采用初始化参数列表的方式单继承和多继承单继承: 只有一个父类的继承关系多继承: 两个或者两个以上的父类无论被继承多少次,继承的属性一直都在,所以类一般不会被继承很多层,会导致类的臃肿#include <iostream>#include <string>using namespace std;class Parent ......原创 2021-12-02 13:52:39 · 4317 阅读 · 3 评论 -
c++继承-----继承方式与权限问题
继承的写法 ---继承和派生的区别/*父类必须是存在的 先准备一个类*/class 父类名{ };//子类 继承方式就是权限限定词class 子类名:继承方式 父类名{ };继承--->所产生的子类中没有新的属性、行为--->所有东西都是父类中的//父类 class parent{ };//子类 class son1:public parent{ };派生(与继承区别不大、与继承写法一样)--->派生原创 2021-11-30 19:47:47 · 602 阅读 · 0 评论 -
c++类的组合、类中类、类中默认的函数、类中的枚举、移动构造
小技巧:能用组合,尽量不用继承以另一个类的对象为数据成员 组合类的对象,写构造函数,必须采用初始化参数列表的写法对于组合类的构造函数~要为自己的属性初始化--->初始化参数列表,this指针 ~为组合类的对象做初始化<--->必须采用初始化参数列表的方式调用分支类的构造函数MM类以boy类的对象为数据成员#include <iostream>using namespace std;class Boy{public:......原创 2021-11-27 22:49:18 · 447 阅读 · 1 评论 -
c++运算符重载案例---封装int类型、算术运算符重载、位运算符重载、流重载、关系运算符重载、取地址符重载、[ ]重载...
class Int{public: Int(int num) :num(num) {} int& data() { return num; } string tostr() { return to_string(num); } //算术运算符重载 Int operator+(const Int& value) { return Int(this->num + value.num); } //友元重载 :操作数-1 等于重载函数的参数个数.原创 2022-01-30 13:37:16 · 899 阅读 · 0 评论 -
c++文本重载(新标准)& 类的对象的隐式转换
重载后缀返回值类型unsigned long long函数名operator" "固定格式unsigned long long operator" "_h(unsigned long long num)原创 2021-11-29 09:17:19 · 652 阅读 · 1 评论 -
c++特殊运算符重载---+ +、- -运算符重载
需要解决的问题:前置和后置的问题?如何解决?需要增加一个无用参数--->用int去标识当前运算符重载是后置的重载运算,前置则不需要前置++MM operator++() //需要一个无用参数 充当标记后置++MM operator++(int) //需要一个无用参数 充当标记例题:对"小芳"的年龄做++运算前置++、后置++运算实现原理int main(){ int num = 1; int result = num++; //resu...原创 2021-11-28 19:47:12 · 391 阅读 · 0 评论 -
c++特殊运算符重载---流运算符重载
小知识:cin类型和cout类型--->本质是一个对象--->做输入、输出~cin类型--->istream类的对象(inputstream)~cout类型--->ostream类的对象(outstream)流运算符<< >> 流重载= () -> [ ] 这些运算符必须采用类的成员函数形式重载. .* ? :(三目运算符) ::(作用域分辨符) 这些运算符............原创 2021-11-25 19:04:04 · 2274 阅读 · 2 评论 -
c++运算符重载
什么是运算符重载?赋予运算符具有操作自定义类型数据的功能运算符是操作基本数据类型的,对于自定义类型不能直接操作--->自定义类型是复合类型的数据,有多个部分--->引入运算符重载举一个复数的例子:复数由实部、虚部组成class Complex {public: Complex(int a=0, int b=0):a(a),b(b){} //缺省处理 void print() { cout << a << endl; c原创 2021-11-25 01:37:59 · 446 阅读 · 1 评论 -
c++封装string类、strcpy_s()、strcat_s()、memset()、strcmp()函数解析
实现功能实现string中的创建方式 string str1; //需要无参&有参&拷贝构造函数 string str2("ILoveyou"); string str3(str1); string str4 = str2;通过实现data和c_str函数 打印字符串 cout << str2.c_str() << endl; //打印ILoveyou cout <..原创 2022-01-28 18:13:46 · 720 阅读 · 0 评论 -
c++this指针与explicit
this指针 避免形参名和数据成员同名,通指对象的地址 充当函数返回值,返回对象自身,用*this表示对象本身 静态成员函数中是不能使用this指针 class GG {public: //构造函数中解决同名问题: 1.用初始化参数列表 2.用类名限定的方式去访问 GG(string name, int age) :name(name), age(age) {} //普通成员函数不存在初始化参数列表 void initData(string n原创 2022-01-28 12:12:48 · 448 阅读 · 0 评论 -
c++友元类
用friend修饰的类把另一个类声明为当前这个类的友元类#include <iostream>using namespace std;class MM { friend class GG; //GG这个类是MM的友元类public: MM(string name, int age) :name(name), age(age) {}protected: string name; int age;};class GG {public: void print原创 2021-11-28 11:48:41 · 868 阅读 · 0 评论 -
c++友元函数
用friend修饰的函数~普通友元函数~以另一个类的成员函数充当友元函数ps:~友元只是提供一个场所,赋予对象能打破类的权限限定(无视权限)~不是说可以忽视掉原来的规则,类中的数据成员必须通过对象去调用小知识:无参普通函数:在类中声明,在类中实现需要在最前面声明一下<--->未声明--->未定义的标识符void printData(); //告诉编译器有这个函数,函数在类中的定义实现#include <iostream>using原创 2021-11-26 00:01:45 · 476 阅读 · 3 评论 -
c++static成员
小知识:~static成员不属于对象,属于类--->所有对象共有--->调用可以不需要对象(当然也可以用对象调用)~static成员依旧受权限限定 (public、protected)static数据成员 ·类中初始化是错误的--->不能采用初始化参数列表方式初始化 --->注意和普通数据写法的区别class Student{public: Student(string name=""):name(name),num(num){} /*报错:num不是类原创 2021-11-24 17:28:07 · 2755 阅读 · 3 评论 -
c++const成员
const数据成员 ~const类型变量--->常属性--->不可以修改,只读模式 --->一旦做了第一次初始化就不可以修改~必须采用初始化参数列表方式进行初始化class Student{public: Student(string name, int num) :num(num) { Student::name = name; //可以赋值的方式,也可以用初始化列表的方式 //Student::num = 1001; 报错:const数据成员必须要用初原创 2021-11-23 00:40:51 · 975 阅读 · 2 评论 -
c++结构体中写了构造函数需要注意的问题
c++结构体~允许存在构造函数、析构函数、拷贝构造函数~默认属性是公有属性,可以用权限限定~如果写了构造函数就是一个类,不能用c语言的用法去用,必须用类的方式去用结构体在c++没有写构造函数/权限限定的时候,结构体用法和c语言一样,具体内容可以看看这篇博客:c和c++的区别(二)_考拉爱睡觉鸭~的博客-CSDN博客using namespace std;struct Student { //protected: string name; int age;public:原创 2021-11-22 10:52:47 · 489 阅读 · 1 评论 -
c++构造、析构顺序问题
普通对象,构造顺序和析构顺序是相反 new出来的对象,delete会直接调用析构函数 static对象,当程序关闭的时候,生命周期才结束,所以是最后释放 class Student{public: Student(string name = "x") :name(name) { cout << name; } ~Student() { cout << name; }protected: string name;};int ma..原创 2021-11-22 10:07:25 · 620 阅读 · 1 评论 -
c++深、浅拷贝 - - - 构造函数做了new内存操作,调用构造函数构造对象时需要注意的问题
浅拷贝默认的拷贝构造叫做浅拷贝--->引发析构问题--->重复释放内存~使用默认的拷贝构造函数class Student{public: Student(const char* mname, int age) :age(age) { name = new char[strlen(mname) + 1]; strcpy_s(name, strlen(mname) + 1, mname); } void print() { cout << nam原创 2021-11-22 09:38:41 · 478 阅读 · 1 评论 -
c++拷贝构造函数(特殊的构造函数)
拷贝构造函数是怎样的 拷贝构造函数也是构造函数,长相和构造函数一样,只是参数是固定的 class Student{public: Student(string name, int age) :name(name), age(age) {}//拷贝构造函数 Student(const Student& mm) { name = mm.name; age = mm.age; cout << "拷贝构原创 2021-11-21 16:44:05 · 426 阅读 · 0 评论