我的C++成长之路(-) 学习阶段 -02 函数、模板、数组的操作

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

接着上一节的内容

数组:是若干相同类型的对象集合体,它具有一定的顺序关系,在内存中占有一组联系的内存地址。定义格式:数据类型 数组名[常量表达式];--常量表达式表示数组大小

int a[5];//a有5个元素的整型数组,不能整体输入 cin>>a 或输出 cout<<a

字符数组:用来存放字符量的数组

测试文件Test.cpp,实现2个矩阵的乘法运算

#include <iostream>

using namespace std;

int main(int argc, char* argv[])

{
/*
float x[5], sum = 0;// 输入5个数求平均
cout<<"输入5个数:";
for(int i=0; i<5; i++) cin >> x[i];
for(int i=0; i<5; i++) sum += x[i];
cout<<"平均值:" << sum/5 << endl;*/

//定义一个字符数组并输出其内容
/*
char c[2][5] = {{'c', '+', '+'}, {'H', 'e', 'l', 'l', 'o'}} ;
for(int i=0; i<2; i++)
{
  for(int j=0; j<5; j++) cout<< c[i][j];
  cout<<endl;
}*/


 // 利用字符数组操作字符串
/*

char c[100];
cin >> c;
cout << c;// 控制台输入输出字符
char str[10];
memset(str, 0x00, sizeof(str)-1);// 将数组中所有元素设为空值
memset(&str[9], '\0', 1);// 最后一位设置为0,否则字符串无法定位结束位置
cout << str << endl;// 输出字符串

*/

 /*
int m[3][4]={{1,2,3,4},{2,2,3,1},{5,4,2,3}}; //矩阵1,定义并初始化
int n[4][3]={{6,3,2},{2,8,1},{6,9,5},{2,4,6}}; //矩阵2,定义并初始化
int q[3][3]={{0}, {0}, {0}};// 结果矩阵
for(int i=0; i<3; i++)
  for(int j=0; j<3; j++)
   for(int k=0; k<4; k++)
    q[i][j] += m[i][k] * n[k][j];// 将对应的行和列相应的元素相乘并累加
   for(int i=0; i<3; i++)
   {
    for(int j=0; j<3; j++)
     cout<<q[i][j]<<" ";// 输出结果矩阵
    cout<<endl;//换行
   }
*/

 return 0;
}
函数:C++的模块分为函数(function)和类(class).

本章主要理解函数的概念、使用、参数传递机制、作用域规则、内联函数、函数的嵌套和递归的使用。掌握函数模板的编写方法

定义格式

返回类型 函数名(形参)

{

    ....//语句序列

    return 返回类型的值;

}

函数原型:和变量的使用一样,函数需要先声明后使用,由函数的返回类型、函数名和形参列表组成

语法格式:类型标识符 函数名(形参列表);//注意函数原型是一个语句要以分号结束

形参列表是一组由逗号分隔的参数类型和参数名称组成,在函数声明的时候,参数名可以被省略,但是在函数定义的时候,通常形参必须命名才能使用,形参列表可以为空,但不能省略,在没有任何参数的时候可以用空参数表或关键字void。

函数的调用:除main()函数外,任一函数都不能单独的构成一个完整的程序,任一函数的调用都必须由main()函数直接或间接的去完成,可以使用函数名和一组逗号分隔开的实参来进行调用,调用的结果就是该函数返回值的类型,调用格式:函数名(实参列表)

 函数名中的参数是形参,main函数调用时,传递进来的是实参。函数参数的传递方式:值传递和应用方式传递

大多数下需要给main()函数传递实参,如:dos下 display 1.map命令 1.map就作为实参传递。当无法列举函数所有形参的类型和数目是使用省略号,编译器会暂停类型检测

类型标识符 函数名(...) 或 类型标识符 函数名(形参1,...)  可见只有调用函数时,形参才会被分配内存空间,调用结束后释放

作用域:函数和类之外定义的变量具有全局的作用域,称为全局变量。C++函数体一般包含在{}中即语句块,形参也是局部变量。变量的生命周期从定义时开始,到退出作用域是销毁。局部变量只能在局部作用域中使用,main()函数中的变量也是局部变量,只在主函数中有效,不能被其他函数使用。同样主函数也不可以使用其他函数的局部变量,在相同的作用域中,变量不可以同名。在不同的作用域中,可以使用相同的变量名,它们使用不同的内存。

