96SEO 2026-02-20 00:35 0
类体中的内容称为类的成员#xff1a;类中的变量称为类的属性或成员变量#xff1b;类中的函数称为类的方…1.类的定义

class为定义类的关键字classname为类的名字{}中为类的主体。
类体中的内容称为类的成员类中的变量称为类的属性或成员变量类中的函数称为类的方法或者成员函数。
1.声明和定义全部放在类体内当成员函数在类中定义编译器会将其当成内联函数处理
1.public修饰的成员在类外可以直接被访问protected和private修饰的成员在类外不能直接被访问
2.访问权限作用域是从该访问限定符出现的位置开始直到下一个访问限定符出现为止如果后面没有访问限定符作用域就到}为止
3.class的默认访问权限是privatestruct为public
4.protected与private的区别如果父类由protected修饰和private修饰的成员那么通过public继承后子类可以访问protected修饰的成员而不能访问private修饰的成员
注意访问限定符只在编译时有用当数据映射到内存后没有如何访问限定符上的区别
封装将数据和操作数据的方法进行有机结合隐藏对象的属性和实现细节仅对外公开接口来
封装本质上是一种管理让用户更方便使用类。
通俗解释封装其实就像我们玩的电脑一样我们不需要知道电脑的CPU、显卡、内存等元件怎么工作我们只需要通过键盘是、鼠标等设备就可以使用电脑。
类定义了一个新的作用域类的所有成员都在类的作用域中。
在类外定义成员时想要使用类作用限定符指明成员属于那个类域。
这里需要指定PrintPersonInfo是属于Person这个类域
类是对对象进行描述的是一个模型一样的东西限定了类有哪些成员定义出一个类并没
有分配实际的内存空间来存储它比如入学时填写的学生信息表表格就可以看成是一个
类来描述具体学生信息。
又比如一个类含有模板参数我们可以将这个类理解为一张图纸我们对于模板参数取不同的类型可以创建出不同的对象这些对象理解为通过图纸建造的房子。
一个类的大小实际就是该类中”成员变量”之和当然要注意内存对齐注意空类的大小空类比较特殊编译器给了空类一个字节来唯一标识这个类的对象
结构体总大小为最大对齐数所有变量类型最大者与默认对齐参数取最小的整数倍。
如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整
说白了就是找类内包括嵌套类最大的变量将其与编译器默认对齐数比较取小的那个就是我们的对齐数然后类的大小就是这个数的整数倍
12);d1.Print();d2.Print();return
C中通过引入this指针解决该问题即C编译器给每个“非静态的成员函数“增加了一个隐藏
的指针参数让该指针指向当前对象(函数运行时调用该函数的对象)在函数体中所有“成员变量”
的操作都是通过该指针去访问。
只不过所有的操作对用户是透明的即用户不需要来传递编译器自动完成。
2.this指针本质上是“成员函数”的形参当对象调用成员函数时将对象地址作为实参传递给this形参。
所以对象中不存储this指针。
4.this指针是“成员函数”第一个隐含的指针形参一般情况由编译器通过ecx寄存器自动传递不需要用户传递。
(DataType*)malloc(sizeof(DataType)
ps-array){assert(0);return;}ps-capacity
(ps-array){free(ps-array);ps-array
(DataType*)realloc(ps-array,newcapacity
NULL){perror(realloc申请空间失败!!!);return;}ps-array
{assert(ps);CheckCapacity(ps);ps-array[ps-size]
(StackEmpty(ps))return;ps-size--;
{assert(!StackEmpty(ps));return
StackSize(s));StackPop(s);StackPop(s);printf(%d\n,
StackSize(s));StackDestroy(s);return
结构体中只能定义存放数据的结构操作数据的方法不能放在结构体中即数据和操作数据
的方式是分离开的而且实现上相当复杂一点涉及到大量指针操作稍不注意可能就会出错。
_array){perror(malloc申请空间失败!!!);return;}_capacity
data){CheckCapacity();_array[_size]
(Empty())return;_size--;}DataType
NULL){perror(realloc申请空间失败!!!);return;}_array
s;s.Init();s.Push(1);s.Push(2);s.Push(3);s.Push(4);printf(%d\n,
s.Size());s.Pop();s.Pop();printf(%d\n,
C中通过类可以将数据以及操作数据的方法进行完美结合通过访问权限可以控制这些方法在类外可以被调用即封装在使用时就像使用自己的成员一样更符合人类对一件事物的认知。
而且每个方法不需要传递Stack*的参数了编译器编译之后该参数会自动还原即C中
信息未免有点麻烦所以构造函数就产生了它可以帮助我们在对象创建时完成相应信息的设置。
构造函数是一个特殊的成员函数名字与类名相同,创建类类型对象时由编译器自动调用以保证每个数据成员都有
构造函数是特殊的成员函数需要注意的是构造函数虽然名称叫构造但是构造函数的主要任
注意如果通过无参构造函数创建对象时对象后面不用跟括号否则就成了函数声明//
以下代码的函数声明了d3函数该函数无参返回一个日期类型的对象//
注意如果类中没有显式定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦
默认构造的作用体现在当类内成员变量包含自定义类型时生成的默认构造会调用该自定义类型的构造函数完成对其的初始化。
1.无参的构造函数和全缺省的构造函数都称为默认构造函数并且默认构造函数只能有一个。
2.无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数都可以认为是默认构造函数。
初始化列表以一个冒号开始接着是一个以逗号分隔的数据成员列表每个成员变量后面跟一个放在括号中的初始值或表达式
注意构造函数体中的语句只能将其称为赋初值而不能称作初始化。
因为初始化只能初始化一次而构造函数体
每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
构造函数不仅可以构造与初始化对象对于接收单个参数的构造函数还具有类型转换的作用。
explicit修饰构造函数禁止类型转换---explicit去掉之后代码可以通过编译explicit
虽然有多个参数但是创建对象时后两个参数可以不传递没有使用explicit修饰具有类型转换作用//
实际编译器背后会用2023构造一个无名对象最后用无名对象给d1对象进行赋值d1
将1屏蔽掉2放开时则编译失败因为explicit修饰构造函数禁止了单参构造函数类型转换的作//
注意用explicit修饰构造函数将会禁止构造函数的隐式转换。
析构函数与构造函数功能相反析构函数不是完成对对象本身的销毁局部对象销毁工作是由编译器完成的。
而对象在销毁时会自动调用析构函数完成对象中资源的清理工作。
一个类只能有一个析构函数。
若未显式定义系统会自动生成默认的析构函数。
注意析构函数不能重载
_array){perror(malloc申请空间失败!!!);return;}_capacity
当我们不写析构函数时编译器自动生成的析构函数对内置类型并没有什么作用但是对于自定义类型成员会调用他的析构函数
因为main方法中创建了Date对象d而d中包含4个成员变量其中_year,
_day三个是内置类型成员销毁时不需要资源清理最后系统直接将其内存回收即可而_t是Time类对象所以在d销毁时要将其内部包含的Time类的_t对象销毁所以要调用Time类的析构函数。
但是main函数中不能直接调用Time类的析构函数实际要释放的是Date类对象所以编译器会调用Date类的析构函数而Date没有显式提供则编译器会给Date类生成一个默认的析构函数目的是在其内部调用Time类的析构函数即当Date对象销毁时要保证其内部每个自定义对象都可以正确销毁main函数中并没有直接调用Time类析构函数而是显式调用编译器为Date类生成的默认析构函数
注意创建哪个类的对象则调用该类的析构函数销毁那个类的对象则调用该类的析构函数
拷贝构造函数只有单个形参该形参是对本类类型对象的引用(一般常用const修饰)在用已存在的类类型对象创建新对象时由编译器自动调用。
拷贝构造函数的参数只有一个且必须是类类型对象的引用使用传值方式编译器直接报错
注意在编译器生成的默认拷贝构造函数中内置类型是按照字节方式直接拷贝的而自定
3.作为类成员函数重载时其形参看起来比操作数数目少1因为成员函数的第一个参数为隐
返回值类型T返回引用可以提高返回的效率有返回值目的是为了支持连续赋值
赋值运算符重载成全局函数注意重载成全局函数时没有this指针了需要给两个参数
原因赋值运算符如果不显式实现编译器会生成一个默认的。
此时用户再在类外自己实现
一个全局的赋值运算符重载就和编译器在类中生成的默认赋值运算符重载冲突了故赋值
用户没有显式实现时编译器会生成一个默认赋值运算符重载以值的方式逐字节拷贝。
注
意内置类型成员变量是直接赋值的而自定义类型成员变量需要调用对应类的赋值运算符
注意如果类中未涉及到资源管理就是malloc、realloc、new等动态内存赋值运算符是否实现都可以一旦涉及到资源管理则必须要实现。
其实那个int只是为了区分前置和后置因为编译器在完成编译时会对函数名进行处理g下大致就是
函数名和参数类型来组成编译后的函数名所以通过int可以区分前置和后置
这两个运算符一般不需要重载使用编译器生成的默认取地址的重载即可只有特殊情况才需要重载比如想让别人获取到指定的内容
概念声明为static的类成员称为类的静态成员用static修饰的成员变量称之为静态成员变量用static修饰的成员函数称之为静态成员函数。
静态成员变量一定要在类外进行初始化。
静态成员变量必须在类外定义定义时不添加static关键字类中只是声明
静态成员也是类的成员受public、protected、private
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback