自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

LC的专栏

Linux系统编程的布道者,一起学习 Linux C/C++程序设计,Linux系统编程

  • 博客(296)
  • 资源 (35)
  • 问答 (1)
  • 收藏
  • 关注

原创 韦凯峰Linux编程零基础学习系列 学习视频上线啦!

希望每一个零基础的同学,都可以掌握Linux编程。循序渐进、由浅入深、一步一个脚印,扎实掌握每一个编程技能。韦凯峰 Linux C/C++ 零基础编程学习系列, 从零基础入门、到提高、最后实践开发产品!《Linux C 程序设计》、《Linux C++程序设计》、《Linux 系统编程》程的技能,让读者的世界可以打开一展新的大门,进入计算机的世界!百度搜索:韦凯峰Linux编程、韦凯峰Linux编程学堂。我们在努力践行,做一个Linux编程的布道者!让读者可以零基础入门,掌握 Linux 系统编。

2023-10-25 08:36:24 131

原创 Linux C/C++ 零基础学习编程教程,Linux 系统编程教程

人生有多少个十年?从毕业至今,十年以来,一直在一线城市深圳,一直是一线开发人员,一直在 Linux 系统环境下开发软件。做过多款得到客户肯定的产品;也给自己积累、沉淀了一定的Linux系统下编程技能。 现在,整理一些 linux C/C++ 编程的入门资料;发布到博客,希望能够帮助到零基础入门的朋友!可以加QQ,微信交个朋友!QQ:1523520001微信:13926572996...

2018-07-11 11:42:28 2239

原创 try-catch默认捕获所有异常

此时,抛出一个字符串。但是,在try-catch语句中,设置的catch捕获参数的int, double类型。那么,抛出的异常与捕获的异常信息类型不一致,所以,就没有进入对应的catch语句块中。但是,最终,会进入catch(...)语句块中,它会捕获所有的异常消息。在程序开发的过程中,我们可能会调用其他软件库,那么,在软件库中抛出异常时,我们无法知道异常的类型,那么,应该怎么样捕获?就是在catch语句的括号中,使用省略号,表示捕获所有异常的信息。cout

2023-02-10 21:05:23 1695 1

原创 C++ try-catch语法分析与应用

当throw抛出异常信息之后,首先中本函数中选择与之匹配的catch,如果在本函数中无try-catch结构或找不到与之匹配的catch,就转到其上一层去处理,如果其上一层也无try-catch结构,或找不到与之匹配的catch,则再转到更上一层的try-catch结构去处理,也就是说,总是转到离开出现异常最近的try-catch结构去处理。此时,如果throw抛出的异常信息是double类型的变量a,则catch在捕获异常信息a的同时,还使得d获得a的值,或者说d得到a的一个拷贝。什么时候需要这样做呢?

2023-02-10 21:04:14 4954

原创 C++异常处理方法

如果在每一个函数中都设置处理异常的程序段,会使程序过于复杂和庞大,因此,C++采取的办法是:如果在执行一个函数过程中出现异常,可能不再本函数中处理,而是发出一个消息,传给它的上一级(即调用它的函数),它的上级捕捉到这个信息后进行处理。总的来说,这种错误是比较容易发现和校正的,因为,它们一般都是有规律的,在有了一定的编译经验以后,可以很快地发现出错的位置和原因并加以改正。人们希望程序不仅在正确的情况下能够正确运行,而且,程序出错的情况下,也能够作出相应的处理,而不致使程序莫名其妙地终止,甚至出现死机的现象。

2023-02-10 21:02:06 481

原创 C++模板参数类型列表

此时,对应设置T = int, TString = char*, C = double。然后,再实例化一个test类,再去定义对象。我们学习了模板函数和模板类的定义和使用。但是,看到的“类型形参表”都只有一个元素,那么,如果要定义多个类型,应该怎么样操作?在telplate中,“类型形参表”可以定义多个类型,类型直接使用逗号“,”分隔。每个类型之间,使用逗号分隔。此时,在模板函数或者模板类中,可以有多个动态绑定的类型。

2023-02-10 21:01:16 923

原创 C++模板类使用

模板类提供了一个机制:让用户为类定义一个类的模板。就是说,类的定义中,使用的某些数据类型,是在类定义对象的时候,才动态设置。可以看到,我们定义了一个模板类test,在模板类test中使用的形参类型由T符号表示。这个“动态绑定”与模板函数一样,模板函数中是的数据类型,在函数的实际调用中才确定类型。所有,在定义模板类对象的时候,给模板类设置具体的类型。函数类型 类模板名::成员函数名(函数形参列表)定义模板类之后,可以使用模板类来定义一个对象。类模板名 对象名;

2023-02-10 20:59:00 261

原创 C++模板函数使用

函数模板可以增加代码重用率,它使用非特定类型定义类和函数,到实际调用函数的时候,再用特定的类型代替它们。所以,我们用模板函数的技术,优化上面重载的my_max()函数。那么,在调用一个模板函数的时候,根据传递给模板函数的参数类型,才确定T1,T2,T3表示的类型,才定义一个具体的函数。参数是一个int类型,所以,对应 my_max(T x, T y);所以,模板函数中的类型参数,是根据函数的实际调用,再确定参数类型。那么,在my_max()模板函数的实际调用中,根据操作数据的类型,再决定T是那个数据类型。

2023-02-10 20:58:36 382

原创 C++模板定义

由于模板可以实现逻辑相同,数据类型不同的程序代码的复制,所以,使用模板机制可以减轻编程和维护的工作量和难度,模板一般分为模板函数和模板类。在学习函数的重载时,我们可以定义一个同名函数,但是,函数的形参列表不一样,那么,就定义了重载函数。那么,重载的这三个my_max()同名函数,函数的定义基本一样,只有函数的返回值类型和参数类型不同,那么,有什么办法可以简化这些函数的定义?才形成一个具体的函数,由程序调用。此时,定义对象的时候,在中指定具体的类型,构建一个具体的类,然后,再用该类来定义对象。

2023-02-10 20:57:01 111

原创 C++命名空间应用

那么,在C++语言中,支持的了“命名空间”的机制,可以把我们编写的代码封装到一个命名空间中,当我们想使用其中的代码时,该命名空间就可以了。那么,我们一般的解决方法是定义成不同的类名,例如程序员A定义的类是string_A,,程序员B定义的类是string_B,这样,够避免类名相同产生的冲突。所以,我们同时引入wkf, std命名空间,那么,wkf命名空间中定义的max()函数与std命名空间中定义的max()函数同名。函数,已经在系统中定义过来,包含着系统定义的 std 命名空间中。

2023-02-10 20:52:35 159

原创 C++ using导入命名空间

上面我们学习了通过“域作用符”对命名空间代码的引用,但是,当程序集成了多个命名空间的代码,每次调用函数的时候,需要拼写命名空间的名称,这样的引用比较麻烦。那么,在引用命名空间内的变量和函数,就可以不用域作用符来指定命名空间。这样的代码编写,就比较符合正常的代码开发。所以,当我们需要导入一个命名空间的大量代码,就可以使用using关键字来导入命名空间。那么,C++引入using关键字,可以导入一个命名空间。//引用snB命名空间;5 通过using导入命名空间。

2023-02-10 20:51:42 252

原创 C++通过域作用符引用命名空间

由于这些同名变量和同名函数是定义在不同的命名空间中,所以,不会引起冲突。那么,当我们需要引用这些变量和函数的时候,可以通过域作用符“::”来访问。例如snA::func()就表示使用snA命名空间内func()函数。可以看到,我们定义了命名空间snA, snB,然后,在这些命名空间中都定义了同名的变量val和同名函数func()。学习了命名空间的定义,举例对命名空间的使用。4 通过域作用符引用命名空间。

2023-02-10 20:50:30 83

原创 C++命名空间定义和使用

namespace 是定义命名空间所必须写的关键字,wkf_sn是用户自己指定的命名空间的名字(可以用任意合法标识符,这里用 wkf_sn是因为 ns 是 namespace 的缩写,含义清楚),中花括号内是声明块,在其中声明的实体称为命名空间成员(namespace member)。C++中命名空间的作用类似于操作系统中的目录和文件的关系,由于文件很多,不便管理,而且容易重名,于是,人们设立若干子目录,把文件分别放到不同的子目录中,不同子目录中的文件可以同名。最终,通过定义类对象,可以调用相同的函数名。

2023-02-10 20:49:28 940

原创 C++抽象类

那么,这种不用来定义对象而只作为一种基本类型用作继承的类,称为:抽象类(abstract class),由于它常用作基类,通常称为“抽象基类(abstract base class)”。这个animal基类不是一个具体的动物,它不可以定义对象,只有从animal类派生出来的派生类才可以定义对象。如果在抽象类所派生出的新类中对基类的所有纯虚函数进行了定义,那么,这些函数就被赋予了功能,可以被调用。当派生类成为具体类之后,就可以用这种指针指向派生类对象,然后,通过该指针调用虚函数,实现多态性的操作。

2023-02-10 20:46:36 199

原创 C++纯虚函数

就是说,基类animal把一个动物的属性和行为都定义好,然后,派生类根据自己派生的动物,再定义不同的属性和行为。那么,基类只需要提供函数的声明,派生类再定义函数的具体实现。在派生类中对此函数定义后,它才能具备函数的功能,可以被调用。纯虚函数是在声明函数的时候,被“初始化为0”的函数。定义了dog对象,然后,销毁对象的时候,调用了dog的析构函数,再调用dog继承的基类animal的析构函数。如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数。

