当前位置: 首页 > news >正文

C++学习(1)

一、C++概述(了解)

C++在C语言的基础上添加了面向对象编程和泛型编程的支持

二、helloword程序(掌握)

#define _CET_SECURE_NO_WARNINGS//在开发软件visual studio编译 c文件时, visual studio认为strcpy,scanf等函数不安全的导致报警告和错误,导致无法编译通过。
#include <iostream>//引入头文件
using namespace std;//标准命名空间
int main()
{//C++在C语言的基础上添加了面向对象和泛型编程的支持//cout是标准的输出流对象,打印字符串//endl是刷新缓冲器,并换行cout << "helloword"<<endl;system("pause");//意思就是让程序暂停一下,然后按任意键继续,初学的时候最多见于程序的末尾处,用于看运行结果,避免程序一闪而过。return 0;
}

三、面向对象的三大特性(了解)


    封装 把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏(把函数和变量写在类里面,并给他们权限)
    继承 继承所表达的是类之间相关的关系,这种使得对象可以继承另外一类对象的特征和能力。减少代码和数据冗余
    多态 一个接口,多个方法


四、命名空间


    1.为什么有命名空间:是因为解决多人合作是取标识符是重命名(名称冲突)的问题
    2.什么是命名空间:

#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
namespace A {//命名空间,A是空间的名字int a;void func() {}
}
namespace Maker {int a;namespace B{int b;}
}
namespace Maker {//这个Maker和上面的Maker是一个命名空间int c;
}
int main()
{system("pause");return 0;
}

命名空间的注意


1.命名空间只能写在全局
2.命名空间可以嵌套命名空间
3.命名空间是开放,随时可以加入新成员,但是新成员只能在加入后使用
4.匿名的命名空间
5.命名空间可以取别的名字
6.分文件编写代码时,如果.h中有两个命名空间,但是里面的成员函数或者成员变量同名时,在.cpp中实现函数时,需要加上命名空间;

头文件

#pragma once
//.h 和.cpp的区别
// 函数的 .h声明 .cpp实现
//一、用法不同
//1、.h文件直接#include到需要的.cpp文件里,就相当于把.h文件的代码拷贝到.cpp文件
//2、.cpp文件需要先自己生成.o文件,把不同.o文件连接生成可执行文件。
//比如有3个cpp文件:a.cpp、b.cpp、c.cpp,其中一个包含main()函数,需要生成test程序,
//步骤:
//(1)生成3个.o文件:
//	cc - c a.cpp
//	cc - c b.cpp
//	cc - c c.cpp
//	这样就得到3个.o文件:a.o、b.o、c.o
//	(2)链接生成test程序:cc - o test a.o b.o c.o
//	就得到test可执行程序,输入. / test就可执行程序了。
//	二、规范不同
//	1、h文件一般包含类声明;
//	2、cpp文件一般为同名h文件定义所声明的类函数。
//	说明:一般可在cpp文件直接添加main()就可以测试该模块功能。
#include<iostream>
using namespace std;
namespace myMaker1 {//int ma;//定义变量会报错,在.cpp中引入.h相当于将.h中的文件复制过去,所以就存在ma多次定义了,出现变量MM重复的问题;void func();
}
namespace myMaker2 {void func();
}
class test
{
};

源文件

