自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 (6) 套接字地址结构

(1)从进程到内核从内核到进程其中,从内核到进程方向的传递是值-结果参数传递。(2)地址转换函数在地址文本表达和它们存放在套接字地址结构中的二进制值之间进行转换。多数现存的IPv4代码使用inet_addr和inet_ntoa这两个函数。不过inet_pton和inet_ntop同时适用于IPv4和IPv6两种协议代码(1)当作为一个参数传递给任何套接字函数时,套接字地址结构总是以指针(指向该结构的指针)来传递。(2)然而以这样的指针作为参数之一的任何套接字函数必须处理来自所支持的任何协议族。

2023-08-26 13:18:22 704

原创 (5) 缓冲区大小及限制

对端TCP必须确认收到的数据,伴随来自对端的ACK的不断到达,本端TCP至此才能从套接字发送缓冲区中丢弃已确认的数据。TCP必须为已发送的数据保留一个副本,直到它被对端确认为止。路径MTU发现对于IPv4是可选的,然而IPv6的所有实现要么必须支持它,要么必须总是使用最小的MTU发送IPv6数据报。(IPv4与IPv6的TCP首部都是20字节,但IPv4的首部是20字节,IPv6的首部却是40字节)。发送端的TCP提取套接字发送缓冲区中的数据并把它发送给对端TCP,其过程基于TCP数据传送的所有规则。

2023-08-20 22:42:19 2163

原创 C++ 类模板 (一)

继承(公有、私有或保护)和包含并不总是能够满足重用代码的需要。举例,前面几节提到的Stack类设计只用于存储unsigned long值。也可以定义专门用于存储double值或string对象的Stack类,但是除了存储的对象类型不同之外,这两种Stack类的代码是相同的。针对重用代码的方式,Stack类示例代码中使用typedef处理这种需求,然而这种方法有两个缺点1、首先,每次修改类型时都需要编辑头文件2、

2023-08-20 22:31:32 141

原创 (4) 端口号

Unix网络编程

2023-01-19 16:02:51 446

原创 (3) TCP状态转换

Unix网络编程

2023-01-19 15:57:04 724

原创 (2) TCP连接建立与终止

Unix网络编程

2023-01-19 15:54:08 320

原创 (1) tcp、udp与sctp概述

Unix网络编程卷1

2023-01-19 15:49:53 350

原创 C++ 多重继承

C++ 编程语言技术知识积累

2022-11-29 11:11:28 5310 1

原创 C++has-a关系之私有继承

一、简述C++实现has-a关系的另一个方式是:私有继承。使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。这意味着基类方法将不会成为派生对象公有接口的一部分,但可以在派生类成员函数中使用它们。总之,派生类不继承基类的接口,将继承实现。<1> has-a关系之包含是将对象作为一个命名的成员对象添加到类中<2> has-a私有继承将对象作为一个未被命名的继承对象添加到类中<3> 一般使用术语子对象来表示通过继承或包含添加的对象二、私有继承方式重新设

2022-05-30 21:34:35 742 2

原创 C++ has-a关系之包含

C++ has-a关系之包含一、前提简述实现C++代码重用的方式不只有公有继承(is-a关系),还有其它方式,其中一种方式是has-a关系,而其中的包含、私有继承、保护继承就是用于实现has-a关系的。本次先记录下包含方式实现has-a关系。包含是什么呢?答:变量本身是另一个类的对象,即类中包含另一个类的对象,这种方法称为包含(containment)、组合(composition)、层次化(layering)。二、包含对象成员的类对于包含对象成员的类的说明,我们通过类设计示例说明。2.1

2021-09-14 23:25:23 810

原创 C++ 类设计规则及注意事项

C++ 类设计规则及注意事项一、概述C++可用于解决各种类型的编程问题,但不能将类设计简化成带编号的例程。下面将简单介绍类设计中的部分设计规则及注意事项。二、编译器生成的成员函数编译器会自动生成一些公有成员函数—特殊成员函数。这表明这些成员函数很重要,下面将一一说明回顾这些成员函数,并做简单记录。2.1 默认构造函数默认构造函数要么没有参数,要么所有的参数都有默认值:<1> 如果没有定义任何构造函数,编译器将定义默认构造函数,让使用者能够创建对象。假设Star是一个类,则下述代

2021-09-14 23:24:25 1062

原创 C++ 继承与动态内存分配