2023-02-10 20:44:59 140

原创 C++虚析构函数

当基类的析构函数为虚函数的时候,无论指针指向的同一族类中的哪一个类对象,当对象撤销的时候,系统会采用动态关联,调用相应派生类的析构函数,对该对象进行清理工作。专业人员一般都习惯声明虚析构函数,即使基类并不需要析构函数,也显式地定义一个函数体为空的虚析构函数,以保证在撤销动态存储空间时能够得到正确的处理。当派生类的对象从内存中撤销的时候,一般先调用派生类的析构函数,然后,再调用基类的析构函数。那么,这样的操作就会导致错误。那么,看到这个特性,我们良好的编程习惯应该是:所有的类析构函数,都声明为虚函数。

2023-02-10 20:44:24 135

原创 C++虚函数

(1) 在基类用virtual 声明成员函数为虚函数。(4) 通过基类指针pa访问sleep()函数,此时,由于sleep()函数没有生命为虚函数,那么,访问的是dog对象中基类animal定义的sleep()函数;(2) 在派生类中重新定义此函数,要求函数名,参数个数,参数类型 以及 函数返回类型,都完全与基类的虚函数相同,并根据派生类的需要重新定义函数体。(6) 通过基类指针pa访问run()函数,访问的是派生类cat对象中定义的ruan()函数,而不是基类animal对象中定义的run()函数。

2023-02-10 20:42:20 105

原创 C++多态性

以前学过的函数重载和运算符重载实现的多态性是属于静态多态性,在程序编译时系统就能决定调用的是哪个函数,因此,静态多态性又称为“编译时的多态性”。不同的对象会作出不同的响应:学生准备好课本准时到学校上课,家长要筹集学费,老师要备好课等等,由于事先对各种人员的任务已经作了规定,因此,在得到同一个消息的时候,各种人都知道自己应当怎么样去做,这就是多态性。上面我们描述了“多态性”的定义,那么,我先来看看之前学习过了“函数重载”,就定义多个函数,函数的名称可以一样,函数的参数类型不同。所以,称为:静态多态性。

2023-02-10 20:41:13 156

原创 基类与派生类转换-指针赋值

因为,一个基类对象的成员中,根本就没有派生类对象中自己新增的成员。经过这些测试,我们可以总结出:不可以把一个基类对象赋值给派生类对象,否则,导致派生类对象中自己新增的成员没有初始化,得到一个不完整的派生类对象。因为,ps指向的是派生类student_new类型的对象,但是,给ps赋值的是基类student对象。可以看到,引用赋值,不可以把一个基类student对象,设置给派生类student_new的引用。可以看到,编译错误,无法把派生类student_new的对象,赋值给基类student对象。

2023-02-10 20:39:44 203

原创 基类与派生类转换-引用赋值

可以看到,定义了一个student_new类对象stud,然后,定义一个student类型的引用s对象。引用s对象引用的是stud对象。注意:s对象是一个引用,所以,销毁的时候,不会调用student类的析构函数。所以,不会导致stud.name成员内存的重复释放。上面我们讨论了“派生类对象给基类对象赋值”的操作。那么,基类对象得到派生类对象从基类继承过来的数据。那么,通过引用s对象可以访问stud对象从基类student继承过来的数据。

2023-02-10 20:38:08 110

原创 基类与派生类转换-对象赋值

那么,student_new从student继承过来的数据是私有信息,stud对象中的student信息无法赋给s对象。所以,s对象输出的name等信息,就是stud对象设置基类student的name信息。因为,stud对象赋值给s对象的时候,把stud.name赋值给s.name,那么,对象s消耗的时候,释放了s.name内存块,导致stud.name内存块也被释放。所以,派生类对象中拥有基类对象的一份代码。如果把一个派生类对象赋给基类对象,那么,基类对象获取到的是派生类中定义基类的那部分代码。

2023-02-10 20:37:35 118

原创 C++虚基类初始化

虚基类A,B的的构造函数中,即使调用了基类X的构造函数,还是无法调用基类X的构造函数。即使在虚基类A,B中对基类X进行初始化,还是没有调用基类X对应的构造函数。如果在虚基类中定义了带参数的构造函数,而且没有定义默认构造函数,则在其所有派生类(包括直接派生或间接派生的派生类)中,通过构造函数的初始化表对虚基类进行初始化。在虚基类A,B的构造函数中,也对基类X进行初始化。C(int n): A(n), B(n), X(n) //类C的构造函数,在初始化列表中对所有基类(包括基类X)初始化。

2023-02-10 20:35:41 400

原创 C++虚基类作用

