C++从入门到精通——初步认识面向对象及类的引入
初步认识面向对象及类的引入
- 前言
- 一、面向过程和面向对象初步认识
- C语言
- C++
- 二、类的引入
- C++的类名代表什么
- 示例
- C++与C语言的struct的比较
- 成员函数
- 访问权限
- 继承
- 默认构造函数
- 默认成员初始化
- 结构体大小
- 总结
前言
面向过程注重任务的流程和控制,适合简单任务和流程固定的场景;而面向对象则将数据和功能封装成对象,通过对象间的交互实现复杂功能,更适用于大型、复杂的软件系统开发。
类的引入是面向对象编程中的一个核心概念。通过类,我们可以创建具有相同属性和行为的对象,从而实现代码的重用和模块化。类定义了对象的结构和行为,包括对象的属性(数据成员)和方法(成员函数)。通过实例化类,我们可以创建对象,并赋予它们特定的属性值。这样,每个对象都具有独特的身份,但仍然共享类的定义和行为。类的引入使得代码更加组织化、可维护性和可扩展性,提高了软件开发效率和质量。
一、面向过程和面向对象初步认识
当我们开始接触编程时,首先遇到的两个核心概念便是面向过程(Procedural Programming)和面向对象(Object-Oriented Programming,简称OOP)。这两种编程范式各有其特点,并且在不同的应用场景中发挥着各自的优势。
面向过程编程,顾名思义,是以一系列按照特定顺序执行的过程或函数为核心来构建程序的。在这种编程范式中,程序员会定义一系列函数,每个函数负责完成特定的任务,然后通过一个主程序来调用这些函数,以实现特定的功能。面向过程编程的优点在于其直观性和简单性,特别适用于小规模、逻辑清晰的程序。然而,随着程序规模的扩大和复杂度的提升,面向过程编程的缺点也逐渐暴露出来,如代码重复、难以维护、可扩展性差等。
与面向过程编程不同,面向对象编程将现实世界中的事物抽象为对象,每个对象都拥有属性和方法。对象之间可以通过消息传递进行交互,从而实现复杂的功能。面向对象编程的核心概念包括类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)和多态(Polymorphism)。通过这些概念,面向对象编程能够更好地模拟现实世界,提高代码的可重用性、可维护性和可扩展性。
在实际应用中,面向过程和面向对象编程往往不是孤立的,而是相互补充的。对于某些特定的任务或模块,使用面向过程编程可能更加合适;而对于整个系统或大型项目,采用面向对象编程则能够更好地组织和管理代码。因此,作为程序员,我们需要根据具体的需求和场景来选择合适的编程范式,以达到最佳的开发效果。
C语言
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
二、类的引入
类的引入在编程中是一个核心概念,它允许我们创建具有相似属性和行为的对象集合。通过定义类,我们可以封装数据(属性)和功能(方法),从而创建出具有特定特性和行为的对象。这种封装不仅提高了代码的可读性和可维护性,还增强了代码的重用性。
C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在我之前用C语言写的数据结构的文章中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct
中也可以定义函数。
总结:c++兼容C语言中的struct
用法,但是c++将struct
升级成了类
C++的类名代表什么
在C++中,类名代表了一种自定义的数据类型。类是一种用户定义的数据类型,可以封装数据和成员函数,以实现特定的功能。
类定义了一组数据成员和成员函数,用于描述对象的状态和行为。数据成员表示对象的属性和状态,而成员函数用于定义对象的行为和操作。
通过创建类的对象,我们可以实例化该类并使用类的成员函数来操作对象的数据。类提供了一种封装数据和功能的机制,使得代码可以更加模块化和可维护。
类名在C++中是用来标识该类的唯一标识符。通常按照一定的命名规范(如驼峰命名法)命名类名,以便于代码的可读性和可理解性。类名是用来声明类变量、创建对象和调用类的成员函数的重要标识符。
示例
在C语言中我们定义一个链表是按照下面的方式来定义的
typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;
在C++中定义一个链表却是按照下面这个方式来定义
struct SListNode
{SLTDataType data;SListNode* next;
};
C++中的struct
具有与类相同的能力,可以封装数据和成员函数。
C++与C语言的struct的比较
C++与C语言中的struct
在定义和使用上有一些区别。
成员函数
C++的struct
可以包含成员函数,而C语言的struct
只能包含成员变量。
以下是一个使用C++中的struct
定义一个包含成员函数的示例:
#include <iostream>struct Person {//成员变量std::string name;int age;//成员函数void display() {std::cout << "Name: " << name << ", Age: " << age <<std::endl;}
};int main() {Person p1;p1.name = "John";p1.age = 25;p1.display();return 0;
}
上述示例中,我们定义了一个名为Person
的struct
,它包含了两个成员变量name
和age
,还有一个成员函数display()
。在main
函数中,我们创建了一个Person
对象p1
,并为其成员变量赋值,然后通过调用p1.display()
函数来显示该对象的信息。
而在C语言中,如下
struct Person {int age;
};
void display() {……};
上述示例中,我们可见C语言的结构体只能定义成员变量
访问权限
C++中的struct
成员默认为public
,而C语言中的struct
成员默认为public
。这是因为C++要兼容C,所以都是public
,关于public
可以看我的下一篇文章。
在C++中,struct
和class
的主要区别在于默认访问权限。下面是一个示例,展示了C++中的struct
成员默认为public
,而C语言中的struct
成员默认为public
的区别:
#include <iostream>// C++中的struct,默认成员为public
struct Person {std::string name;int age;void display() {std::cout << "Name: " << name << ", Age: " << age << std::endl;}
};int main() {Person p1;p1.name = "John";p1.age = 25;p1.display();return 0;
}
在上述示例中,我们定义了一个名为Person
的struct
,它包含了一个string
类型的name
和一个int
类型的age
。还有一个名为display
的成员函数,用于显示该结构体的信息。
我们可以直接访问struct
的成员变量和成员函数,无需使用任何访问修饰符。在main
函数中,我们创建了一个Person
类型的结构体变量p1
,并为其成员变量赋值。然后,在display
函数中,我们通过p1
对象直接调用成员函数来显示该结构体的信息。
需要注意的是,C语言中的struct
不支持成员函数,默认情况下,所有成员都是公开的,可以直接访问。而C++中的struct
可以使用成员函数,而且默认情况下成员是公开的。这是C语言和C++中struct
的一个主要区别。
继承
C++的struct
可以通过继承来拓展,而C语言的struct
不能进行继承。关于继承可以看我的后续文章。
在C++中,可以通过继承来拓展struct
,如下所示:
struct Animal {int age;
};struct Cat : public Animal {std::string name;
};int main() {Cat cat;cat.age = 3;cat.name = "Tom";return 0;
}
在上面的例子中,Cat
结构体从Animal
结构体继承,继承后的Cat
结构体包含了Animal
的成员变量age
,并新增了一个成员变量name
。
而在C语言中,struct
无法进行继承。C语言的结构体只能包含成员变量,不能继承其他结构体的成员变量或方法。下面是一个C语言中使用结构体的例子:
typedef struct {int age;
} Animal;typedef struct {Animal animal;char name[20];
} Cat;int main() {Cat cat;cat.animal.age = 3;strcpy(cat.name, "Tom");return 0;
}
在上面的例子中,Cat
结构体包含了Animal
结构体的成员变量age
,并新增了一个成员变量name
。但是这种方式并不是继承,而是嵌套了一个Animal
结构体,通过嵌套来实现在Cat
中包含Animal
的成员变量。
默认构造函数
C++的struct
可以有默认构造函数,而C语言的struct
没有默认构造函数。
下面是一个具有默认构造函数的C++ struct
的例子:
#include <iostream>struct Person {std::string name;int age;// 默认构造函数Person() {name = "Unknown";age = 0;}
};int main() {Person person; // 调用默认构造函数std::cout << "Name: " << person.name << std::endl;std::cout << "Age: " << person.age << std::endl;return 0;
}
在上述例子中,定义了一个Person
结构体,并为其提供了默认构造函数。在默认构造函数中,将name
初始化为"Unknown
",将age
初始化为0
。在主函数中,创建了一个Person
对象person
,由于没有提供任何参数,因此使用了默认构造函数进行初始化。输出结果如下:
Name: Unknown
Age: 0
而在C语言中,struct
没有默认构造函数的概念。在C语言中,需要手动为struct
的成员变量赋初始值。下面是一个使用C语言的struct
的例子:
#include <stdio.h>struct Person {char name[20];int age;
};int main() {struct Person person = {"Unknown", 0}; // 手动赋初始值printf("Name: %s\n", person.name);printf("Age: %d\n", person.age);return 0;
}
在上述例子中,定义了一个Person
结构体,并在主函数中手动为其成员变量赋初始值。通过使用大括号括起来的值列表来初始化结构体对象。输出结果与前面的例子相同:
Name: Unknown
Age: 0
默认成员初始化
C++的struct
可以在声明时为成员变量提供默认值,而C语言的struct
不支持默认成员初始化。
下面是一个C++ struct
中支持默认成员初始化的例子:
#include <iostream>struct Rectangle {int width = 0; // 默认初始化为0int height = 0; // 默认初始化为0
};int main() {Rectangle rectangle; // 使用默认初始化值std::cout << "Width: " << rectangle.width << std::endl;std::cout << "Height: " << rectangle.height << std::endl;return 0;
}
在上述例子中,定义了一个Rectangle
结构体,并在成员变量的声明时为其提供了默认值。在主函数中,创建了一个Rectangle
对象rectangle
,由于没有提供任何初始化值,因此会使用成员变量的默认值进行初始化。输出结果如下:
Width: 0
Height: 0
而在C语言中,不支持这种在声明时为成员变量提供默认值的特性。在C语言中,需要在初始化结构体对象时手动为其成员变量赋值。下面是一个使用C语言的struct
的例子:
#include <stdio.h>struct Rectangle {int width;int height;
};int main() {struct Rectangle rectangle = {0, 0}; // 手动赋初始值printf("Width: %d\n", rectangle.width);printf("Height: %d\n", rectangle.height);return 0;
}
在上述例子中,定义了一个Rectangle
结构体,并在主函数中手动为其成员变量赋初值。通过使用大括号括起来的值列表来初始化结构体对象。输出结果与前面的例子相同:
Width: 0
Height: 0
结构体大小
C语言中的struct
的大小仅受成员变量的大小和对齐方式影响,而C++中的struct
除了受成员变量的大小和对齐方式影响,还有可能受到虚函数表的影响。关于虚函数可以看我后续文章。
下面是一个展示C语言和C++中struct
大小差异的例子:
在C语言中,struct
的大小仅受成员变量的大小和对齐方式的影响,不会受到其他因素的影响。考虑以下示例:
#include <stdio.h>struct Rectangle {int width;int height;
};int main() {struct Rectangle rectangle;printf("Size of Rectangle: %zu bytes\n", sizeof(rectangle));return 0;
}
在上述C语言示例中,定义了一个Rectangle
结构体,包含两个int
类型的成员变量width
和height
。在主函数中,使用sizeof
运算符来获取结构体Rectangle
的大小并打印输出。
输出结果为:
Size of Rectangle: 8 bytes
在这个例子中,width
和height
各占4个字节,所以Rectangle
结构体的大小为8字节。
而在C++中,struct
除了受成员变量的大小和对齐方式的影响,还有可能受到虚函数表的影响。考虑以下示例:
#include <iostream>struct Shape {virtual void draw() {std::cout << "Drawing a shape." << std::endl;}
};struct Rectangle : public Shape {int width;int height;
};int main() {Rectangle rectangle;std::cout << "Size of Rectangle: " << sizeof(rectangle) << " bytes" << std::endl;return 0;
}
在上述C++示例中,定义了一个Shape
结构体,其中包含一个虚函数draw()
。然后定义了一个Rectangle
结构体,通过公共继承从Shape
继承,并添加了两个int类型的成员变量width
和height
。
在主函数中,创建了一个Rectangle
对象并使用sizeof
运算符获取其大小并打印输出。
输出结果为:
Size of Rectangle: 16 bytes
在这个例子中,除了width
和height
各占4个字节,还会有额外的字节用于存储虚函数表指针,以便支持多态性。因此,Rectangle
结构体的大小为16字节。
这个例子展示了C++中的struct可能受到虚函数表的影响,使得其大小与仅受成员变量大小和对齐方式影响的C语言struct不同。
总结
需要注意的是,尽管C++的struct
比C语言的struct
功能更强大,但C++中的class
更常用于定义对象。C++中的class
与struct
的唯一区别在于默认访问权限,class
中成员默认为private
,而struct
中成员默认为public
。
相关文章:
C++从入门到精通——初步认识面向对象及类的引入
初步认识面向对象及类的引入 前言一、面向过程和面向对象初步认识C语言C 二、类的引入C的类名代表什么示例 C与C语言的struct的比较成员函数访问权限继承默认构造函数默认成员初始化结构体大小 总结 前言 面向过程注重任务的流程和控制,适合简单任务和流程固定的场…...
GitHub入门与实践
ISBN: 978-7-115-39409-5 作者:【日】大塚弘记 译者:支鹏浩、刘斌 页数:255页 阅读时间:2023-08-05 推荐指数:★★★★★ 好久之前读完的了,一直没有写笔记。 这本入门Git的书籍还是非常推荐的,…...
centos 安装 stable-diffusion 详细流程
一、安装git 新版 先安装git 工具来更新git源码 , 载下源码后卸载git 版本(centos 默认1.8版本,说是安装会引起失败) 安装git 命令,可使用 git --version查看版本 sudo yum install git -y 卸载git命令 sudo yum remove git 正式源码安装…...
CSS编写登录框样式
/* 重置浏览器默认样式 */ * { margin: 0; padding: 0; box-sizing: border-box; } /* 设置登录框的基本样式 */ .login-box { width: 100%; max-width: 400px; margin: 50px auto; background-color: #f4f4f4; padding: 20px; box-shad…...
Python|OpenCV-获取鼠标点击位置的坐标,并绘制图像(13)
前言 本文是该专栏的第14篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 本文主要来详细说明,基于OpenCV来获取鼠标点击位置的坐标,并按坐标的位置进行自动绘制图像。具体怎么实现,笔者在正文中将结合实际代码案例进行详细说明。 具体细节部分以及完整代码的实…...
设计模式(14):命令模式
介绍 将一个请求封装为一个对象,从而使我们可用不同的请求对象客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。也称之为:动作Action模式,事务transaction模式。 命令模式角色 抽象命令类(Comman…...
关于阿里云云数据库自动扩缩容和自动SQL优化的20道面试题
1. 请解释阿里云云数据库自动扩缩容的概念及其工作原理。 阿里云云数据库自动扩缩容是一种基于数据库实例的实时性能数据,能够发现流量异常并提供合理的数据库规格建议和磁盘容量建议的功能。其工作原理如下: 性能监控:系统会实时监控数据库…...
mkcert生成ssl证书+nginx部署局域网内的https服务访问问题
文章目录 mkcert生成ssl证书nginx部署局域网内的https服务访问问题1、下载mkcert查看自己的电脑是arm还是amd架构 2、安装mkcert3、测试mkcert是否安装成功4、查看CA证书存放位置5、打开windows的证书控制台6、生成自签证书,可供局域网内使用其他主机访问以下是nginx部署https服…...
PTA C 1050 螺旋矩阵(思路与优化)
本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:mn 等于 N;m≥n;且…...
神经网络分类和回归任务实战
学习方法:torch 边用边学,边查边学 真正用查的过程才是学习的过程 直接上案例,先来跑,遇到什么解决什么 数据集Minist 数据集 做简单的任务 Minist 分类任务 总体代码(可以跑通) from pathlib import …...
【数据结构】考研真题攻克与重点知识点剖析 - 第 4 篇:串
前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…...
深入浅出 -- 系统架构之分布式多形态的存储型集群
一、多形态的存储型集群 在上阶段,我们简单聊了下集群的基本知识,以及快速过了一下逻辑处理型集群的内容,下面重点来看看存储型集群,毕竟这块才是重头戏,集群的形态在其中有着多种多样的变化。 逻辑处理型的应用&…...
STL —— list
博主首页: 有趣的中国人 专栏首页: C专栏 本篇文章主要讲解 list模拟实现的相关内容 1. list简介 列表(list)是C标准模板库(STL)中的一个容器,它是一个双向链表数据结构,…...
申请SSL证书
有很多方法可以确保您的网站安全。添加SSL证书可针对恶意攻击提供额外且关键的保护层。 即使网站不接受交易,您仍然需要保护用户的登录详细信息、地址和其他个人信息。 没有SSL证书的网站使用HTTP(一种基于文本的协议),这意味着…...
深入浅出 -- 系统架构之负载均衡Nginx环境搭建
引入负载均衡技术可带来的收益: 系统的高可用:当某个节点宕机后可以迅速将流量转移至其他节点。系统的高性能:多台服务器共同对外提供服务,为整个系统提供了更高规模的吞吐。系统的拓展性:当业务再次出现增长或萎靡时…...
notepad++绿色版添加右键菜单
解压路径 D:\Green\notepad_v8.0_x64_绿色版 添加右键菜单.reg 新建nodepad添加右键菜单.reg文件 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Edit with &Notepad" "Icon""D:\\Green\\notepad_v8.0_x64_绿色版…...
7 个 iMessage 恢复应用程序/软件可轻松恢复文本
由于误操作、iOS 升级中断、越狱失败、设备损坏等原因,您可能会丢失 iPhone/iPad 上的 iMessages。意外删除很大程度上增加了这种可能性。更糟糕的是,这种情况经常发生在 iDevice 缺乏备份的情况下。 (iPhone消息消失还占用空间?&…...
DockerFile启动jar程序
1.创建Dockerfile 在项目的根目录下创建一个名为Dockerfile的文件,并使用文本编辑器打开它。Dockerfile的内容如下: # 基础镜像 FROM openjdk:8-jre # 创建目录 RUN mkdir -p /usr/app/ # 设置工作目录 WORKDIR /usr/app # 将JAR文件复制到容器中,注:…...
基于R、Python的Copula变量相关性分析及AI大模型应用
在工程、水文和金融等各学科的研究中,总是会遇到很多变量,研究这些相互纠缠的变量间的相关关系是各学科的研究的重点。虽然皮尔逊相关、秩相关等相关系数提供了变量间相关关系的粗略结果,但这些系数都存在着无法克服的困难。例如,…...
鸿蒙组件学习_Tabs组件
说明 该组件从API Version 7 开始支持。 子组件 仅可包含子组件TabContent 参数 barPosition 设置Tabs的页签位置,默认值: BarPosition.StartStart vertical属性方法设置为true时,页签位于容器左侧;vertical属性方法设置为false时,页签位于容器顶部。End vertic…...
【LangChain学习之旅】—(19)BabyAGI:根据气候变化自动制定鲜花存储策略
【LangChain学习之旅】—(19)BabyAGI:根据气候变化自动制定鲜花存储策略 AutoGPTBaby AGIHuggingGPTLangChain 目前是将基于 CAMEL 框架的代理定义为 Simulation Agents(模拟代理)。这种代理在模拟环境中进行角色扮演,试图模拟特定场景或行为,而不是在真实世界中完成具体…...
thinkphp6入门(21)-- 如何删除图片、文件
假设文件的位置在 /*** 删除文件* $file_name avatar/20240208/d71d108bc1086b498df5191f9f925db3.jpg*/ function deleteFile($file_name) {// 要删除的文件路径$file app()->getRootPath() . public/uploads/ . $file_name; $result [];if (is_file($file)) {if (unlin…...
虚拟内存知识详解
虚拟内存 单片机的 CPU 是直接操作内存的「物理地址」 在这种情况下,要想在内存中同时运行两个程序是不可能的 操作系统是如何解决这个问题呢? 关键的问题是这两个程序都引用了绝对物理地址,而这正是我们最需要避免的。 可以把进程所使用的…...
数据结构初阶:顺序表和链表
线性表 线性表 ( linear list ) 是 n 个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串 ... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性…...
在flutter中添加video_player【视频播放插件】
添加插件依赖 dependencies:video_player: ^2.8.3插件的用途 在Flutter框架中,video_player 插件是一个专门用于播放视频的插件。它允许开发者在Flutter应用中嵌入视频播放器,并提供了一系列功能来控制和定制视频播放体验。这个插件对于需要在应用中展…...
golang微服务框架特性分析及选型
目录 一、微服务框架特性(10个)包括:Istio、go-zero、go-kit、go-kratos、go-micro、rpcx、kitex、goa、jupiter、dubbo-go、tarsgo 1、特性及使用场景2、比较 二、web框架特性(7个)包括:gin、fiber、beego…...
苹果cmsV10 MXProV4.5自适应PC手机影视站主题模板苹果cms模板mxone pro
演示站:http://a.88531.cn:8016 MXPro 模板主题(又名:mxonepro)是一款基于苹果 cms程序的一款全新的简洁好看 UI 的影视站模板类似于西瓜视频,不过同对比 MxoneV10 魔改模板来说功能没有那么多,也没有那么大气,但是比较且可视化功…...
GPU的了解
3D动画揭秘显卡的GPU是如何工作的_哔哩哔哩_bilibili 位于显卡中。 与CPU区别: 100名小学生和1位数学博士 做100道非常简单的算术题,小朋友一个人一道题,比博士快。 做1道非常复杂的数学问题,只有博士可以做出来。 CPU主要用于快…...
鸿蒙实战开发-如何使用Stage模型卡片
介绍 本示例展示了Stage模型卡片提供方的创建与使用。 用到了卡片扩展模块接口,ohos.app.form.FormExtensionAbility 。 卡片信息和状态等相关类型和枚举接口,ohos.app.form.formInfo 。 卡片提供方相关接口的能力接口,ohos.app.form.for…...
蓝桥杯刷题 前缀和与差分-[2128]重新排序(C++)
问题描述 给定一个数组 A 和一些查询 L**i, R**i,求数组中第 L**i 至第 R**i 个元素之和。 小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组,所有查询结果的总和最多…...
城市建设网站设计/百度ai智能写作工具
在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。由于静态的内部类在定义、使用的时候会有种种的限制。所以在实际工作中用到的并不多。 在开发过程中ÿ…...
马云为什么做网站/文明seo
Enumable类型是linq to object 是一个很特殊的类型 这个类型的数据源都是在程序的内存中 Queryable类型是 Linq to sql 对数据库进行操作都是这个类型 这个类型会生成表达式目录树 方法体只能有一行代码 Expression 表达式目录树 ///外链接 需要用join into …...
三合一网站建设/优化网站内容的方法
魔兽世界9.0珠宝加工这个专业中又新增了许多新的图纸,一些小伙伴还不清楚珠宝加工的这些新图纸到底有哪些,下面就来为大家详细的介绍一下。前言:本数据均为 9.0 A测BUILD34902 珠宝加工数据。游戏更新后,如有更新,会重…...
织梦门户网站模板/关键词优化公司哪家好
调结者的执行actionStrutsExecuteFilter类的工作就是执行对应的action请求。StrutsExecuteFilter类的工作还需要有一个叫ExecuteOperations类的帮助。如果看过源码的朋友都知道,StrutsExecuteFilter类的代码里用了ExecuteOperations类的俩个方法。一个是:…...
合肥的网站建设公司哪家好/合肥网站建设优化
昨天 Go 1.13 终于发布了,虽然比预期延迟了半个月之久,但毕竟迟到总比不到好。Go 1.13 的发布为 Go 带来了不少变化(详见:https://golang.org/doc/go1.13 ),有些变化可能是开发者无法直接感觉到的ÿ…...
东莞网站建设乐云seo在线制作/谷歌chrome浏览器下载
好长时间没有用过Spring了. 突然拿起书.我都发现自己对AOP都不熟悉了.其实AOP的意思就是面向切面编程.OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解决问题的方法中的共同点,是对OO思想的一种补充!还是拿人家经常举的一个例子讲解一下吧:比如说,我们现在…...