
c++
文章平均质量分 56
A.Crocodile
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
c++(27)STL:容器、算法、迭代器
standardtemplatelibrary,标准模板库,是由惠普实验室开发的一系列软件的统称。STL广义上分为容器container、算法algorithm、迭代器iterator,容器和算法之间通过迭代器进行无缝连接。STL几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。在c++标准中,STL被组织成一下13个头文件使用STL的优点(1)且现在STL是C++的一部分,被内建在c++编译器中,不需要额外安装。...原创 2022-07-28 16:07:04 · 642 阅读 · 0 评论 -
c++(26) 输入输出流、文件操作
cin会创建一个输入缓冲区,键盘向屏幕输入字符的时候,会将数据放进缓冲区。如果缓冲区内没有数据,则会阻塞等待键盘输入。同样的cout也会有自己的缓冲区,在有的linux编译器下,cout原创 2022-07-27 18:02:02 · 674 阅读 · 0 评论 -
c++(25)类型转换、异常机制
public{}{}{=NULL){}编译器差异,实际上vs上是需要自己手动释放的*/}publicchar*err;};{publicpeople(){}{{throwmyOutOfRange("年龄应该在0-200之间");}}publicintm_age;};{peoplep;try{}{}}{func();return0;}执行结果httpshttpshttps。原创 2022-07-26 15:32:37 · 387 阅读 · 0 评论 -
c++(24)STL引入:函数模板、类模板
我们在C语言的常规编程工作中,经常会遇到因为形参数据类型,而定义多个函数。比如功能交换A和B的值只要A和B这两个数据的类型不同,我就要重定义一个新函数,而这两个函数除了形参数据类型不一样,其他的逻辑都是一样的。这样就造成了代码的重复,增加维护成本。为了解决这个问题,c++引入了函数模板使形参类型化,实现定义的时候不关心具体的数据类型,只关心功能的实现。编译器为了与普通函数区分,使用关键字template。函数模板不允许自动类型转化普通函数能够自动进行类型转化。..................原创 2022-07-21 20:22:22 · 771 阅读 · 0 评论 -
c++(23)纯虚函数和抽象类、C语言函数指针的语法和意义
3)、被当做父类的抽象类,通常被当做API接口被提供,也常常使用抽象类的指针指向实例化的对象(父类指针指向子类对象)。业务层的代码程序设计,面向抽象类编程,降低代码耦合度。依赖倒转原则-----上层业务层和底层实现层,向中间抽象层靠拢。(1)、只要当类中拥有纯虚函数,无论这个类有没有成员变量,这个类都是一个抽象类,(2)、当一个普通的类,继承自抽象类的时候,,否则这个类仍然是抽象类。.........原创 2022-07-20 16:18:07 · 468 阅读 · 0 评论 -
c++(22)多态和虚函数、虚函数表和vptr、对象指针的步长
由继承而产生的相关却不同的类,其对象对同一消息会做出不同的响应。就是说基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式,我们将这种现象称为。多态是对象对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻系统升级、维护、调试的工作量和复杂度。可以通过基类指针对所有派生类(包括直接派生和间接派生)的成员变量和成员函数进行“全方位”的访问,尤其是成员函数。如果没有多态,我们只能访问成员变量。......原创 2022-07-18 17:32:12 · 682 阅读 · 0 评论 -
c++(22)多继承和虚继承
在现实意义中,类内的两个同名变量的用处不大,如果换个例子,当爷爷类是家具,有个成员变量表示材料。两个子类分别是沙发和床,然后有一个沙发床多继承自沙发还有床,那这个沙发床无论是继承自谁,永远也支持一种材料(来自爷爷的隔代继承)多继承,是指一个子类,继承了两个不同的父类。若这俩个不同的父类,又继承自同一个爷爷类,那么就形成了所谓的菱形继承。像上面这种继承关系的例子,在实际使用中,一个人不会用两个姓氏。当出现菱形继承时,为了避免出现歧义,爸爸类要声明为。,这样孙子类的变量就只有一份,来自爷爷类。...原创 2022-07-18 14:27:51 · 581 阅读 · 0 评论 -
c++(21)继承和派生
子类构造函数执行的时候,会先调用父类的默认构造函数。也可以显示的在子类构造函数后加父类构造,去指定调用父类的哪个构造函数。析构的顺序,跟之前说的一样,先构造的后析构,所以是先调用子类析构,再调用父类析构。......原创 2022-07-16 14:19:52 · 388 阅读 · 0 评论 -
c++(20)自定义的string类,老生常谈的c++笔试题
主要还是为了熟悉操作符重载,和了解string类的实现方法。还有c++笔试题确实满常见的,主要是考察拷贝构造、深拷贝、操作符重载等问题。下面看下我的MyString的实现,写的一般,网上还有好多大神写的比较全的。my_string.h头文件my_string.cpp源码 main.cpp测试程序执行结果:附带一个linux环境的makefile,写的比较简单...原创 2022-07-13 09:53:19 · 294 阅读 · 0 评论 -
c++(19)自定义的智能指针
这里主要是练习一下操作符重载。从比较简单的层面来看,智能指针是RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制对普通指针进行的一层封装。这样使得智能指针的行为动作像一个指针,本质上却是一个对象,这样可以方便管理一个对象的生命周期。使用智能指针时要注意,在c++中,智能指针一共定义了4种:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr。其中,auto_ptr 在 C++11已被摒弃,在C++17中已经移除不可用。原创 2022-07-12 19:05:25 · 618 阅读 · 0 评论 -
c++(18)操作符重载
先看一下操作符重载的基本语法,注意在函数声明时,operator操作符重载关键字后不加空格。关于重载的规则(1)c++不允许用户自己定义新的运算符,只能对已有的c++运算符进行重载(2)c++有些运算符不可重载下面是可重载的运算符列表:下面是不可重载的运算符列表:(3)运算符重载不能改变运算符对象(即操作数)的个数(4)重载不能改变运算符的优先级别(5)重载不能改变运算符的结合性(6)重载运算符的函数不能有默认参数(7)重载的运算符,必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类原创 2022-07-11 18:05:35 · 750 阅读 · 0 评论 -
c++(17)友元函数
如果类外部有一个函数经常访问该类的成员变量(private),那么可以在类内加上friend关键字,将类外的函数声明为该类的友元函数,那么可以在友元函数里直接访问类的成员变量(而不需要通过get、set方法)。采用类的机制后实现了数据的隐藏和封装,类的数据成员一般都会定义为私有成员,成员函数一般定义为公有的,依次提供类与外界的通讯接口。但是有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁的访问类的数据成员,这时可以讲这些函数定义为该类的友元函数。除了友元函数,还有友元类,两者统称为友元。友元原创 2022-07-11 11:06:14 · 202 阅读 · 0 评论 -
c++(16)this指针详解
在c++类的静态成员变量和静态成员函数中,多次涉及到了this指针。下面注重介绍一下前面讲static成员变量占用的时候提到,如果sizeof类的大小,是不会计算static成员变量的,同样的也不会计算成员函数,换句话说,其实成员函数是在类外的。那么当我们创建完对象,使用对象的成员函数,它是怎么知道我们访问的是哪个对象的成员变量的?我们知道编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数能在创建对象后通过对象来调用并访问该对象的成员变量。原创 2022-07-06 16:57:29 · 7475 阅读 · 0 评论 -
c++(15)静态成员变量、静态成员函数、static占用大小
1) 一个类中的静态成员变量,所有的对象都共享这些静态成员变量,都可以引用它。2) static 成员变量在全局数据区分配内存,到程序结束时才释放。而且是在类外存储,当求类的大小时,并不会包含在内。====》那么static 成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。3) 静态成员变量必须初始化,且只能在类体外进行。例如:int Student::m_nId = 10;全局数据区的变量都有默认的初始值 04) 静态成员变量既可以通原创 2022-07-06 10:27:45 · 943 阅读 · 0 评论 -
c++(14)new和delete
1、new和delete成对使用2、malloc、free 和 new、delete这两个可以混合使用3、malloc、free 和 new、delete区别:malloc和free是函数,但new和delete是c++中的操作符。new还可以触发类对象的构造函数,malloc在这一点上缺失了一些实用性。同理delete也可以触发对象的析构函数,free不会调用对象的析构函数。这样的话可能会存在一个风险。比如下面的例子执行的结果 我们可以看到,当我们使用malloc的时候,想要初始化成员变原创 2022-07-05 20:51:13 · 303 阅读 · 0 评论 -
c++(13)构造函数的初始化列表
使用场景:当类中的成员变量中有其他类的对象,这时候需要用构造函数的初始化列表,调用对应类的构造函数。1、成员对象的构造顺序和初始化列表的顺序无关,只与成员对象的定义顺序有关。2、成员变量的初始化顺序只与成员变量在类中声明的顺序有关,与初始化列表中列出的变量的顺序无关3、常量的初始化只能在初始化列表中...原创 2022-07-05 19:55:53 · 211 阅读 · 0 评论 -
c++(12)深拷贝、浅拷贝
首先要知道什么是深拷贝和浅拷贝浅拷贝:简单的赋值拷贝操作。深拷贝:在堆区重新申请空间,进行拷贝操作。先说结论:在对含有指针成员的对象进行拷贝时,必须自己定义拷贝构造函数,达到深拷贝的目的,才能避免内存重复释放。看一下下面的例子执行结果,程序崩溃当上面的例子创建对象t1的时候,会调用t1的有参构造,new一个char*空间赋值给m_name,m_name在堆上指向zhang3的地址空间。这里是没有问题的。但是当创建对象t2的时候,使用的拷贝构造的方式创建对象。而且由于程序员没有定义显示的拷贝构造函数,编原创 2022-07-05 16:20:11 · 474 阅读 · 0 评论 -
c++(11)构造函数、析构函数
1、构造函数可以被重载2、析构函数没有形参,自动调用3、构造函数和析构函数,都没有返回值4、默认的无参构造函数和析构函数,默认的构造函数和析构函数,里面没有执行任何代码。一旦程序员提供了一个显示的构造函数(无论是否有参数、无参数)和析构函数,那么默认的构造函数和析构函数就不复存在了。如果有继承关系,那么会先调用基类的构造函数,然后再调用派生类的构造函数。析构函数的调用顺序与构造相反,先构造的后析构。而且,调用构造函数一定会调用析构函数,调用了两次构造函数,一定会调用两次析构函数。除非手动调用析构函数。由已存原创 2022-07-05 15:13:26 · 803 阅读 · 0 评论 -
c++(10)封装、继承、多态
概念:(1)、该隐藏的数据私有化,该公开的公有化(接口)(private、public);(2)、目的就是为了分工合作,有助于使用的方便和安全性;(3)、防止不必要的扩展。概念:(1)、实现代码和数据的复用,复用的实现在已有的代码和数据的基础上扩展。看我之前写的一篇文章,比较详细的介绍了,什么叫多态,怎么使用多态,多态的实现机制。初入c++(六)虚函数实现多态,虚析构函数,虚函数表和多态实现机制,纯虚函数。_Mr.TangR的博客-优快云博客_纯虚函数实现多态...原创 2022-06-21 11:24:45 · 303 阅读 · 0 评论 -
c++(9)默认参数、函数重载、重载的底层实现
必须在函数声明时,定义默认参数,且必须从后往前定义。function overload,用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同。但是函数返回值并不是构成函数重载的条件,即只是函数形参列表相同、函数名相同,但是函数返回值是不同的类型,那么这两个函数不构成函数重载,会报错重定义。函数重载,尽量不要写默认参数,避免调用时发生歧义,编译器不通过。重载规则:(1)、函数名相同。(2)、参数个数不同、参数类型不同、参数顺序不同,均可以构成重载。(3)、返回值类型不同则不可以构成重载。调用原创 2022-06-21 10:03:59 · 505 阅读 · 0 评论 -
c++(8)inline内联函数
C语言中有宏函数的概念。宏函数的特点是内嵌到调用代码中去,避免了函数调用的开销。但是由于宏函数的处理发生在预处理阶段,缺失了语法检测和有可能带来的语意差错。所以c++提供了inline关键字,实现了真正的内嵌。inline函数的特点(1)、内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会忽略内联请求。(2)、c++编译器直接将函数体插入在函数调用的地方展开。(3)、内联函数没有普通函数调用时的开销(压栈、跳转、返回)(4)、内联函数是一种特殊的函数,具有普通函数的特征(参数检查,原创 2022-06-20 19:20:02 · 130 阅读 · 0 评论 -
c++(7)引用作为函数的返回值、指针引用、const引用
引用作为返回值,一般不常见,实际在真正的工作过程中也是极少遇见。引用作为返回值有他的有点,也有他的缺点。看下面的代码getmem1和getmem2,是简单介绍了一下,通过指针可以实现的返回指针的操作。同理,根据上一篇的内容,能用指针实现的。使用引用也可以实现。这里不做过多研究了。下面开始分析:当引用作为返回值,如getA,实际上返回的是一个别名,我们把getA理解是一个局部的变量temp,在函数返回的时候相当于是 int &temp = a;返回的是局部变量a的别名。但是局部变量a在栈上,并当函数返回原创 2022-06-20 18:25:53 · 1094 阅读 · 0 评论 -
c++(6)对C语言的扩充,引用
实际上可以理解成,是一个变量的别名。使用方法结果为a = 100(1)、引用声明的时候必须初始化,一经声明,不可改变。(2)、引用没有定义,是一种关系型声明。类型要与原变量类型保持一致,且不分配内存。与被引用的变量有相同的地址。(3)、可以对引用,再次引用。多次引用的结果,是某一变量具有多个别名。(大名、小名、昵称)(4)、&符号前有数据类型的时候,是引用。其他皆为取地址。(1)作为函数的入参,修改入参的值,降低入参使用难度。这也是c++加入引用的初衷。(2)当入参数据很大时,不需要拷贝操作,不耗费资原创 2022-06-14 15:07:46 · 186 阅读 · 0 评论 -
c++(5)对C语言的增强 三目运算符,const,枚举
我们想要把50的值赋值给a,在C语言中下面的语句,编译会报错。原因是,由于等于号是赋值运算符,左值只能是变量,而不能是数据(常量)。(a原创 2022-06-14 14:11:58 · 260 阅读 · 0 评论 -
c++(4)对C语言的增强
在C语言中,上面的代码编译不会报错。c语言会把第二次的int g_nVal=20;翻译为赋值语句g_nVal=20。像驱动程序员需要关心数据的储存位置,像未定义的全局变量,会储存在bss段。定义全局变量并赋初始值的话 会储存在data段。而在c++语言中,主要是针对应用层,往往不关心储存位置。那么就会对重定义进行严格的检测。...原创 2022-06-07 20:32:11 · 158 阅读 · 0 评论 -
c++(3)自定义命名空间
下面的例子 讲述了自定义命名空间的使用方式。和几种不同的引用定义名称的方法。原创 2022-06-07 14:27:35 · 711 阅读 · 0 评论 -
c++(1)语言特性——面向对象、高效、抽象、建模
一句话概括:c++是一门面向对象,既高效、且具有较强抽象和建模能力的语言!由于其c++语言本身的高效性,应用于系统层软件开发。包括游戏、网络、分布式、云计算、服务器程序开发、科学计算(ACE等科学类库)。c++三大特点——继承、封装、多态。......原创 2022-06-07 10:29:48 · 518 阅读 · 0 评论 -
C++在类中能定义本身类型的成员
C++在类中能定义本身类型的成员吗转载 2022-03-21 15:09:29 · 784 阅读 · 0 评论 -
C++ static静态成员变量详解
对象的内存中包含了成员变量,不同的对象占用不同的内存,这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响。例如有两个相同类型的对象 a、b,它们都有一个成员变量 m_name,那么修改 a.m_name 的值不会影响 b.m_name 的值。可是有时候我们希望在多个对象之间共享数据,对象 a 改变了某份数据后对象 b 可以检测到。共享数据的典型使用场景是计数,以前面的 Student ...原创 2019-10-15 11:19:30 · 331 阅读 · 0 评论 -
c++编程思想
转自:http://www.cnblogs.com/lanxuezaipiao/p/4135105.html C和C++指针的最重要的区别在于:C++是一种类型要求更强的语言。就void 而言,这一点表现得更加突出。C虽然不允许随便地把一个类型的指针指派给另一个类型,但允许通过void 来实现。例如:bird* b; rock* r; void* v; v = r; b = v;转载 2017-07-05 20:49:53 · 313 阅读 · 0 评论 -
初入c++(三)this指针,友元函数,友元类
1.c++中的this指针指向当前对象,通过它可以访问当前对象的所有成员。当前对象就是正在使用的对象;在类的内部使用,可以访问所有的成员,public,private,protectthis只能在非静态成员函数内部使用,在其他地方非法;this 只能在对象创建以后才能使用;否则非法;2.友元函数1.)一个类中可以有 public、protected、privat原创 2017-07-16 19:42:35 · 1988 阅读 · 2 评论 -
初入C++(二)类和对象,构造函数,析构函数
1.c++类的声明和定义。class student{public:char *name;int age;float score;void say();};void student :: say(){cout}这里的函数可以先在类中声明,然后把定义放在外面。这样做完全合法,同时也便于阅读。C++中类定义类的声明部分一般分为原创 2017-07-11 20:06:06 · 521 阅读 · 0 评论 -
初入C++(一) c++中的一些基础和与c的一些区别
1.定义变量的位置在c中,所有的局部变量都必须在函数的开头定义。而在c+中却不是这样的强求,只要在使用该变量之前定义就可以。2.c++中的波尔类型(bool)只有两种情况 就是0和1;掌握bool(波尔)、int(整型)、pointer(指针)、float(实型)这积累数据与0的比较,直接看demo#include using namespace std;int main原创 2017-07-06 20:32:18 · 396 阅读 · 0 评论 -
RTTI机制(运行时类型识别)
1.RTTI机制(运行时类型识别)在多态里面,基类里的虚函数和派生类里的虚函数形成了遮蔽,这就导致在主程序运行时,有些表达式的类型没有办法确定。必须等到程序运行结束后,根据具体的环境才能确定。看下面的代码:#include #include using namespace std;class base{public: virtual void func();protected原创 2017-07-20 19:22:10 · 477 阅读 · 0 评论 -
初入c++(七)运算符的重载+、-、*、/、[]、自加++的重载
1.为什么要用到运算符的重载所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能.看下面这个代码:怎样实现虚数的加减。#include using namespace std;cla原创 2017-07-20 19:52:07 · 824 阅读 · 0 评论 -
初入c++(四)string类和c++中的引用
1.string类 a.包含头文件 string s1; 定义的时候没有初始化,默认是空; string s2 = "c plus"; 定义并初始化 c plus ,没有\0; string s3 = s2; 定义s3,并把s2赋值给s3; string s4 (3, 's'); 初始化为3个s; string 输入时,cin是原创 2017-07-17 17:59:55 · 1480 阅读 · 0 评论 -
初入c++(五)
1.继承继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程。继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产。例如类 B 继承于类 A,那么 B 就拥有 A 的成员变量和成员函数。被继承的类称为父类或基类,继承的类称为子类或派生类。派生类自己还可以定义自己的新成员,用来增强派生类的功能。当原创 2017-07-17 23:48:54 · 444 阅读 · 0 评论 -
初入c++(六)虚函数实现多态,虚析构函数,虚函数表和多态实现机制,纯虚函数。
1.c++多态的概念以及用途。1.1虚函数实现多态通过基类指针只能够访问派生类的成员变量,不能够访问派生类的成员函数。解决问题的办法:使用虚函数(virtual function),只需要在函数声明前面增加virtual关键字。看下面的代码。#include using namespace std;class people{public : people(char *原创 2017-07-18 20:03:10 · 500 阅读 · 0 评论 -
初入c++ (八) c++输入和输出
1.基础知识C++输入输出包含以下三个方面的内容:1.对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。2.以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。3.对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空原创 2017-07-23 20:27:35 · 652 阅读 · 0 评论 -
C++ 继承的构造与析构
继承的构造与析构子类对象的构造子类中可以定义构造函数子类构造函数 必须对继承而来的成员进行初始化 直接通过 初始化列表 或者 赋值的方式 进行初始调用父类构造函数 进行初始化父类构造函数在子类中的调用方式 默认调用 适用于无参构造函数和使用默认参数的构造函数显示调用 通过 初始化列表 进行调用适用于所有父类构造函数父类构造转载 2017-07-03 18:45:02 · 320 阅读 · 0 评论