注意:虚基类并不是在声明基类的时候,声明一个基类是需基类,而是在声明派生类的时候,指定继承方式时声明的。因为,一个基类可以在生成一个派生类的时候,作为虚基类,而在生成另一个派生类的时候,不作为基类。经过这样的声明后,当基类通过多条派生类路径被一个派生类继承时,该派生类只继承该基类一次,也就是说,基类成员只保留一份。其中,定义基类X,派生类A是虚基类,而派生类B不是虚基类。此时,派生类C继承基类A,基类B,存在两份相同的基类X。那么,当派生类C继承于基类A,基类B的时候,就只有一份从基类X继承过来的代码。

2023-02-10 20:34:40 816

原创 C++基类相同的菱形结构问题

所以,可以看看的,对于这种菱形派生结构,派生类有多个相同的基类,就导致有多份基类的相同成员。当调用基类的成员时,无法确定是调用哪个基类的成员。那么,对象c调用print()函数的时候,就无法确定是调用哪个一个print()函数。我们定义一个派生类C的对象c,然后,通过对象c调用print()函数。这种例子中,派生类C同时继承于基类A,基类B。而且,基类A,基类B又继承于基类X。所以,在基类A,基类B中同时拥有print()函数的定义。最后,定义一个派生类C,继承于基类A和基类B。(1) 定义一个基类X;

2023-02-10 20:31:29 76

原创 C++基类与派生类同名成员

那么,定义类B对象,调用print()函数的时候,调用的是类B定义的print()函数。注意:不同的成员函数,只有在函数名和参数个数相同,类型相匹配的情况下才会发生同名覆盖,如果只有函数名相同,参数不同,不会发生同名覆盖,而是属于函数重载。可以看到,在派生类B的print()函数中,通过类名A,可以访问从基类A继承过来的成员变量val和成员函数print()。所以,当基类和派生类存在同名成员的时候,派生类定义的对象,调用同名成员时,优先调用的是派生类定义的同名函数。那么,怎么样调用基类的同名函数?

2023-02-10 20:30:12 1076

原创 C++多重继承异常问题

由于基类A和基类B都有成员变量val和成员函数print(),编译系统无法判别要访问的是哪一个基类的成员,因此,程序编译出错。C++的多重继承虽然可以解决很多设计问题,同时,也带来其他问题。可以看到,对象c通过基类A,B的类名,可以指定访问哪个基类的成员变量或者成员函数。那么,如果类A和类B中都有成员函数print()和成员变量a,类C是类A和类B的直接派生类。所以,当多重继承存在同名的成员时,可以通过基类的类名来指定访问那个基类的成员。那么,对象c调用print()函数的时候,无法确定是调用哪一个函数。

2023-02-10 20:28:04 352

原创 C++多重继承

那么,D 是多重继承的派生类,它以公有继承方式继承A类,以私有继承方式继承B类,以保护继承方式继承C类。基类出现的顺序为A, B, C,那么,先调用基类A的构造函数,再调用基类B的构造函数,然后,调用基类C的构造函数,最后,再调用派生类D的构造函数。在软件开发过程中,很多情况下,一个派生类有多个基类,此时,派生类继承多个基类,称为:多重继承(multiple inheritance)。所以,执行构造函数的过程也是先执行类A构造函数,再执行类B构造函数,最后,执行类C构造函数。3 多重继承派生类的构造函数。

2023-02-10 20:26:58 307

原创 C++派生类析构函数

例如,内存溢出的问题,就需要合理地设计构造函数和析构函数。析构函数的调用顺序与构造函数正好相反:先执行派生类自己的析构函数,对派生类新增加的成员进行清理,然后,调用子对象的析构函数,对子对象进行清理,最后,调用基类的析构函数,对基类进行清理。那么,执行析构函数的顺序与构造函数相反,先执行student_new类的析构函数,然后,执行子对象my_stud的析构函数,最后,执行基类student的析构函数。此时,先执行基类student的构造函数,然后,再执行my_stud对象的构造函数。

2023-02-10 20:23:39 129

原创 C++派生类构造函数特殊形式

可以看到定义了student基类,该基类定义了一个无参构造函数。那么,定义派生类student_new的构造函数时,不用调用基类student的构造函数进行初始化。因为,它们都自动调用了基类student的无参构造函数。如果派生类的成员变量是类对象,对象的类没有定义构造函数,或者定义无参构造函数。那么,在派生类的构造函数,也不用对成员变量的对象进行初始化。在定义派生类的时候,如果基类没有定义构造函数,或者定义了无参构造函数。那么,派生类的构造函数可以不用调用基类构造函数初始化。

2023-02-10 20:22:56 77

原创 C++子对象派生类构造函数

可以看到,定义了基类student和派生类student_new,在student_new的成员变量中,定义了一个student类型的子对象my_stud。此时,my_stud就是类对象中的内嵌对象,称为:子对象(subobject),即对象中的对象。那么,如果在派生类的成员变量中定义了C++类对象,那么,在派生类的构造函数中,怎么样初始化C++类对象的成员变量?在定义student_new派生类的时候,定义类的成员变量,其中my_stud成员变量是一个student类对象。