#define _CET_SECURE_NO_WARNINGS
#include <iostream>
#include "03test.h"
using namespace std;
//using 声明可使得指定的标识符可用
void test() {cout << "namespace Maker c" << Maker::c << endl;
}
namespace Maker {int c = 100;namespace B {int b = 200;}
}void test01(){//新名字 旧名字namespace nameMaker = Maker;//在合作项目当中别人的命名空间和你的一样的时候,你可以给自己的命名空间取别名cout << nameMaker::B::b << endl;
}
void test1() {cout << "namespace Maker c" << Maker::c << endl;
}
//类似与static int d=50;只允许该文件使用的变量
namespace {int d=50;
}
int mya = 10;//C语言中局部变量存在栈里,全局变量存静态存储区。
//局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。
//全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;
int main()
{int mya = 20;//就近原则cout << "mya=" << mya << endl;//20cout << "::mya" << ::mya << endl;//10cout << "namespace Maker c" << Maker::c << endl;//::作用域运算符 用来访问某个作用域里面的成员cout << Maker::B::b << endl;cout << d << endl;//50//test1();//会报错,因为声明命名空间在函数之后test1();//代码变为可执行程序的四步:预处理 编译 汇编 链接(报错中出现无法解释的外部命令说明链接出现了问题)myMaker1::func();//myMaker1为头文件中的命名空间system("pause");return 0;
}
//两个同名的变量,一个全局变量一个局部变量,那局部变量在前期作用域具有较高的优先权,它能屏蔽全局变量

五、using声明和编译指令(重点)

#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;//要使用iostream就要将对应的命名空间引入
namespace A
{int a = 10;int b = 20;int c = 30;
}
void test01() {//using声明是让命名空间中某个标识符可以直接使用,就等于直接把int a = 10;给替换过来,就成为了局部变量using A::a;cout << a<<endl;//int a = 50;//注意:using声明了某个变量,在该作用域不能定义同名的变量
}
void test02()
{//using编译指令,让某个命名空间的标识符都可以直接使用using namespace A;cout << a << endl;cout << b << endl;cout << c << endl;int a = 100;//为什么不会冲突;//类似于命名空间中的a是全局变量,此处的a是局部变量cout << a << endl;
}
int main()
{test01();test02();system("pause");return 0;
}

六、struct类型加强(重点)

加强一  c中定义结构体需要加上struct关键字,C++不需要

加强二  c中结构体中只能定义成员变量,不能定义成员函数。C++既可以定义成员变量也可以定义成员函数

