![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 77
洁洁!
CSDN内容合伙人,CSDN新星计划导师,CSDN实力新星,阿里云专家博主,支付宝优秀开发者,C/C++领域新星创作者,商业合作,互利合作,合作共赢,有需求就会有回应,欢迎联系我!
展开
-
protobuf 序列化和反序列化
Protocol Buffers(protobuf)是一种轻量级的数据交换格式,可以用于结构化数据的序列化和反序列化。它使用二进制格式来编码数据,以提高传输效率和数据压缩比。在protobuf中,我们可以使用.proto文件来定义消息类型,并使用编译器生成针对各种编程语言的序列化和反序列化代码。序列化是将结构化数据转换为一系列字节的过程,反序列化则是将字节流解析为结构化数据的过程。序列化的过程通常涉及以下步骤:定义消息类型:使用.proto文件定义消息类型和字段。原创 2024-03-14 12:55:06 · 3888 阅读 · 13 评论 -
跨平台指南:在 Windows 和 Linux 上安装 OpenSSL 的完整流程
一:找到安装包,双击即可二:按照提示,一步一步来,就可以啦三:此界面意思是,是否想向创作者捐款,自己视情况而定啦。四:安装完毕之后,接下来就是VS下的环境配置了。在VS下创建一个新项目,点到属性界面五:找到VC++目录,点击包含目录,点击右边向下的小箭头,会出现 编辑 两个字,点击编辑六:双击空白框,将自己安装到的inlucde目录的路径,拷贝到此七:配置库目录 和配置目录操作一样,选中编辑将自己电脑上·的库路径 拷贝到此。原创 2024-03-03 20:43:38 · 2657 阅读 · 7 评论 -
深入理解工厂模式:创建可复用的对象实例
工厂模式是一种常用的设计模式,它可以帮助我们更好地组织和管理代码,将对象的创建和使用分离开来,提高代码的可维护性和扩展性。在软件开发中,我们经常会遇到需要创建多个不同类型的对象的情况。如果每次都使用 new关键字来实例化对象,代码会变得冗长、难以维护,并且不易于扩展。为了解决这个问题,我们可以使用工厂模式来封装对象的创建过程,使得客户端只需要关心接口而不需要关心具体的实现。工厂模式包括三种变体:简单工厂模式、工厂方法模式和抽象工厂模式。原创 2024-01-25 13:26:12 · 1224 阅读 · 20 评论 -
深入理解单例模式:如何确保一个类只有一个实例?
单例模式(Singleton Pattern)是一种常用的设计模式,用于确保一个类只有一个实例,并提供全局访问点。虽然在表面上看起来很简单,但深入理解单例模式可以帮助我们更好地应用它,避免潜在的问题。在本文中,我们将深入探讨单例模式的核心思想、实现方式和使用场景。首先,我们将介绍单例模式的概念和作用,以及为什么要使用单例模式。其次,我们将讨论几种常见的单例模式实现方式,包括懒汉模式、饿汉模式、双重检查锁定模式和静态内部类模式。我们将比较它们的优缺点,以及在多线程环境下如何确保线程安全。原创 2024-01-13 11:15:12 · 2455 阅读 · 40 评论 -
封装、继承、多态、重载:C++中的强大特性与代码设计
封装、继承、多态、重载:C++中的强大特性与代码设计原创 2024-01-02 17:56:40 · 1916 阅读 · 61 评论 -
模板优化让程序更灵活更通用
C++中的类模板(Class Template)允许创建一个通用的类,其中的数据成员或成员函数的类型可以作为参数进行指定。这样可以在编写代码时不必为每种类型都编写一个单独的类,提高了代码的复用性和灵活性。在上述语法中,template 表示定义了一个模板,typename T是模板参数,可以根据需要进行更改,比如使用class T或者typename U等。在上述示例中,Stack是一个类模板,通过template 指定了一个模板参数T,并在类中使用了这个模板参数。原创 2023-12-19 17:49:40 · 1135 阅读 · 22 评论 -
深入解析C++中的虚函数和虚继承:实现多态性与继承关系的高级特性
虚函数是在C++中用于实现多态性的一种特殊函数。它通过使用关键字"virtual"进行声明,在基类中定义,可在派生类中进行重写。虚函数允许在运行时根据对象的实际类型来调用相应的函数,而不仅仅根据指针或引用的类型。这使得在继承关系中,通过基类指针或引用调用虚函数时,可以根据实际对象的类型来动态地确定要执行的函数版本,实现多态性的特性。原创 2023-12-11 21:23:27 · 687 阅读 · 14 评论 -
拷贝构造函数:对象复制的重要工具
深拷贝指的是在进行对象复制时,不仅复制了对象本身,还复制了对象所引用的其他对象,以确保复制后的对象与原始对象完全独立,彼此之间不会相互影响。换句话说,深拷贝会递归地复制对象及其所有引用的对象,从而创建一份全新的、独立的副本。举个例子,假设有一个包含其他对象引用的复杂对象A,通过深拷贝后得到的副本B将会包含与A中相同类型和值的所有对象,而不是简单地复制它们的引用。这意味着对副本B的任何修改都不会影响原始对象A,因为它们引用的是完全独立的对象。在编程中,实现深拷贝通常需要递归遍历对象结构,并对其中的每个原创 2023-12-06 19:27:23 · 896 阅读 · 17 评论 -
关键字静态成员:在类级别上共享数据和方法的机制
02.用在文件级别(函数体之外),修饰变量或函数,表示该变量或函数只在本文件可见,其他文件看不到也访问不到该变量或函数。可以使用类初始化的对象来调用静态成员,但是一般不会这样做,因为会容易理解错误,静态成员是属于整体的而不是类对象。static成员函数没有this指针,他不能访问非static成员,也不能调用非static成员函数。在普通·成员函数中可以调用静态成员函数,但是在静态成员函数中不可以·调用普通成员函数,static成员独立于类对象存在,也就是说它不属于对象的成员,它能被全体对象所共享。原创 2023-12-04 16:24:57 · 567 阅读 · 14 评论 -
【C++】从入门到精通第四弹——命名空间
定义格式:定义命名空间需要使用namespace关键字namespace 名称常量,变量,函数等对象的定义此代码的意思也就是说,names ,age两个变量是属于命名空间name1的。那么我们怎么去使用这两个变量呢?一般使用形式如下:命名空间::成员;那么唯一性是如何体现的呢。下面的例子来说明命名空间包含的变量成员具有唯一性4 {7 }9 {12 }15 {20 }age = 6可见不同命名空间下的同名称变量是不一样的。原创 2023-11-08 21:21:48 · 1430 阅读 · 27 评论 -
【C++】从入门到精通第三弹——友元函数与静态类成员
类成员一般都需要通过对象来访问,不可以通过类名直接访问,但是当我们将类成员定义为静态类成员,则允许使用类名直接访问。静态类成员是在类成员前定义static关键字。 友元是使用friend关键字, 让特定的函数或者别的类的所有成员函数对私有数据成员进行读写。 好处是:可以保持数据的私有性,又可以让特定的类或者函数直接访问私有成员。为了提升效率,友元可以让普通函数直接访问一个类的保护或私有数据成员,但是如果没有友元机制,就只能将类的数据成员声明为公共的,从而任何函数都可以无约束地访问它。原创 2023-11-07 22:58:53 · 811 阅读 · 23 评论 -
【C++】从入门到精通第二弹——类的构造与析构函数
构造函数和析构函数是两个特殊的成员函数,都没有返回值,构造函数名和类名相同,析构函数名只是在类名前加上 ~ 构造函数主要用来在创建对象时给对象中的数据成员赋值,主要目的是初始化对象, 析构函数的功能与构造函数正好相反,析构函数是用来释放对象的,再删出对象前,对对象进行清理工作原创 2023-11-07 20:16:06 · 323 阅读 · 5 评论 -
【C++】从入门到精通第一弹——基础知识
如果某个内联函数要作为外部全局函数,即它将被多个源代码文件使用,那么就把它定义,在每个调用该内联函数的源文件中包含该头文件,这种方法保证对每个内联函数只有一个止在程序的生命期中引起无意的不匹配。但是在我们使用内联函数时,有时候编译器并不会同意我们使用,因为有的编译器会自动判断函数的大小,如果函数过于复杂或者函数调用了自己,编译器都不会把其当作内联函数的。在函数中定义的只能在函数中使用,尽管该变量不能再继续使用,但是它还是存在的,当再次调用该函数,又可以继续使用。输出域宽是指输出的值在流中占有的字节数。原创 2023-11-04 12:53:42 · 292 阅读 · 6 评论 -
【C++】C++ primer plus第二章练习题
函数。包含头文件,将iostream文件的内容添加·到代码中using是预编译器指令,让其使用std命名空间=运算符,将右侧赋值给左侧"We have " 是字符串cheeses 是变量名函数名叫froop(),带有一个参数t,参数类型是double类型,并且函数返回一个整值类型。所以调用函数froop()时,要提供一个double类型的参数,该函数将返回一个int值函数名叫rattle,带有一个参数n,参数类型是int类型,函数没有返回值。原创 2023-10-21 16:54:22 · 581 阅读 · 25 评论 -
list容器会了吗?一文理解它
清华社为您精选多款高分好书,涵盖了 C++、Java、Python、前端、后端、数据库、算法与机器学习等多个 IT 开发领域,适合不同层次的读者。此外如果大家有购书需求,欢迎大家考虑一下清华社,直接以最低的价格买到最好的书!2.链表执行插入和删除操作十分简单,修改指针即可,不需要移动大量元素。在pos插入区间【beg,end】的数据,返回下一个数据的位置。删除区间【beg,end】的元素,返回下一个元素的位置。在pos插入elem元素的拷贝,返回新数据的位置。删除pos位置的数据,返回下一个数据的位置2。原创 2023-06-09 18:03:31 · 579 阅读 · 77 评论 -
vector容器会了吗?一文理解它
它是动态扩展,找一块新的更大的空间,把原来的数据拷贝到这,释放原来的空间。返回容器中最后一个数据元素。返回索引idx所指的数据。返回索引idx所指的数据。返回容器中第一个数据元素。//3.插入和删除操作。原创 2023-06-09 17:37:09 · 533 阅读 · 37 评论 -
c++继承知识详解(一)
按道理来说,父类中所有非静态成员属性会被子类继承下去,所以父类中私有成员属性确实是被继承下来了,但是被编译器隐藏起来了。当子类和父类有同名的成员函数时,子类会隐藏父类中同名成员函数,,加作用域可以访问到父类中同名的函数。如果子类中出现与父类同名的成员函数,会隐藏掉父类中所有同名的函数,除非加上作用域。//主要带来问题是子类继承两份相同的数据,导致资源浪费以及毫无意义。如果子类中没有,只有父类中有,直接调用会调用父类中的函数。直接调用,调用的·是子类中同名的成员。公共继承,保护继承,私有继承。原创 2023-05-31 20:38:56 · 771 阅读 · 16 评论 -
c++术语大总结
缓冲区是一个储存区域,用于保存数据。IO 设施通常将输入(或输出)数据保存在一个缓冲分区,读写缓冲区的动作与程序中的动作是无关的。我们可以显示地刷新输出缓冲,以便强制将缓冲区中的数据写入输出设备。默认情况下,读cin会刷新cout;程序非正常终止时也会刷新cout。原创 2023-05-24 09:47:49 · 1628 阅读 · 7 评论 -
【c++】基类派生类多态虚函数?
如果派生类没有覆盖其基类中的某个虚函数,则该虚函数的行为类似于其他的普通成员,派生类会直接继承其在基类中的版本,派生类可以在它覆盖的函数前使用virtual关键字,但不是非得这么做(可有可无)。根据引用或指针所绑定的对象类型不同,该调用可能执行基类的版本,也可能执行某个派生类的版木,基类通过在其成员函数的声明语句之前加上关键字virtual使得该函数执行动态绑定。对于前者,基类通常将其定义为虚函数(virual)。派生类可以继承定义在基类中的成员,但是派生类的成员函数不一定有权访问从基类继承而来的成员。原创 2023-04-25 14:56:58 · 1278 阅读 · 38 评论 -
【c++】拷贝构造与深浅拷贝
合成拷贝构造函数用来阻止我们拷贝该类类型的对象。合成的拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中。每个成员的类型决定了它如何拷贝,对于类类型的成员,会使用其拷贝构造函数来拷贝,内置类型的成员则直接拷贝。p1,p2,所以析构时会调用两次析构函数,所以如果要是进行浅拷贝的话,myheight=p.myheight;如果一个构造函数的第一个参数是自身类型的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数。如果没有定义一个拷贝构造函数,编译器会自动为我们定义一个,与合成拷贝构造函数。原创 2023-04-22 13:05:04 · 328 阅读 · 7 评论 -
【C++】c++中标准库类型 string 详解
两个string 对象相加会得到一个新的string对象,内容是把左侧的运算符对象与右侧的运算符对象串接而成,它所包含的字符由两部分组成: 前半部分是加号左侧string 对象所含的字符,后半部分是加号右侧string对象所含的字符。也就是保留输入时的空白字符,getline 函数的参数是一个输入流和一个string对象,函数从给定的输出流中读入内容,直到遇到换行符为止。// 直接初始化,s3的内容是cccccccccc。如果使用(=)初始化,实际是拷贝初始化,把=右侧的初始化值拷贝到新建的对象中去,原创 2023-03-09 08:00:00 · 1081 阅读 · 19 评论 -
【C++】constexpr 和 常量表达式
/只有当size是一个constexpr函数时才是一条正确的声明语句。sz 虽然是一个常量(const)但是它的具体值只能运行时才能获取,所以不是常量表达式。//p是一个指向整数的常量指针,其值为空。//p是常量指针,指向整形常量 j。litter 虽然是一个字面常量但是它的类型只是普通的类型int,所以不是常量表达式。//mf+1 是常量表达式。// q是一个指向整数的常量指针。字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。// p是一个指向整形常量的指针。原创 2023-03-05 17:46:02 · 574 阅读 · 19 评论 -
【C++】c++中基本类型详细解释外加基本运算规则
特殊类型指针,可以存放任意对象的地址,作为函数的输入和输出、不能直接操作void * 指针所指的对象,(因为不知道所指对象类型)引用:为对象起一个名字,引用类型引用另外一种类型。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。指针本身就是一个对象,可以指针赋值和拷贝,在指针的生命周期内可以先后指向几个不同对象。指针的指向可以修改,但是指针指向的值不可以改变。特点:指针指向和指针指向的值都不可以改变。指针的指向不可以改,指针指向的值可以改变。是基于其他类型定义的类型(引用和指针)。原创 2023-03-03 18:24:29 · 538 阅读 · 27 评论 -
【C++】初识输入输出基础入门
第二个运算符打印endl,这是一个被称为操纵符的特殊值。写入endl的效果是结束当前运行,并将与设备关联的缓冲区中的内容刷到设备中。输入运算符 (>>)它接收一个istream 作为其左侧运算符对象,接收一个对象作为其右侧运算对象。命名空间可以帮我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突。右侧运算对象是要打印的值。其中 前缀std::作用是指出名字cout,endl 是定义在名为std的命名空间的。在c++中一个表达式产生一个计算结果,它由一个或多个运算对象和一个运算符组成。原创 2023-02-24 18:11:19 · 132 阅读 · 1 评论