函数的引入可以实现代码的共享、减少程序的代码量,但是需要时间和空间的开销.

内联函数:可以减少这方面的开销

函数模板:是指建立一个通用的函数,其函数原型和形参类型不具体指定,而用一个虚拟的类型代替。

语法:template <typename T>// T为虚拟的类型名

           template <class T>// template <class T1, typename T2>

写了这么多了,其实我也不想写,但是为了加深理解,而不只是会写代码,就硬着头皮写了,对知识的掌握会有好处的。下面让我们看个例子。

添加一个头文件testFunction.h 编写几个简单的函数

#include <iostream>

using namespace std;
/*pragma once*/
int lcm(int, int);// 声明计算最小公倍数的函数
int gcd(int, int);// 声明计算最大公约数的函数
int countSum(int a, int b);// 声明求和函数

int gcd (int m,int n) //计算最大公约数
{
 if (m > n) swap(m,n);
 while(n > 0)
 {
  int r = m % n;
  m = n;
  n = r;
 }
 return m;
}

int lcm (int m,int n)//计算最小公倍数
{
 return (m*n / gcd(m,n));
}

int countSum(int a, int b)
{
 return a + b;
}

测试文件Test.cpp:

#include <iostream>

using namespace std;

#include "testFunction.h"

inline int sum(int a, int b);// 声明内联函数
template <typename T>// 定义模板

T t_sum(T a, T b)// 返回T类型的函数
{
 return a + b;
}
int main(int argc, char* argv[])
{
 /*
 int m,n;
    cout << "请输入两个非负数: ";
    cin >> m >> n;
    cout << "gcd(" << m << "," << n << ") = " << gcd(m,n) <<endl;
    cout << "lcm(" << m << "," << n << ") = " << lcm(m,n) <<endl;
 cout << countSum(gcd(m, n), lcm(m, n))<<endl;
 */

 /*
 int a = 3, b = 2; 
 cout << "a = " << a << ", b = " << b <<endl;
 cout << "交换后: " << endl; 
 swap(a, b);// 形参的改变不会影响到实参的,如果此次自定义个交换函数是不起作用的
 cout << "a = " << a << ", b = " << b <<endl;
 */
 //cout << sum(2, 3) <<endl;// 内联函数
    int v1=10,v2=20;
 float v3=2.5,v4=4.6;
 cout<<"v1+v2="<<t_sum(v1,v2)<<endl; //调用模板函数,int型参数
 cout<<"v3+v4="<<t_sum(v3,v4)<<endl; //调用模板函数,float型参数
 
 return 0;
}

inline int sum(int a, int b)
{
 return a + b;
}

 案例:控制台输入随机数字作为数字大小,使用指针的方式赋值、并输出

#include <iostream>
#include <time.h>
using namespace std;
int main(int argc, char *argv[])
{
 long nCnt(0);
 cout<<"输入数值个数";
 cin>>nCnt;
 srand((unsigned)time(NULL));// 设置随机产生种子
 int *pnArray = new int[nCnt];
 if(pnArray == NULL) exit(1);
 memset((void *)pnArray, 0x00, sizeof(int)*nCnt);
 for(long loop(0); loop<nCnt; loop++)
 {
  pnArray[loop] = rand();// 系统自动生成随机数
  //cout<<*(pnArray+loop)<<endl;// 输出元素
  cout<<pnArray[loop]<<endl;// 输出元素
 }
 delete [] pnArray;
 pnArray = NULL;
 return 0;
}

案例:

#include <iostream>
#include <time.h>
using namespace std;
// 演示C风格数组的操作
int main(int argc, char *argv [])
{
 long *plArray = NULL;
 plArray = (long *)malloc(sizeof(long)*10);// 开辟动态数组空间
 srand((unsigned)time(NULL));// 设置产生随机随种子
 for(int nCnt(0); nCnt<10; nCnt++)
 {
  plArray[nCnt] = (long)rand();
  cout<<*(plArray + nCnt)<<endl;// 输出随机随元素
 }
 free(plArray);// 释放内存
 plArray = NULL;
 return 0;
}

 