C++ 继承与动态内存分配一、问题导入(1)继承是怎样与动态内存分配(即使用new与delete)进行互动的呢?(2)假如基类使用动态内存分配,并重新定义赋值和复制构造函数,这将怎样影响派生类的实现呢?取决于派生类的属性。根据上述两个问题,我们接下来看看如下两种情况下,继承与动态内存分配的关系:二、第一种情况:派生类不使用new2.1 基类使用动态内存分配假如基类使用了动态内存分配,如下代码所示:// 基类// 声明中包含了构造函数使用new时需要的特殊方法:析构函数、复制构造函数和重载

2021-05-16 21:10:40 592

原创 C++ 抽象基类

C++ 抽象基类一、简介抽象基类: abstract base class,简称ABC,只定义接口,而不涉及实现,主要用于定义派生类的通用接口。抽象基类必须包含至少一个纯虚方法。且包含纯虚函数的抽象基类,不能用来创建对象,只能用作基类。纯虚方法: 在函数声明的结尾处添加 =0,以表示此函数为纯虚函数。在当前类可不用给出实现。举例声明方式如下:// 纯虚函数virtual void functionname() = 0;二、举例说明比方说有A、B两个类,最初的设计思想是B类继承A类,但是实际

2021-04-29 00:20:52 5097

原创 C++静态联编和动态联编

C++静态联编和动态联编一、简介程序调用函数时,将使用哪个可执行代码块呢?编译器负责回答这个问题。将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编。在C语言中,这非常简单,因为每个函数名都对应一个不同的函数。在C++中,由于函数重载的缘故,这项任务更复杂。编译器必须查看函数参数及函数名才能确定使用哪个函数。然而,C/C++编译器可以在编译过程完成这种联编。静态联编: 在编译过程中进行联编被称为静态联编,也称为早期联编。动态联编: 虚函数的使用使函数名联编这项工作变的困难。使用哪一

2021-04-16 01:14:04 1297

原创 C++多态公有继承

C++多态公有继承一、说明在派生类对象使用基类的方法时,可能不会做任何修改。但也会遇到这样一种情况,希望同一个方法在派生类和基类中的行为是不同的。换句话说,方法的行为应取决于调用该方法的对象。这种较复杂的行为称为多态—具有多种形态,即同一个方法的行为随上下文而异。有两种重要的机制可以用于实现多态公有继承:(1)在派生类中重新定义基类的方法(2)使用虚方法具体的实现方式,容我慢慢道来二、设计基类与派生类注意: is-a关系是不可逆的,即水果不是香蕉。同时本节设计的Brass基类对象不具备Br

2021-04-14 00:22:25 390

原创 C++ is-a关系

C++ is-a关系一、说明派生类和基类之间的特殊关系是基于C++继承的底层模型的。实际上C++有3种继承方式:公有继承、保护继承和私有继承。公有继承是最常用的方式,它建立一种is-a关系,即派生类对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行。二、公有继承不能建立的关系举例说明:假设有一个Fruit水果类,可以保存水果的重量和热量。2.1公有继承不建立has-a关系例如,午餐可能包括水果,但通常午餐并不是水果。所以不能从Fruit类派生出Lunch类来在午餐中

2021-04-12 00:19:18 548

原创 C++类继承

C++类继承一、什么是类继承C++提供了比修改代码更改的方法来扩展和修改类,这种方法叫类继承,它能够从已有的类派生出新的类,而派生类继承了原有类(称为基类)的特征,包括方法。通过继承派生出的类通常比设计新类要容易的多,下面是可以通过继承完成的一些工作,如下:(1)可以在已有类的基础上添加功能。(2)可以给类添加数据。(3)可以修改类方法的行为。**注:**如果购买的类库只提供了类方法的头文件和编译后代码,仍可以使用库中的类派生出新的类。而且可以在不公开实现的情况下将自己的类分发给其他人,同

2021-04-09 00:36:40 192

原创 C++ 在类中嵌套结构与类和类的成员初始化列表