2023-02-10 20:21:06 527

原创 C++派生类构造函数

派生类构造函数的主干,它和以前介绍过的构造函数的形式相同,但是,它的总参数列表中包括基类构造函数所需的参数和派生类新增的成员变量初始化所需的参数。基类的构造函数是不能继承的,在声明派生类的时候,派生类并没有把基类的构造函数继承过来,因此,对继承过来的基类成员初始化的工作,也要由派生类的构造函数承担。其中,派生类的构造函数名是student_new(),在函数末尾,添加一个冒号“:”,然后, 跟着基类student的构造函数。其中,前2个参数赋给基类的构造函数,调用基类的构造函数。

2023-02-10 20:19:55 863

原创 C++多级派生访问属性

定义派生类student_new,从基类student私有派生而来,那么,基类student中的所有数据在student_new中都是私有。那么,在派生类student_v1中就定义print_v1()函数,调用派生类的print_new()函数,输出从派生类继承过来的数据。所以,派生类student_new中访问基类student的print()函数,可以访问基类student中的私有数据。那么,如果又有一个新的类student_v1 从 student_new类派生,会是怎么样的情况?

2023-02-10 20:18:25 168

原创 C++保护成员和保护继承

保护继承的特点是:保护基类的公有成员和保护成员在派生类中都成了保护成员,其私有成员仍然为基类的私有,也就是说把基类原有的公有成员也保护起来,成为派生类的保护成员,不能够在类外访问。(4) 不可访问的(例如,一个类A有私有成员num,那么,类B从类A私有派生而来,A是私有基类,那么,A类中的私有成员在类B中是不可见的,即不可访问),派生类内和派生类外都不可访问。保护基类的所有成员在派生类中都被保护起来,类外不能够访问,其公有成员和保护成员可以被其派生类的成员访问。下面通过一个例子,说明怎么样访问保护成员。

2023-02-10 20:17:03 1891

原创 C++私有继承

私有基类的私有成员按规定只能被基类的成员函数所访问,在基类外当然不能够被访问它们,因此,它们在派生类中山隐藏的,不可访问。私有基类的公有成员和保护成员在派生类中的访问属性,相当于派生类中的私有成员,即派生类的成员函数能访问它们,而在派生类外不能访问它们。私有基类的私有成员在派生类中成为不可访问的成员,只有基类的成员函数可以引用它们。提示在main()函数中,对stud.name成员变量的访问异常,是private属性,所以,不可以在类外进行访问。所以,一个成员在不同的派生层次中的访问属性可能是不同的。

2023-02-10 20:15:57 2352

原创 C++公有继承

有人问:既然是公有继承,为什么不能够访问基类的私有成员呢?如果派生类再继续派生一个新的派生类,也能访问基类的私有成员,那么,在这个基类的所有派生类的层次上都可以访问基类的私有成员,这就完全丢弃了封装性带来的好处,保护私有成员是一条重要的原则。采用公有继承方式时,基类的公有成员和保护成员在派生类中仍然保持其公有成员和保护成员的属性,而基类的私有成员在派生类中并没有成为派生类的私有成员,它仍然是基类的私有成员,只有基类的成员函数可以引用它们,而不能被派生类的成员函数引用,因此,就成为派生类中不可以访问的成员。

2023-02-10 20:14:37 659

原创 C++派生类成员访问属性

在建立派生类的时候,并不是简单地把基类的私有成员直接作为派生类的私有成员,把基类的公有成员直接作为派生类的公有成员。(1) 基类中的成员函数是可以访问基类中的任一成员的,那么,派生类中新增加的成员,例如,上面定义的student_new类新增加的print_new();这些牵涉到如何确定基类的成员在派生类中的访问属性的问题,不仅要考虑对基类成员所声明的访问属性,还要考虑派生类所声明的对基类的继承方式,根据这两个因素共同决定基类成员在派生类中的访问属性。(3) 基类的成员函数访问派生类的成员。

2023-02-10 20:13:19 321

原创 C++派生类定义

派生类中声明一个与基类成员同名的成员,那么,派生类中的新成员会覆盖基类的同名成员,但是,应该注意:如果是成员函数,不仅应使函数名相同,而且函数的参数表(参数的个数和类型)也应该相同。尤其是多次派生之后,会在许多派生类对象中存在大量无用的数据,不仅浪费了大量的空间,而且在对象的建立,赋值,复制和参数的传递中,花费了许多无谓的时间,从而降低了效率。可以先声明一个基类,在此基类中只提供某些最基本的功能,而另外有些功能并未实现,然后,在声明派生类时加入某些具体的功能,形成适用于某一特定应用的派生类。

2023-02-10 20:12:50 150