#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//加强一
//这是自定义的数据类型
struct Maker//没有分配空间,因为这只是一个数据类型
{char name[64];int age;
};
void test01() {//int 只是一个数据类型,只写int没有分配空间Maker a;//这时候才进行分配命名空间,不需要加struct就可以定义变量}
//加强二
struct Maker2
{int a;void func() {//结构体内可以写函数cout << "func" << endl;}
};
void test02(){Maker2 a2;a2.func();
}
int main()
{test01();test02();system("pause");return 0;
}

七、更严格的类型转换(了解)

不能隐式转换,必须是显示的转换

#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main()
{//不能进行隐式转换,只能进行显示转换//char* p = malloc(64);//报错;c中是可以这样写的但是C++数据类型是比较严格的char* p = (char*)malloc(64);//malloc返回的是void *  malloc分配的内存大小至少为参数所指定的字节数system("pause");return 0;
}

八、三目运算符(了解)

C++案例

#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
void test()
{int a = 10;int b = 20;(a > b ? a : b) = 100;//C语言的三目运算符返回的是右值//C++的三目运算符返回的是左值是空间cout << "a=" << a << endl;cout << "b=" << b << endl;
}
int main()
{test();system("pause");return 0;
}

C案例

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void test()
{int a = 10;int b = 20;printf("%d\n", a > b ? a : b);//( a > b ? a : b)=100//错误//这个表达式返回的右值是数值,返回的是20//20=100*(a > b ? &a : &b) = 100;printf("b=%d\n", b);
}
int main()
{test();return 0;
}

九、C/C++的const(重点)

const变量为常量,不能直接修改,可以间接修改。

C++案例

C++语言的const修饰的变量有时候有空间,有时候没有空间(发生常量折叠,且没有对变量进行取地址操作)

C++语言中const修饰的全局变量具有内部链接属性,只能在当前文件使用。要使用外部链接的话两侧都加extern即可

#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
const int a = 100;//没有内存
void test()
{//发生了常量折叠cout << "a:" << a << endl;//在编译阶段,编译器cout << "a:" << 100 << endl; 速度更快cout << "&a:" << &a << endl;//volatile禁止优化volatile const  int bb = 20;//栈区int* p = (int*)&bb;//进行了取地址操作,所以有空间*p = 2000;cout << "bb:" << bb << endl;//优化的时候为20 编译器直接修改cout << "bb:" << 20 << endl; 编译器的问题  添加volatile后为2000cout << "*p" << *p << endl;//2000cout << "bb的地址" << (int)&bb << endl;cout << "p指向的地址" << (int)p << endl;
}
int main()
{test();system("pause");return 0;
}

C++编译器不能优化数据的情况

1.如果用变量给const修饰的局部变量赋值,那么编译不会优化

2.不能优化自定义数据类型

#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
void test() {int a = 10;const int b = a;int *p = (int *)&b;*p = 100;cout << "b=" << b << endl;cout << "*p=" << *p << endl;
}
//自定义数据类型,编译器不能优化
struct Maker{Maker(){//构造函数a = 100;}int a;
};
void test02(){const Maker ma;//实例化对象,并初始化acout << ma.a<<endl;Maker *p = (Maker *)&ma.a;p->a=200;cout<<ma.a<<endl;//没有优化,因为不能优化自定义数据类型
}
int main()
{//test();test02();system("pause");return 0;
}

C案例

全局的const不能直接修改也不能间接修改

局部的const不可以直接修改但是可以间接修改

C语言的const修饰的全局变量具有外部链接(extern)属性

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int a = 10;//常量区,一旦初始化,不能修改
int main()
{//C语言的const修饰的变量都有空间不能直接修改全局常量//a = 200;也不能间接修改全局常量//int *p = (int*)&a;//*p = 100;//printf("%d\n",a);const int b = 20;//栈区//b = 200;//不能直接修改局部常量int *p = &b;//可以间接修改局部常量*p = 200;printf("%d\n", b);//使用别的文件的全局const修饰的变量需要声明extern const int c;//C语言的const修饰的全局变量具有外部链接属性printf("%d\n", c);system("pause");//让程序暂停一下return 0;
}

相关文章:

C++学习(1)

一、C概述&#xff08;了解&#xff09; C在C语言的基础上添加了面向对象编程和泛型编程的支持 二、helloword程序&#xff08;掌握&#xff09; #define _CET_SECURE_NO_WARNINGS//在开发软件visual studio编译 c文件时, visual studio认为strcpy,scanf等函数不安全的导致报…...

机器人如何有效采摘苹果?

摘要&#xff1a;本文利用动捕数据构建拟人运动模型&#xff0c;对比观察两种苹果采摘模式&#xff0c;并对系统性能进行全面评估&#xff0c;为提高机器人采摘效率提供创新方法。 近期&#xff0c;一项关于苹果采摘机器人的有趣研究—— "Design and evaluation of a rob…...

C# OpenCvSharp Yolov8 Detect 目标检测

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Open…...

rust数组

一、定义数组 &#xff08;一&#xff09;一维数组 1.指定所有元素 语法格式 let variable_name: [dataType; size] [value1,value2,value3];例如 let arr: [i32; 4] [10,20,30,40];2.指定初始值和长度 所有元素具有相同的值 语法格式 let variable_name: [dataType; siz…...

ubuntu | 安装NVIDIA套件:驱动、CUDA、cuDNN

CUDA 查看支持最高的cuda版本 nvidia-smiCUDA Version:12.2 区官网下在12.2.x最新的版本即可CUDA Toolkit Archive | NVIDIA Developer 下载安装 wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run sudo…...

JAVA学习笔记

一、学习要点 java的最大优势就是跨平台&#xff1b; java的三个版本&#xff0c;javaSE标准版本&#xff0c;javaEE企业版本&#xff0c;javaME微型版本&#xff08;用的比较少&#xff09;&#xff1b; JVM(Java Virtual Machine&#xff0c;Java虚拟机)&#xff1b; JRE…...

车载软件架构 —— 持续集成持续交付

车载软件架构 —— 持续集成持续交付 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 对学习而言,学习之后的思考、思考之后的行动、行动之后的改变更重要,如果不盯住内层的改变量,那么在表层投…...

c++ 二元运算符重载, 以加法为例

/* * c 二元运算符重载&#xff0c; 以加法为例 */ #include <stdio.h> class Complex { public: int r0; // real, 实部 int v0; //virtual, 虚部 }; // 重载加法 操作符 // 可见,c2元运算符,取其左侧为第一参数,右侧为第二参数 // 返回值可以付给新的变量 C…...

基于 SpringBoot+Vue的电影影城管理系统,附源码,数据库

文章目录 第一章 简介第二章 技术栈第三章 功能分析第四章 系统设计第5章 系统详细设计六 源码咨询 第一章 简介 本影城管理系统&#xff0c;是基于 Java SpringBoot 开发的。主要包括二大功能模块&#xff0c;即用户功能模块和管理员功能模块。 &#xff08;1&#xff09;管…...

Docker实战技巧(二):Kubernetes基础操作实战

Kubernetes定位在Saas层,重点解决了微服务大规模部署时的服务编排问题 1、关闭防火墙并设置开机禁用   systemctl stop firewalld   systemctl disable firewalld 2、配置repo   cd /etc/yum.repos.d/   下载Docker repo   wget https://mirrors.aliyun.com/docker-…...

计算机视觉与深度学习-循环神经网络与注意力机制-Attention(注意力机制)-【北邮鲁鹏】

目录 引出Attention定义Attention-based model通俗解释应用在图像领域图像字幕生成&#xff08;image caption generation&#xff09;视频处理 序列到序列学习&#xff1a;输入和输出都是长度不同的序列 引出Attention 传统的机器翻译是&#xff0c;将“机器学习”四个字都学…...

Centos7安装wps无法打开及字体缺失的问题解决

在centos7上安装了最新的wps2019版本的wps-office-11.1.0.11704-1.x86_64.rpm&#xff0c;生成了桌面图标并信任&#xff0c;可以新建文件&#xff0c;但是软件无法打开。在终端执行如下命令&#xff0c;用命令行启动wps&#xff1a; cd /opt/kingsoft/wps-office/office6/ ./…...

华为OD机试真题-会议接待-2023年OD统一考试(B卷)

题目描述: 某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车,可以同时接待多个代表团,为了提高车辆利用率,请帮接待员计算可以坐满车的接待方案,输出方案数量。 约束: 1、一个团只能上一辆车,并且代表团人数(代表团数量小于30,每个代表团人数小于30)小于…...

mysql explain学习记录

参考了公司内相关博客&#xff0c;实践并记录下&#xff0c;为后面分析并优化索引做准备。 MySQL explain命令是查看MySQL查询优化器如何执行查询的主要方法&#xff0c;可以很好的分析SQL语句的执行情况。 每当遇到执行慢&#xff08;在业务角度&#xff09;的SQL&#xff0c;…...

电压放大电路的作用有哪些(电压放大器)

电压放大电路是电子电路中常见且重要的组件&#xff0c;其主要作用是将输入信号的电压放大到所需的输出电压级别&#xff0c;并保持输入信号的形状和准确度。电压放大电路广泛应用于各种电子设备和系统中&#xff0c;具有以下几个重要的作用&#xff1a; 信号放大&#xff1a;电…...

编译opencv-3.4.5 [交叉编译]

在unbuntu20.04环境下编译opencv3.4.5&#xff0c; cmake 版本&#xff1a;3.27.4 gcc 版本&#xff1a;11.4.0 g版本&#xff1a;11.4.0 在此环境下编译opencv4.5.4正常。 1. 编译时遇到的问题 &#xff08;1&#xff09; Built target libprotobuf make: *** [Makefile:163…...

Canal 实现MySQL与Elasticsearch7数据同步

1 工作原理 canal 模拟 MySQL slave 的交互协议&#xff0c;伪装自己为 MySQL slave &#xff0c;向 MySQL master 发送 dump协议 MySQL master 收到 dump 请求&#xff0c;开始推送 binary log 给 slave (即 canal ) canal 解析 binary log 对象(原始为 byte 流) 优点&…...

网络安全攻防对抗之隐藏通信隧道技术整理

完成内网信息收集工作后&#xff0c;渗透测试人员需要判断流量是否出得去、进得来。隐藏通信隧道技术常用于在访问受限的网络环境中追踪数据流向和在非受信任的网络中实现安全的数据传输。 一、隐藏通信隧道基础知识 &#xff08;一&#xff09;隐藏通信隧道概述 一般的网络通…...

读书笔记:多Transformer的双向编码器表示法(Bert)-2

多Transformer的双向编码器表示法 Bidirectional Encoder Representations from Transformers&#xff0c;即Bert&#xff1b; 第2章 了解Bert模型&#xff08;掩码语言模型构建和下句预测&#xff09; 文本嵌入模型Bert&#xff0c;在许多自然语言处理任务上表现优秀&#…...

Python 基于PyCharm断点调试

视频版教程 Python3零基础7天入门实战视频教程 PyCharm Debug&#xff08;断点调试&#xff09;可以帮助开发者在代码运行时进行实时的调试和错误排查&#xff0c;提高代码开发效率和代码质量。 准备一段代码 def add(num1, num2):return num1 num2if __name__ __main__:f…...

spring security auth2.0实现

OAuth 2.0 的认证/授权流程 jwt只是认证中的一步 4中角色 资源拥有者&#xff08;resource owner&#xff09;、客户端&#xff08;client 第三方&#xff09;、授权服务器&#xff08;authorization server&#xff09;和资源服务器&#xff08;resource server&#xff09;。…...

MySQL(6)LOCK和MVCC

一、锁的分类 按照锁的属性&#xff1a;读锁、写锁、共享锁、排它锁、悲观锁、乐观锁 按照锁的范围&#xff1a;表锁、页锁、间隙锁、临键锁、行锁 按照锁的作用&#xff1a;意向锁、意向共享锁、意向排它锁、IS锁、IX锁 二、MySQL为什么要有锁 锁是计算机协调多个进程或线程并…...

最新IDE流行度最新排名(每月更新)

2023年09月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&#xff0c;Top IDE索引可以帮助您决定在软件开发项目中使用哪个IDE …...

I2C的上拉电阻如何计算?

说明&#xff1a; 1、本文只说明I2C上拉电阻的最小值如何计算。 2、I2C最小值和最大值计算的详细原理可以参考这篇文章&#xff1a;https://mp.weixin.qq.com/s/ZvJJ0rPRd_STULj8g1H81A。 3、I2C最小值的计算方式比较简单&#xff0c;在实际应用中计算出最小值&#xff0c;然后…...

Centos下安装 oracle11g 博客2

[oraclewangmengyuan database]$ ./runInstaller -silent -responseFile /home/oracle/database/response/db_install.rsp -ignorePrereq ./runInstaller -silent -responseFile /home/oracle/database/response/db_install.rsp -ignorePrereq 正在启动 Oracle Universal Insta…...

记一次逆向某医院挂号软件的经历

背景 最近家里娃需要挂专家号的儿保&#xff0c;奈何专家号实在过于抢手&#xff0c;身为程序员的我也没有其他的社会资源渠道可以去弄个号&#xff0c;只能发挥自己的技术力量来解决这个问题了。 出师不利 首先把应用安装到我已经 Root 过的 Pixel 3 上面&#xff0c;点击应…...

Canal实现Mysql数据同步至Redis、Elasticsearch

文章目录 1.Canal简介1.1 MySQL主备复制原理1.2 canal工作原理 2.开启MySQL Binlog3.安装Canal3.1 下载Canal3.2 修改配置文件3.3 启动和关闭 4.SpringCloud集成Canal4.1 Canal数据结构![在这里插入图片描述](https://img-blog.csdnimg.cn/c64b40c2231a4ea39a95aac81d771bd1.pn…...

Kafka的消息传递保证和一致性

前言 通过前面的文章&#xff0c;相信大家对Kafka有了一定的了解了&#xff0c;那接下来问题就来了&#xff0c;Kafka既然作为一个分布式的消息队列系统&#xff0c;那它会不会出现消息丢失或者重复消费的情况呢&#xff1f;今天咱们就来一探。 实现机制 Kafka采用了一系列机…...

Docker 部署 Firefly III 服务

拉取最新版本的 Firefly III 镜像&#xff1a; $ sudo docker pull fireflyiii/core:latest在本地预先创建好 upload 和 export 目录, 用于映射 Firefly III 容器内的 /var/www/html/storage/upload 和 /var/www/html/storage/export 目录。 使用以下命令来运行 Firefly III …...

配置OSPFv3基本功能 华为笔记

1.1 实验介绍 1.1.1 关于本实验 OSPF协议是为IP协议提供路由功能的路由协议。OSPFv2&#xff08;OSPF版本2&#xff09;是支持IPv4的路由协议&#xff0c;为了让OSPF协议支持IPv6&#xff0c;技术人员开发了OSPFv3&#xff08;OSPF版本3&#xff09;。 无论是OSPFv2还是OSPFv…...

营销型网站建设模板下载/游戏推广是什么工作

修改图片格式 matlab代码 其实内部一些代码是用了rbg的fast-rcnn代码的。 \datasets\VOCdevkit2007\VOCcode\VOCinit.m里面&#xff0c;查找jpg,改成png 以及&#xff0c;\imdb\imdb_from_voc.m里面&#xff0c;查找imdb.extension&#xff0c;修改它的值为png python代码 py-f…...

东莞人才网站/百度app下载链接

美女&#xff0c;当你选择丈夫时&#xff0c;请先把电子工程师与以下的职业作一番比较&#xff1a;      医生几乎所有女人都喜欢追求当医生的。所以不要期望你们的婚姻能持续五年以上&#xff0c;因为早晚有一天&#xff0c;他会跟某个护士小姐跑掉的&#xff0c;或是被…...

做微信的网站有哪些/千锋教育可靠吗

考虑下面这个“魔力”三角形环&#xff0c;在其中填入1至6这6个数&#xff0c;每条线上的三个数加起来都是9。 从最外侧结点所填的数最小的线&#xff08;在这个例子中是4,3,2&#xff09;开始&#xff0c;按顺时针方向&#xff0c;每个解都能被唯一表述。例如&#xff0c;上面…...

javaweb做音乐网站/seo含义

主从复制模式 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。 前者称为主节点&#xff08;master&#xff09;&#xff0c;后者成为从节点&#xff08;slave&#xff09;&#xff1b;数据的复制是单向&#xff0c;主要是由主节点到从…...

章丘网站制作/数字营销成功案例

HTML5 服务器发送事件(Server-Sent Events) 服务器发送事件&#xff08;Server-sent Events&#xff09;是基于 WebSocket 协议的一种服务器向客户端发送事件和数据的单向通讯。 HTML5 服务器发送事件&#xff08;server-sent event&#xff09;允许网页获得来自服务器的更新。…...

公司网站公司/网络舆情监控系统

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/77587740 查看进程 ps ps aux查看所有进程&#xff0c;使用BSD操作系统格式 ps -le 查看系统所有进程&#xff0c;使用Linux标准命令格式 参数 - a…...