一、类中嵌套结构或类声明在类中嵌套结构或类声明,可以使其作用域为整个类。可以使用嵌套的结构或类来声明类成员,也可以将它作为类方法中的类型名称,但只能在类中使用。可以查看如下示例代码:typedef Customer Item;class Queue{private: struct Node { Item item; struct Node* next; }; enum { Q_SIZE = 10 }; Node* fron

2021-03-27 01:13:18 4416 1

原创 C++使用指向对象的指针

一、使用new初始化对象通常,如果Class_name是类,value的类型为Type_name,则下面的语句:Class_name *pclass = new Class_name(value);将调用如下的构造函数:Class_name(Type_name);这里会有一些琐碎的转换,如:Class_name(const Type_name &);另外,如果不存在二义性,则将发生由原型匹配导致的转换(如int转为double)。下面的初始化方式将调用默认构造函数:Class

2021-03-25 00:41:56 1351

原创 C++返回对象说明

当成员函数或独立的函数返回对象时,有几种返回方式可供选择。可以返回指向对象的引用、指向对象的const引用或const对象。一、返回指向const对象的引用使用const引用的常见原因是旨在提高效率,但对于何时可以采用这种方式存在限制。如果函数返回传递给它的对象(通过调用对象的方法或将对象作为参数),可以通过返回引用来提高效率。1.1 举例说明// 定义Max函数,返回两个Vector对象中较大的一个Vector vec1(50, 60);Vector vec2(10, 70);Vecto

2021-03-23 23:53:46 1953

原创 C++在构造函数中使用new时的注意事项

一、具体注意事项(1)如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete。(2)new和delete必须相互兼容。new对应于delete,new[]对应于delete[]。(3)如果有多个构造函数,则必须以相同的方式使用new,要么都带中括号,要么都不带。因为只有一个析构函数,所有的构造函数都必须与它兼容。然而,可以在一个析构函数中使用new初始化指针,而在另一个构造函数中将指针初始化为空(0或C++11中的nullptr),这是因为delete可以用于空指针(无论是带

2021-03-22 23:44:31 2381 2

原创 C++动态内存和类

C++动态内存和类一、使用C++使用new和delete运算符来动态控制内存。先上一段示例代码分析:二、示例代码// StringBad.hclass StringBad{private: char* str; int len; static int num_strings;public: StringBad(); StringBad(const char* s); ~StringBad(); // friend function 友

2021-03-15 23:52:39 205

原创 C++ 类之说明

C++ 类1、C++ OOP简介面向对象编程(OOP)是一种特殊的、设计程序的概念性方法,OOP重要特性如下:(1) 抽象(2) 封装和数据隐藏(3) 多态(4) 继承(5) 代码的可重用性2、过程性编程和面向对象编程采用书本描述的案例说明,能更容易的让人理解过程性编程与面向对象编程。垒球队的一名新球员被要求记录球队的统计数据,会优先考虑使用计算机来完成这项工作,下面描述下过程...

2020-05-28 22:02:13 2075

原创 using声明与using编译指令

一、using声明与using编译指令简述在使用名称空间中名称时,不希望每次使用都对名称进行限定(如 A::Pail),能直接使用名称即可,针对这种情况,C++提供了两种机制:using声明与using编译指令。using声明: 使特定标识符可用。using编译指令: 使整个名称空间可用,即整个名称空间中的名称可用。二、使用2.1 使用方式using声明: 由被限定的名称和它前面的关键...

2020-03-26 23:11:15 1032

原创 C++ 名称空间

根据阅读资料编写此文章,一是个人方便多次阅读加深理解,二是希望能帮助他人学习。其中如有描述不当之处可随时在评论区评论,谢谢。名称空间简述名字空间(英语:Namespace),也称命名空间、名称空间等,它表示着一个标识符(identifier)的可见范围。一个标识符可在多个名字空间中定义,它在不同名字空间中的含义是互不相干的。这样,在一个新的名字空间中可定义任何标识符,它们不会与任何已有的标识符...

2020-02-29 11:12:23 1276

原创 C++ new运算符

C++ new运算符一、new运算符初始化C++ 98 如何初始化动态分配的变量?如果为内置的标准类型分配存储空间并初始化,可在类型名后面加上初始值,并将其用括号括起,如下:int *pi = new int(10); // pi初始化设置成10double *pd = new double(99.99); // pd初始化设置成99.99这种括号语法也可用于有合适构造函数的...

2020-02-05 18:10:34 1569

原创 C++ 动态内存分配

C++ 动态内存分配通常编译器使用三块独立的内存:1、一块用于静态变量(可能会再细分),也称为静态存储区2、一块用于自动变量,也称为栈3、一块用于动态存储,也称为自由存储或堆一、动态内存动态内存: 使用C++运算符(或C函数malloc())分配的内存,这种内存被称为动态内存。动态内存由运算符new和delete控制,而不是由作用域和链接性规则控制。因此可以在一个函数中分配动态内存,...

2020-02-05 14:57:12 749

原创 C++存储持续性、作用域与链接性

C++ 存储持续性、作用域与链接性1、存储持续性简介:C++ 使用三种(C++11之后是四种)不同的方案来存储数据,这些方案的区别就在于数据保留在内存中的时间。详解:自动存储持续性: 在函数定义中声明的变量(包括原函数参数)的存储持续性为自动的。它们在程序开始执行其所属的函数或代码块时被创建,在执行完函数或代码块时,它们使用的内存被释放。静态存储持续性: 在函数定义外定义的变量和使用关...

2020-02-03 22:05:21 192

空空如也

空空如也

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

TA关注的人

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