原创 C++派生类声明方式

在class后面的student_new是新建的类名,冒号后面的student表示是已声明的基类。在student之前有一关键字public,用来表示基类student中的成员在派生类student_new中的继承方式。C++提供了“继承”的机制,可以定义一个基类,然后,通过继承的方式,得到一个派生类。继承方式包括:public(公有的),private(私有的)和protected(受保护的),继承方式是可选的,如果不写此项,则默认为private。class 派生类名:[ 继承方式 ] 基类名。

2023-02-10 20:10:45 445

原创 C++类的继承与派生 继承与派生类的概念

相当于一个大的家族,有许多分支,所有的子孙后代都继承了祖辈的基本特征,同时又有区别和发展,与之相仿,类的每一次派生,都继承了其基类的基本特征,同时又根据需要调整和扩充原有的特征。然后,需要定义的黑猫,白猫这些类,就可以继承基础的“猫”类。(E) 定义一个新的类,在黑猫类增加一个属性:猫的性别是母,就得到一个新的类:母黑猫类。(F) 定义一个新的类,在黑猫类增加一个属性:猫的性别是公,就得到一个新的类:公黑猫类。(B) 定义一个新的类,在猫类增加一个属性:猫的毛色是黑色,就得到一个新的类:黑猫类。

2023-02-10 20:09:26 380

原创 C++类型转换函数

