软件工程师必备:C++与Java学习笔记大揭秘
简介:本压缩文件集合了软件工程师在学习C++和Java编程语言时所需的全方位学习资料。包含从基础到高级的众多主题,涵盖了数据库交互、Java核心概念、ORM框架、Web开发、C++基础语法和标准库、企业级组件开发、主流框架及面试准备等,旨在全面提高开发者的技能和面试能力。 
1. Java Database Connectivity (JDBC)
1.1 JDBC简介
Java Database Connectivity (JDBC) 是一种Java API,它可以使得Java程序在运行时与各种数据库进行连接、执行SQL语句以及处理返回结果。它主要负责数据库连接、SQL语句的执行以及结果的处理等功能,是Java开发中常用的数据库操作方式。
1.2 JDBC驱动类型
JDBC驱动程序分为四种类型,它们分别是JDBC-ODBC桥驱动、本地API部分Java驱动、JDBC网络纯Java驱动和本地协议部分纯Java驱动。根据不同的需求和数据库环境,开发者可以选择合适的驱动类型。
1.3 JDBC使用步骤
JDBC使用主要分为以下几个步骤:
1. 加载并注册JDBC驱动。
2. 建立与数据库的连接。
3. 创建Statement对象,用于执行SQL语句。
4. 通过Statement对象执行SQL语句,获得结果。
5. 处理结果(例如,使用ResultSet对象遍历查询结果)。
6. 关闭连接、Statement或PreparedStatement、ResultSet。
示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class SimpleJDBCExample {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 建立连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname", "user", "password");
// 创建Statement对象
stmt = conn.createStatement();
// 执行查询并获取结果
String sql = "SELECT * FROM table_name";
rs = stmt.executeQuery(sql);
// 处理结果
while (rs.next()) {
// 假设有一个名为column_name的列
System.out.println(rs.getString("column_name"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
以上代码展示了如何使用JDBC连接MySQL数据库,并执行一个简单的查询操作。注意,在实际开发中,为了提高性能和安全性,建议使用PreparedStatement代替Statement,并且使用try-with-resources语句来自动关闭资源。
2. Java核心概念与基础语法
2.1 Java基础语法概述
2.1.1 Java的数据类型和变量
Java语言提供了丰富的数据类型,用以处理各种不同形式的数据。这些数据类型大致可以分为两大类:基本数据类型和引用数据类型。
基本数据类型包括整型(byte, short, int, long)、浮点型(float, double)、字符型(char)以及布尔型(boolean)。Java中的基本数据类型直接存储值,且都有固定的大小。
byte:8位、数据范围 -128到127short:16位、数据范围 -32,768到32,767int:32位、数据范围约 -21亿 到 21亿long:64位、数据范围约 -9 10^18 到 9 10^18float:32位、单精度浮点数double:64位、双精度浮点数(默认的浮点类型)char:16位、字符型,采用Unicode编码,可以表示任何字符boolean:未定义大小,逻辑真或假
而引用数据类型则包括类(class)、接口(interface)、数组(array)。引用数据类型存储的是对象的引用(即内存地址),而不是对象本身。
变量是数据的容器,它们存储基本数据类型和引用数据类型的值。在Java中,定义变量需要指定数据类型和变量名:
int age = 25; // 定义一个int类型的变量age,并赋值为25
String name = "Alice"; // 定义一个String类型的变量name,并赋值为"Alice"
变量的命名要遵循一定的规范,比如使用有意义的英文单词,变量名可以包含字母、数字、下划线(但不能以数字开头),不能使用Java的关键字。
变量声明后,需要进行初始化才能使用。变量的作用域和生命周期由它们被声明的位置决定。在方法内部声明的变量是局部变量,它们只能在该方法内访问,并且在方法调用时创建,在方法执行完毕后销毁。
2.1.2 控制流语句
控制流语句是程序中用来控制程序执行流程的语句。在Java中,常见的控制流语句包括条件语句(if、else、switch)和循环语句(for、while、do-while)。
条件语句允许程序根据不同的条件执行不同的代码块:
if (condition) {
// 条件为真时执行的代码
} else if (anotherCondition) {
// 另一个条件为真时执行的代码
} else {
// 所有条件都不满足时执行的代码
}
对于多条件分支,可以使用 switch 语句:
switch (expression) {
case value1:
// 当表达式的值等于value1时执行的代码
break;
case value2:
// 当表达式的值等于value2时执行的代码
break;
default:
// 当没有任何case匹配时执行的代码
}
循环语句允许程序重复执行代码块直到满足特定条件:
for (int i = 0; i < 5; i++) {
// 循环5次,每次循环变量i的值增加1
System.out.println("This is loop number: " + i);
}
int count = 0;
while (count < 5) {
// 当count小于5时,执行循环体内的代码
System.out.println("Count is: " + count);
count++;
}
do {
// 至少执行一次循环体内的代码,之后检查条件
System.out.println("Count is: " + count);
count++;
} while (count < 5);
这些控制流语句是编写Java程序时构建逻辑流程的基础工具,理解它们的使用和影响对于编写有效的代码至关重要。
2.2 Java面向对象编程基础
2.2.1 类与对象的概念
面向对象编程(OOP)是Java编程语言的核心特性。在Java中,类是创建对象的模板。类定义了一组对象共有的属性和方法。属性用于表示对象的状态,而方法用于表示对象的行为。
定义一个类的基本语法如下:
public class MyClass {
// 类属性
int number;
String name;
// 类方法
public void display() {
System.out.println("Number is: " + number + ", Name is: " + name);
}
}
MyClass 类定义了两个属性: number 和 name ,以及一个方法 display() 。类属性和方法通常使用访问修饰符进行访问控制,例如 public 、 private 。
对象是类的实例。创建对象的过程叫做实例化。创建对象后,你可以通过对象调用类中定义的方法或者访问其属性:
MyClass obj = new MyClass(); // 创建MyClass的实例
obj.number = 10; // 设置属性
obj.name = "Object 1"; // 设置属性
obj.display(); // 调用方法
对象的创建和使用体现了封装性和数据隐藏的概念,即对象隐藏其内部状态,并通过公共方法接口与外界交互。这种机制可以保护对象内部状态不被非法修改,并且使得类的实现细节可以独立于使用它的代码。
2.2.2 继承、封装与多态的实现
继承是面向对象编程中重用代码的一个强大机制。它允许你定义一个类(称为子类或派生类)来继承另一个类(称为父类或基类)的属性和方法。这样,子类就拥有了父类的功能,并且可以添加或覆盖父类的方法。
public class Animal {
void eat() {
System.out.println("This animal eats food.");
}
}
public class Dog extends Animal {
void bark() {
System.out.println("The dog barks.");
}
}
Dog myDog = new Dog();
myDog.eat(); // 调用继承自Animal的eat方法
myDog.bark(); // 调用Dog类特有的bark方法
封装是将数据(或状态)和操作数据的代码捆绑在一起,形成一个对象,并且对外隐藏实现细节。封装可以通过访问修饰符实现。私有属性( private )不能在类的外部直接访问,只能通过类提供的公共方法(如getter和setter)访问:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
多态是指允许不同类的对象对同一消息做出响应。多态是通过继承和方法重写实现的。一个对象的实际类型可以在运行时才确定:
public class Animal {
void makeSound() {
System.out.println("Animal makes sound");
}
}
public class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Dog barks");
}
}
public class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Cat meows");
}
}
Animal myAnimal = new Dog();
myAnimal.makeSound(); // 输出 "Dog barks",展示了多态
在上述例子中, Animal 类是一个抽象的父类, Dog 和 Cat 是具体的子类。当我们创建 Dog 或 Cat 的对象,并将其赋值给 Animal 类型的引用时,Java虚拟机会在运行时调用相应子类的 makeSound() 方法。
封装性与继承性共同构成了面向对象设计的核心,而多态性使得程序能够以统一的方式处理不同类型的对象,极大地增强了程序的灵活性和可扩展性。
3. Hibernate框架与ORM技术
Hibernate框架作为一个强大的ORM(Object-Relational Mapping)工具,它能够将Java对象映射到关系数据库中。其核心作用是简化数据库编程,它在Java应用程序和数据库之间起到了桥梁的作用,自动处理数据的持久化,使得开发者能够以面向对象的方式来操作数据库,而无需编写大量繁琐的SQL语句。
3.1 Hibernate框架入门
3.1.1 ORM技术简介
ORM技术是将关系数据库中的数据映射到对象模型的技术,对象模型即是我们通常所说的类(Class)和对象(Object)。通过映射,ORM框架允许开发者像操作对象一样操作数据库。这种方式可以极大地提高开发效率,减少直接编写SQL代码的工作量。同时,它还带来了更好的代码可维护性以及可移植性。
ORM框架的原理主要基于三个主要的组件:数据模型、对象模型和映射机制。数据模型通常由关系数据库的表格组成,对象模型由面向对象语言中的类组成,映射机制则负责定义二者之间的对应关系。
3.1.2 Hibernate环境搭建与配置
Hibernate框架的搭建通常需要以下几个步骤:
- 添加依赖: 在项目中添加Hibernate相关的JAR包,可以通过Maven或Gradle等构建工具自动管理依赖,例如添加
hibernate-core依赖。 - 配置Hibernate: 创建并配置
hibernate.cfg.xml文件,该文件中包含了数据库连接的配置,包括数据库方言、连接URL、用户名、密码等信息。 - 实体映射: 创建实体类,并使用注解或XML文件定义实体类与数据库表的映射关系。
- 会话管理: 利用Hibernate提供的
SessionFactory和Session进行数据操作。
代码块示例:配置 hibernate.cfg.xml 文件
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/mydb</property>
<property name="connection.username">username</property>
<property name="connection.password">password</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<!-- Mapping files -->
<mapping class="com.example.MyEntity"/>
</session-factory>
</hibernate-configuration>
在上述配置文件中,我们配置了数据库连接驱动、URL、用户名、密码等信息。同时,指定数据库方言( dialect ),这样Hibernate就能够生成针对特定数据库的SQL语句。 show_sql 属性设置为 true 可以让我们看到Hibernate执行的所有SQL语句,这对于调试非常有用。 hbm2ddl.auto 属性配置为 update 时,Hibernate会在每次启动时检查数据库模式(schema)并更新它。
3.2 Hibernate的高级特性与实践
3.2.1 关联映射和查询
在复杂的业务场景中,对象之间往往存在多种关联关系,如一对一、一对多、多对多等。Hibernate提供了多种方式来处理这些关系映射。
一对一映射 通常通过 @OneToOne 注解来实现。对于一对多关系,可以使用 @OneToMany 和 @ManyToOne 注解。而对于多对多关系,使用 @ManyToMany 注解。
代码块示例:一对一映射
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(mappedBy = "employee")
private EmployeeDetail employeeDetail;
// Getters and Setters
}
@Entity
public class EmployeeDetail {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
@JoinColumn(name = "employee_id")
private Employee employee;
// Getters and Setters
}
在这个例子中, Employee 和 EmployeeDetail 实体通过 @OneToOne 注解进行一对一映射。 mappedBy 属性用于标注在被关联实体上,它指明了关系的双方谁是拥有方(拥有外键的一方)。
Hibernate的查询功能非常强大,提供了HQL(Hibernate Query Language)和Criteria API等多种查询方式。HQL是一种面向对象的查询语言,可以直接使用类名和属性名进行查询,而不需要关心数据库的表结构。
3.2.2 缓存机制和性能优化
Hibernate具有自己的一级和二级缓存机制。一级缓存是Session级别的缓存,每次开启一个新的Session时,Hibernate会自动为该Session创建一个新的缓存实例,此缓存是不可配置的,它保证了同一个Session范围内的数据一致性。二级缓存则是Session Factory级别的缓存,用于在多个Session之间共享数据,可以配置缓存的策略和存储方式。
代码块示例:二级缓存配置
<property name="cache.use_second_level_cache">true</property>
<property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
在 hibernate.cfg.xml 中,我们可以通过配置开启二级缓存,并指定使用EhCache作为缓存实现。配置二级缓存后,可以使用 @Cache 注解或XML配置来指定哪些实体使用二级缓存。
优化方面,除了利用Hibernate的缓存机制外,还需要注意以下几点:
- 合理的使用懒加载(Lazy Loading): 懒加载可以延迟加载关联对象,减少不必要的SQL查询,提高性能。
- 优化SQL查询: 使用HQL或Criteria API进行查询时,注意选择合适的查询方式和策略,避免N+1查询问题。
- 批量操作: 在需要批量处理数据时,尽量使用批量更新或批量删除,减少数据库操作的开销。
在处理关联映射和查询时,需要特别注意加载策略的选择,如懒加载和急加载的合理使用,可以有效提升应用程序的性能。在实际应用中,开发者应结合具体业务场景,使用合适的方式来解决数据关联问题,以达到最优的性能表现。
4. JavaServer Pages (JSP) 技术
4.1 JSP技术基础
4.1.1 JSP页面的基本结构和指令
JavaServer Pages (JSP) 是一种动态页面技术,用于开发Java Web应用程序。它允许开发者将Java代码嵌入到HTML页面中,从而使得网页内容可以动态生成。JSP页面的基本结构包含特定的指令和脚本元素,通过这些元素,开发者可以实现与用户交互、数据库连接以及页面逻辑处理等功能。
JSP页面由以下基本组件构成:
- 静态HTML或XML标记:构成页面的基础内容。
- 指令(Directives):用于设置整个页面的属性或行为,如引入Java类库、指定错误页面等。
- 脚本元素:包括声明(Declarations)、脚本片段(Scriptlets)和表达式(Expressions)。
- 动态内容生成:通过Java代码片段控制页面输出的动态内容。
JSP指令主要有三种类型:
- page指令:用于定义页面级别的属性,比如错误页面、缓冲大小、脚本语言等。
- include指令:用于在当前页面中包含其他文件的内容。
- taglib指令:用于定义和引用自定义标签库。
以下是一个简单的JSP页面例子:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="header.jsp" %>
<html>
<head>
<title>示例页面</title>
</head>
<body>
<h2>欢迎使用JSP</h2>
<% String name = request.getParameter("name"); %>
<p>您好,<%= name %>。</p>
</body>
</html>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:if test="${not empty name}">
<p>您输入的名字是:<c:out value="${name}"/></p>
</c:if>
在上述示例中, page 指令设置了页面的内容类型和脚本语言。 include 指令引入了页面头部信息。脚本片段 ( <% String name = request.getParameter("name"); %> ) 被用来获取用户通过查询字符串传递的参数,并存储到变量 name 中。表达式 ( <%= name %> ) 用于输出变量值。最后,使用了JSTL标签库来展示一个条件判断的结果。
4.1.2 JSP内置对象及其应用
JSP定义了一组内置对象,它们是预先定义的可以直接在JSP页面中使用的对象实例。这些对象包括:request、response、session、application、out、config、pageContext、page 和 exception。内置对象使开发人员能够更方便地访问与Web应用相关的服务和功能。
下面简要介绍几个常用的JSP内置对象:
- request:代表客户端的请求,可用来获取客户端请求的参数、头信息以及处理请求转发等。
- response:代表对客户端的响应,可用于设置响应状态码、添加响应头、发送错误页面等。
- session:代表用户的会话,可以保存用户特定的信息,如用户登录状态、购物车等。
- application:代表整个Web应用的环境,可用来共享应用程序范围内的数据。
- out:一个用来向客户端输出内容的PrintWriter对象。
接下来是一个使用request和response对象的JSP页面示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<form action="login.jsp" method="post">
用户名:<input type="text" name="username" /><br />
密码:<input type="password" name="password" /><br />
<input type="submit" value="登录" />
</form>
<%-- 获取请求参数 --%>
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("admin".equals(username) && "123456".equals(password)) {
response.sendRedirect("welcome.jsp");
} else {
out.println("<p>用户名或密码错误!</p>");
}
%>
</body>
</html>
在上述示例中,我们创建了一个简单的登录表单,并在表单提交时使用 request.getParameter 方法获取用户名和密码。然后通过 response.sendRedirect 方法进行重定向到另一个页面,如果是登录成功的话。
4.1.3 JSP页面的生命周期
JSP页面的生命周期包括以下几个阶段:
- 加载和实例化JSP页面对应的Servlet类。
- 调用Servlet的
jspInit()方法进行初始化。 - 处理请求:每次用户请求页面时,都会调用
_jspService()方法。 - 当Web应用被卸载或者Web服务器重启时,调用
jspDestroy()方法进行清理工作。
以上几个阶段使得JSP页面可以响应请求并提供动态内容。尽管可以使用JSP直接编写业务逻辑,但最佳实践是将业务逻辑处理放在JavaBean中,而将JSP页面主要用来展示数据。
4.1.4 JSP页面错误处理
JSP提供了错误处理机制,允许开发者定义自定义错误页面。通过设置 page 指令中的 errorPage 和 isErrorPage 属性,可以将一个JSP页面配置为错误页面,并指定它作为另一个JSP页面的错误处理页面。
示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
<title>示例页面</title>
</head>
<body>
<h2>可能会产生错误的内容</h2>
<% int i = 1 / 0; %>
</body>
</html>
error.jsp示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>错误页面</title>
</head>
<body>
<h1>出错了!</h1>
<p>错误信息:${exception.message}</p>
</body>
</html>
以上代码中,如果在 example.jsp 页面中发生错误(例如,尝试除以零),则请求将自动转发到 error.jsp 页面,并显示错误信息。
4.2 JSP与Servlet的协作
4.2.1 Servlet与JSP的关系
Servlet和JSP是Java EE技术中用于创建动态网页的两个核心组件,它们之间存在紧密的联系。尽管它们都可以处理HTTP请求、生成响应内容,但它们各自的侧重点不同。
- Servlet更适合处理逻辑控制,例如请求处理、调用业务逻辑、处理业务数据等。
- JSP则更擅长于展示逻辑,如HTML、XML内容的动态生成。
在实际开发中,Servlet通常负责接收请求,处理业务逻辑,然后将数据传递给JSP页面。JSP页面负责数据的展示。这种模型称为Model 2架构,它是MVC(模型-视图-控制器)设计模式在Web应用程序中的实现。
4.2.2 MVC模式在Web开发中的应用
MVC(Model-View-Controller)设计模式是一个广泛使用的架构模式,它将应用程序分为三个主要组件,以促进应用的模块化和可维护性。在Java Web应用中,MVC模式的典型实现涉及Servlet作为Controller,JSP作为View,以及JavaBean或EJB作为Model。
- Model(模型):包含了应用程序的数据和业务逻辑。它与数据库交互,维护数据状态,并为Controller提供业务服务。
- View(视图):负责展示Model中的数据,通常由JSP页面实现。它从Controller获取数据并生成用户界面。
- Controller(控制器):处理用户请求并调用Model进行数据处理,然后选择View来显示结果。在Java Web应用中,Servlet通常充当Controller的角色。
下图展示了Servlet和JSP如何在MVC架构中协作:
flowchart LR
client --> servlet[Controller<br/>Servlet]
servlet --> model[Model<br/>JavaBean / EJB]
model -->|返回数据| servlet
servlet --> jsp[View<br/>JSP]
jsp -->|渲染结果| client
在上面的流程图中,客户端(如Web浏览器)首先向Servlet发送请求。Servlet处理请求,调用Model进行业务处理,并获取数据。然后,Servlet根据业务处理的结果,选择相应的JSP页面作为视图来渲染结果,最终将响应返回给客户端。
4.2.3 Servlet与JSP的协作示例
下面是一个简单的Servlet与JSP协作的例子。这个例子中,我们创建了一个简单的用户信息管理页面,用户可以通过输入用户名和密码登录。
Servlet代码示例:
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// 假设这些是我们的用户数据
User user = new User();
user.setUsername("admin");
user.setPassword("123456");
// 检查用户名和密码
if (user.getUsername().equals(username) && user.getPassword().equals(password)) {
// 登录成功,将用户信息存入session
request.getSession().setAttribute("user", user);
// 转发到登录成功页面
RequestDispatcher dispatcher = request.getRequestDispatcher("welcome.jsp");
dispatcher.forward(request, response);
} else {
// 登录失败,转发到登录页面,并提示错误
request.setAttribute("error", "无效的用户名或密码");
RequestDispatcher dispatcher = request.getRequestDispatcher("login.jsp");
dispatcher.forward(request, response);
}
}
}
JSP页面示例(login.jsp):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<%
String error = (String) request.getAttribute("error");
if (error != null) {
%>
<p style="color: red;"><%= error %></p>
<% } %>
<form action="login" method="post">
用户名:<input type="text" name="username" /><br />
密码:<input type="password" name="password" /><br />
<input type="submit" value="登录" />
</form>
</body>
</html>
JSP页面示例(welcome.jsp):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>欢迎页面</title>
</head>
<body>
<%
User user = (User) session.getAttribute("user");
if (user != null) {
%>
<h1>欢迎,<%= user.getUsername() %>!</h1>
<a href="logout.jsp">登出</a>
<% } else { %>
<a href="login.jsp">返回登录页面</a>
<% } %>
</body>
</html>
在上述代码中,我们创建了一个简单的用户登录系统。 LoginServlet 处理用户提交的登录信息,并验证用户名和密码。如果登录成功,它将用户对象存储在会话中,并将请求转发到 welcome.jsp 页面。如果登录失败,它将设置错误信息并返回到 login.jsp 页面。在 welcome.jsp 页面中,根据会话中是否有用户对象来显示欢迎信息或返回登录链接。
通过这种方式,Servlet和JSP在Web应用中各司其职,共同为用户提供动态交互的网页。
5. C++基础语法与面向对象特性
C++语言作为继C语言之后的一种面向对象的编程语言,不仅继承了C语言的高效性能,还增加了面向对象编程的能力。这使得C++在软件开发领域扮演着至关重要的角色,特别是在系统软件、游戏开发、实时物理模拟等高性能要求的领域。
5.1 C++基础语法详解
5.1.1 C++的数据类型和变量
C++支持多种数据类型,可以分为基本数据类型和复合数据类型。基本数据类型包括整型(如int、char)、浮点型(如float、double)、布尔型(bool)等。复合数据类型则包括数组、结构体、联合体、类和枚举等。这些数据类型能够满足不同场景下对数据的存储需求。
定义变量时,需要指定数据类型,并且可以在定义时初始化变量。例如:
int num = 10; // 整型变量
double pi = 3.14159; // 双精度浮点型变量
char letter = 'A'; // 字符变量
bool flag = true; // 布尔型变量
5.1.2 C++控制流语句
控制流语句用于控制程序的执行顺序。C++提供了与C语言类似的控制流语句,包括条件语句(if-else、switch)和循环语句(for、while、do-while)。
- if-else语句 用于基于条件执行不同的代码块:
int num = 5;
if (num > 0) {
std::cout << "Number is positive." << std::endl;
} else if (num == 0) {
std::cout << "Number is zero." << std::endl;
} else {
std::cout << "Number is negative." << std::endl;
}
- switch语句 提供了一种多选一的执行路径:
int choice = 2;
switch (choice) {
case 1:
std::cout << "You chose option 1." << std::endl;
break;
case 2:
std::cout << "You chose option 2." << std::endl;
break;
default:
std::cout << "Invalid choice." << std::endl;
}
5.2 C++面向对象编程深入
5.2.1 类与对象、继承与多态
C++面向对象编程的三大特性包括封装、继承和多态。类是创建对象的蓝图,对象是类的实例。
- 类与对象 :类是具有相同属性和行为的一组对象的抽象。对象是类的具体实例。
class Person {
public:
std::string name;
int age;
void introduce() {
std::cout << "Hello, my name is " << name << " and I am " << age << " years old." << std::endl;
}
};
int main() {
Person person1;
person1.name = "Alice";
person1.age = 30;
person1.introduce();
return 0;
}
- 继承 :允许一个类继承另一个类的属性和方法。这有助于代码复用,并实现类的层次结构。
class Employee : public Person {
public:
std::string department;
void work() {
std::cout << name << " is working in " << department << std::endl;
}
};
int main() {
Employee employee1;
employee1.name = "Bob";
employee1.age = 25;
employee1.department = "IT";
employee1.introduce();
employee1.work();
return 0;
}
- 多态 :通过基类的指针或引用来实现不同派生类对象的同一接口,从而实现程序的可扩展性和灵活性。
5.2.2 模板编程和STL库的使用
C++模板编程提供了一种泛型编程的方法,使得函数或类可以处理不同类型的数据,而不需要为每种数据类型编写重复的代码。标准模板库(STL)是C++中用于数据结构和算法的模板集合,包括向量、列表、队列、栈、集合、映射等。
- 模板函数 :
template <typename T>
void Swap(T &a, T &b) {
T temp = a;
a = b;
b = temp;
}
int main() {
int x = 10, y = 20;
Swap(x, y);
std::cout << x << " " << y << std::endl;
return 0;
}
- STL容器 :
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
for (int i : vec) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
通过模板和STL库的使用,可以编写出更加通用、高效且易于维护的代码。
简介:本压缩文件集合了软件工程师在学习C++和Java编程语言时所需的全方位学习资料。包含从基础到高级的众多主题,涵盖了数据库交互、Java核心概念、ORM框架、Web开发、C++基础语法和标准库、企业级组件开发、主流框架及面试准备等,旨在全面提高开发者的技能和面试能力。
更多推荐


所有评论(0)