如何系统的学习c++ 大家好,我是羽峰,一个c++刚入门的小白,本文整理了一些c++学习路线,当然自己也在路上,期待与您一起成长。如有需要,欢迎关注“羽峰码字”公众号,我们一起畅聊人生。 学习C++ 可以分为几个阶段 1. 入门 1.1C语言基础 首先是c语言基础 基础的语法:变量、条件、循环、字符串、数组函数、结构体等 C语言重点:指针、内存管理 推荐书籍:《C Primer Plus》、《C和指针》、《C专家编程》 当然这只是c++基础,理解就好,当然,指针和内存管理是很重要的,建议多理解,多看看... 阅读详情

相关推荐

c++实验使用类模板数组元素进行查找求和_Java互联网架构-性能调优必会吃透Java虚拟机类加载机制...

欢迎关注头条号:java小马哥周一至周日早九点半!下午三点半!精品技术文章准时送上!!!精品学习资料获取通道,参见文末类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班的开始,然而,解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开...

weixin_31563557的博客 440

编写函数数组中的元素求和

题目内容: 编写函数 add_array 对数组中的元素求和,函数原型为: void add_array(int a, int *sum);函数可以重复调用多次,每次只使用参数a传入数组中的一个元素,函数内部可以累计历次传入的值进行求和,每次执行后均把当前的和通过参数sum写入主函数中的某个变量中。 提示:使用静态变量。 输入格式: 一个最多100个元素的整型数组,以-1为结尾(表...

梧秋的博客 1万+

N数之和问题的解决

N数之和问题的解决 最近在刷leetcode时重刷了一遍两数之和、三数之和、四数之和以及最接近的三数之和4道题目,在思路明确之后这种题都不再是问题啦! 题目一:二数之和(#1) 题目要求就不说了,这是题目链接:二数之和 解释: 这道题要求返回数组中和为target的元素的位置,这里主要想解释双指针的思想,所以hash表的方法就不介绍了,题目中本身确定数组中不存在重复元素,这其实大大减小了难度,这里我们假设给定数组的元素是可以重复的同时要求返回所有不重复的满足要求的答案。 思路: 首先这种题目我们先对数组

StudyFruit的博客 783

C++数组求和两种方法

一个简单的程序(第一个函数中a是范围,不能超出b的有效索引)

sss_114514_bbb的博客 6991

C++入门经典-例9.1-函数模板函数模板的作用,使用数组作为模板参数

C++入门经典-例9.1-函数模板函数模板的作用,使用数组作为模板参数 1:函数模板不是一个实在的函数,因此编译器不能为其生成可执行的代码。定义函数模板只是一个对函数功能框架的描述,在具体执行时,将根据传递的实际参数决定其功能。 2:函数模板定义的一般形式如下: template <类型形式参数> 返回类型 函数名(形式参数表) { ...//函数实现 } ...

一串字符串 1246

C++成长记』模板

本位介绍了函数模板和类模板的使用方法和优点

小王又困了的博客 2465

C++信息学竞赛成长之路

信息学竞赛(OI)是培养计算思维和编程能力的绝佳途径。通过系统地学习算法和数据结构,不仅能提升解决问题的能力,还能为未来的学术和职业发展打下坚实基础。本文将按照年龄阶段,详细介绍C++信息学竞赛的学习路径、核心算法、比赛经验和实用模板

as_asdf的博客 1139

C++模板初阶

本文介绍了C++模板的基础知识,重点讲解函数模板和类模板的使用。函数模板通过泛型编程实现代码复用,可自动生成不同类型参数的函数版本;类模板允许定义通用的类结构,实例化时指定具体类型。文章分析了模板的原理、实例化方式及匹配规则,并指出模板在减少代码冗余、提高可维护性方面的优势。同时提醒类模板的定义和声明不宜分离,避免链接错误。模板C++泛型编程的核心技术,为后续学习STL等高级特性奠定基础。

suxi_na的博客 1817

C++模板初阶——函数模板和类模板

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。模板可分为类模板函数模板函数模板概念函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版。template叫做函数模板的参数列表 使用template关键字定义模板,具体的数据类型是什么由需要确定。模板仅仅对后面紧跟的那个函数起作用,当再定义新的函数后需要重新定义模板。注意typename是用来定义模板参数的关键字,也可以用class代替,但是不能……

不 良的博客 666

CppDeveloperRoadmap学习路径:如何制定个人C++成长计划的完整指南

CppDeveloperRoadmap是一个专为初学者和有经验开发者设计的C++学习路线图项目,它提供了清晰的学习路径和资源,帮助你系统地掌握C++编程技能。无论你是刚入门的新手,还是希望提升自己的专业开发者,这个项目都能为你提供全面的指导。 ## 为什么需要C++成长计划? C++是一门强大而复杂的编程语言,拥有广泛的应用领域和丰富的特性。制定一个合理的学习计划能够帮助你: - 避免学习

gitblog_00150的博客 1063

典型的 C++ 程序员成长经历

文章出处:http://blog.csdn.net/breakerzy/article/details/7399872 一个典型的 C++ 程序员成长经历: 1.  完整的学一遍 C++ 所有语言特性,典型书籍 "The C++ Programming Language" Part1, Part2, "C++ Primer"     感觉 C++ 像大杂烩(多编程范型),各种精妙

SandmanEric的专栏 837

C++学习困局如何破?Bjarne现场揭秘初学者成长三大关键阶段

破解C++学习困局,Bjarne亲授成长三大关键阶段。在2025全球C++及系统软件技术大会:Bjarne亲授:C++初学者能力培养路径中,深入解析语法理解、抽象思维到系统设计的进阶方法,覆盖编程实践与工程应用,助你高效掌握核心能力。值得收藏

AlgoPerch的博客 725

C++成长路线

随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者。而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移动互联网后端,经典Windows界面开发,移动互联网端界面开发,跨平台界面开发,图形分析,系统架构,应用设计,还有现在最为流行的分布架构等一些新的技术领域。  这么牛的语言,你是不是想知道怎样学习和掌握它呢?接下来请看经过小编整理过C/C++工程师必备知识...

weixin_48010114的博客 630

C++模板进阶

  越是简单而美好的东西,在落向现实的时候,越会变得面目全非。

hsy1603914691的博客 737

C语言/C++学习路线图(2021整理)

C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。 接下来是小编整理过C/C++工程师必备知识的思维导图。 初学者看到这么密集的知识点,是不是有点眼晕呢?的确,C/C++是一门知识面覆盖很广的学科。想学好C/C++的你并不需要慌张,内容虽多,但依然有法可依。只要有足够的耐心和毅力,加上正

weixin_55305220的博客 9149

C++C++模板进阶 —— 非类型模板参数、模板的特化以及模板的分离编译

今天我们学习了非类型模板参数、模板的特化以及模板的分离编译的相关知识,了解了一些有关的底层原理。接下来,我们将进行搜索二叉树的学习。希望我的文章和讲解能对大家的学习提供一些帮助。

Sherry的博客 244

C++C++——模板初阶与泛型编程

今天我们认识并具体学习模板与泛型编程。C++相比于C语言有这么多丰富的接口与类型,都源于泛型编程。本章的内容为模板初阶知识,为接下来的STL学习打下坚实的基础。接下来,我们将进行STL中string类的学习。希望我的文章和讲解能对大家的学习提供一些帮助。

Sherry的博客 965

C++标准模板(STL)详解

STL(Standard Template Library,标准模板)C++标准库的重要组成部分,它提供了一套高效、可复用的通用数据结构和算法框架。STL本质上是一个基于模板的泛型编程库,包含了丰富的数据结构(容器)、算法、迭代器和函数对象等组件。泛型编程:通过模板实现与数据类型无关的算法和数据结构高性能:经过精心优化,运行效率接近手工编写的代码标准化:作为C++标准的一部分,具有统一的接口规范可扩展性:用户可以方便地添加新的容器或算法。

Made In SQL 1122
上一篇: 我的C++成长之路(-) 学习阶段 -01
下一篇: 我的C++成长之路(-) 学习阶段 -03 指针与引用
茶叶
博客等级 码龄18年 7粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值