在前面列出的类型转换函数中,char*类型经过重载后,除了原有的含义外,还获得新的含义(将一个my_int类对象转换为char*类型字符串数据,并指定了转换方法)。请注意:函数名是operatro char*(),这点是和运算符重载时的规律一致的,例如,在重载加运算符“+”的时候,有定义重载函数的函数名是operator +()。函数返回char*类型变量str的值,它的作用是将一个my_int类对象转换为一个char*字符串类型数据,其值是my_int类中的val成员变量的值。{ 实现转换的语句;

2023-02-09 19:54:51 504

第22章 韦凯峰零基础学习Linux C程序设计 - 实践项目 - 学生信息管理系统.pdf

第22章 韦凯峰零基础学习Linux C程序设计 - 实践项目 - 学生信息管理系统

2021-05-17

第15章 韦凯峰零基础学习Linux C程序设计 - 指针知识详细分解 - 第2讲.pdf

第15章 韦凯峰零基础学习Linux C程序设计 - 指针知识详细分解 - 第2讲

2021-05-17

第15章 韦凯峰零基础学习Linux C程序设计 - 指针知识详细分解 - 第1讲.pdf

第15章 韦凯峰零基础学习Linux C程序设计 - 指针知识详细分解 - 第1讲

2021-05-17

第1章 韦凯峰零基础学习Linux C程序设计 - 选择Linux C编程.pdf

第1章 韦凯峰零基础学习Linux C程序设计 - 选择Linux C编程

2021-05-17

bonjoursdksetup 支持 airplay 发现的mdnsd服务

bonjoursdksetup 支持 airplay 发现的mdnsd服务,Bonjour是Apple推出的零配置网络协议,主要的目的是在缺少中心服务器的情况下解决网络设备的IP获取,名称解析和服务发现等关键问题。 Bonjour这个词来源于法语,是“你好”的意思,应该是指遵从这个协议的设备可以通过主动打招呼的形式发现彼此。Bonjour的法语发音大概为“甭油喝”,我们不会读法语,也不会延用法语发音,Bonjour的英语发音大概是“帮就而”,重音在第一个音节。

2019-04-02

rfc3550 RTP协议中文版本

目录(Table of Contents) 1. 引言 (Introduction) 1 1 术语(Terminology) 2 RTP使用场景(RTP Use Scenarios) 2 1 简单多播音频会议( Simple Multicast Audio Conference) 2 2 音频和视频会议(Audio and Video Conference) 2 3 混频器和转换器(Mixers and Translators) 2 4 分层编码(Layered Encodings) 3 定义(Definitions) 4 字节序,校正和时间格式(Byte Order, Alignment, and Time Format) 5 RTP数据传输协议(RTP Data Transfer Protocol) 5 1 RTP固定头域(RTP Fixed Header Fields) 5 2 多路复用RTP会话(Multiplexing RTP Sessions) 5 3 RTP头的配置文件详细变更(Profile-Specific Modifications to the RTP Header) 5 3 1 RTP报头扩展(RTP Header Extension) 6 RTP控制协议(RTP Control Protocol) -- RTCP 6 1 RTCP包格式(RTCP Packet Format) 6 2 RTCP传输间隔(RTCP Transmission Interval) 6 2 1 维护会话成员数目(Maintaining the number of session members) 6 3 RTCP包的发送与接收规则(RTCP Packet Send and Receive Rules) 6 3 1 计算RTCP传输间隔(Computing the RTCP Transmission Interval) 6 3 2 初始化(Initialization) 6 3 3 接收RTP或RTCP(非BYE)包(Receiving an RTP or Non-BYE RTCP Packet) 6 3 4 接收RTCP(BYE)包(Receiving an RTCP BYE Packet) 6 3 5 SSRC计时失效(Timing Out an SSRC) 6 3 6 关于传输计时器的到期(Expiration of Transmission Timer) 6 3 7 传输一个 BYE 包(Transmitting a BYE Packet) 6 3 8 更新we_sent(Updating we_sent) 6 3 9 分配源描述带宽(Allocation of Source Description Bandwidth) 6 4 发送方和接收方报告(Sender and Receiver Reports) 6 4 1 SR:发送方报告的RTCP包(SR: Sender report RTCP packet) 6 4 2 RR:接收方报告的RTCP包(RR: Receiver Report RTCP Packet) 6 4 3 扩展发送方和接收方报告(Extending the Sender and Receiver Reports ) 6 4 4 分析发送方和接收方报告(Analyzing Sender and Receiver Reports ) 6 5 SDES:源描述RTCP包(SDES: Source description RTCP packet) 6 5 1 CNAME:规范终端标识符的SDES数据项(CNAME: Canonical End-Point Identifier SDES Item) 6 5 2 NAME:用户名的SDES数据项(NAME: User name SDES item) 6 5 3 EMAIL:电子邮件地址的SDES数据项(EMAIL: Electronic Mail Address SDES Item) 6 5 4 PHONE:电话号码的SDES数据项(PHONE: Phone Number SDES Item) 6 5 5 LOC:地理用户地址的SDES数据项(LOC: Geographic User Location SDES Item) 6 5 6 TOOL:应用程序或工具名字的SDES数据项(TOOL: Application or Tool Name SDES Item) 6 5 7 NOTE:通知/状态的SDES数据项(NOTE: Notice/Status SDES Item) 6 5 8 PRIV:私有扩展的SDES数据项(PRIV: Private Extensions SDES Item) 6 6 BYE:Goodbye RTCP包(BYE: Goodbye RTCP packet) 6 7 APP:定义应用程序的RTCP包(APP: Application-Defined RTCP Packet) 7 RTP转换器和混频器(RTP Translators and Mixers) 7 1 概述(General Description ) 7 2 在转换器中的RTCP数据处理(RTCP Processing in Translators) 7 3 在混频器中的RTCP数据处理(RTCP Processing in Mixers ) 7 4 级联混频器(Cascaded Mixers) 8 SSRC标识符的分配和使用(SSRC Identifier Allocation and Use) 8 1 冲突概率(Probability of Collision ) 8 2 冲突解决和循环检测(Collision Resolution and Loop Detection) 8 3 在分层编码中使用(Use with Layered Encodings) 9 安全(Security ) 9 1 机密性(Confidentiality) 9 2 身份验证和消息完整性(Authentication and Message Integrity) 10 拥塞控制(Congestion Control) 11 网络和传输协议之上的RTP(RTP over Network and Transport Protocols) 12 协议常量摘要(Summary of Protocol Constants) 12 1 RTCP 包类型(RTCP Packet Types) 12 2 SDES 类型(SDES Types) 13 RTP概况和负载格式详细说明     (RTP Profiles and Payload Format Specifications) 14 安全考虑(Security Considerations) 15 IANA考虑(IANA Considerations) 16 知识产权声明(Intellectual Property Rights Statement) 17 鸣谢(Acknowledgments) 附录 A 算法(Algorithms) 附录 A 1 RTP数据头有效性检查(RTP Data Header Validity Checks ) 附录 A 2 RTCP数据头有效性检查(RTCP Header Validity Checks) 附录 A 3 确定RTP包预期数目和丢失数目(Determining Number of Packets Expected and Lost) 附录 A 4 生成SDES RTCP包(Generating RTCP SDES Packets) 附录 A 5 解析RTCP SDES包(Parsing RTCP SDES Packets) 附录 A 6 生成32位随机标识符(Generating a Random 32-bit Identifier

2018-04-18

测试 service client

该项目,是参考《Android 系统源代码情景分析 罗升阳.pdf》 5.3 Binder进程间通信应用实例; 在 Android 2.3.7 源码中使用; 1 把 binder 目录,拷贝到源码的 external 目录下; 2 在根目录下,编译: mmm ./external/binder/client mmm ./external/binder/server make snod 然后,重新加载启动 Android 系统; 3 通过 adb 进入系统,执行: FregServer --- 启动 server 进程,注册 service 组件; FregClient --- 请求 service 组件提供的接口服务;

2017-10-18

binder 测试 service client

该项目,是参考《Android 系统源代码情景分析 罗升阳.pdf》 5.3 Binder进程间通信应用实例; 在 Android 2.3.7 源码中使用; 1 把 binder 目录,拷贝到源码的 external 目录下; 2 在根目录下,编译: mmm ./external/binder/client mmm ./external/binder/server make snod 然后,重新加载启动 Android 系统; 3 通过 adb 进入系统,执行: FregServer --- 启动 server 进程,注册 service 组件; FregClient --- 请求 service 组件提供的接口服务;

2017-10-18

Linux内核精髓:精通Linux内核必会的75个绝技

Linux内核精髓

2017-03-01

UnixLinux编程实践教程

UnixLinux编程实践教程

2017-03-01

HTML5从入门到精通 中文学习教程

HTML5从入门到精通

2017-03-01

C++ 编程惯用法 - 高级程序员常用方法和技巧.pdf

C++ 编程惯用法 - 高级程序员常用方法和技巧.pdf

2017-03-01

USER32.LIB

USER32.LIB

2017-03-01

多线程编程

多线程编程

2017-01-16

FAT32文件系统详解

FAT32文件系统详解,对了解FAT32协议有相关的帮助,谢谢

2016-09-12

CListBox修改文件显示

CListBox控件,继承CListBox,然后添加颜色控件的变量,在addString(文本,rgb),可以改变字体颜色!

2016-07-01

房产信息网ASP.NET

这是本人的一个实训,是使用ASP.NET来实现的,里面也包含了数据库,只有把数据库导入到SQLSERVER2000中就可以运行了。希望能够对朋友您有一点帮助。

2010-03-01

数据结构中关于字符串的实验演示

这是数据结构中关于字符串这个知识点的一个实验的演示,是使用C++实现的,希望能够对学习数据结构中的关于字符串的朋友有用。

2009-05-09

数据结构中关栈的顺序存储结构

这是数据结构中关于栈这个知识点的一个顺序存储实验的演示,是使用C++实现的,希望能够对学习数据结构中的关于栈的朋友有用。

2009-05-09

数据结构的最小生成树

在这个程序中是使用C++实现了数据结构中关于图这个知识点的实现。程序中完成了最小生成树的实现,希望能够对学习关于图的朋友有用

2009-05-09

数据结构中通讯录的演示

这是数据结构中关于队列这个知识点的一个实验的通讯录演示,是使用C++实现的,希望能够对学习数据结构中的关于队列的朋友有用。

2009-05-09

数据结构中顺序表存储结构的演示

这是数据结构中关于顺序表这个知识点的一个实验的演示,是使用C++实现的,希望能够对学习数据结构中的关于顺序表存储的朋友有用。

2009-05-09

数据结构中关于链表的C++实现

这是数据结构中关于队列使用链表实现的一次实验的演示,希望能够对学习数据结构中的关于队列而且是使用;链表的朋友有用。

2009-05-09

数据结构中的关于队列的实验

这是数据结构中关于队列这个知识点的一个关于队列的实验的演示,是使用C++实现的队列,希望能够对学习数据结构中的关于队列的朋友有用。

2009-05-09

数据结构中的哈希表和二叉树

这个关于数据结构中的哈希表和二叉树的实现,使用C++实现,那么希望能够对学习数据结构中这个知识点的朋友有帮助

2009-05-09

数据结构的哈希表使用C++实现

这是数据结构中关于哈希表这个知识的实现,是使用C++实现的,那么希望能够对学校数据结构的哈希表这个知识点的朋友能有帮助

2009-05-09

数据结构常用查找算法

在该程序中,实现了数据结构中比较常见的一些查找算法,那么希望能够对朋友你有用。

2009-04-10

图书管理系统C++实现

该系统是使用C++来实现一个图书管理功能。该图书管理系统的功能是比较完全的,希望能够对朋友你有用。

2009-04-10

数据结构二叉树的C++实现

在该程序中,使用了C++来实现二叉树的各种算法。那么应该对学习数据结构的朋友有用

2009-04-10

关于算术表达式检查程序

在该程序中,使用了堆栈的功能来检查一个计算表达式的正确性,这样能够在设计算术表达式的算法的时候,是回用的的。

2009-04-10

C语言常用函数参考手册

这是一个关于C语言的常用函数的参考手册,那么无论你是C语言的初学者还是使用C语言来工作的工作人员,这个参考手册都会对你有用。

2009-04-10

图书管理系统C语言实现

这个系统是一个图书管理系统。功能完全。使用C语言实现,那么能够是你顺利通过实训,或者初学C语言,用来参考。

2009-04-10

汽车管理系统(Java实现)

在个汽车管理系统是使用Java来实现的。这个是本人的一次实训,所以在下载包中也包含了本人的实训报告。但是不足的地方是,这个软件只是实现了对数据库的基本的添加,删除,查询的基本功能。而且只是对一些模块的实现而以。其他的模块是一样的,所以没有完成。

2009-04-10

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除