C++ Primer 6.2参数传递 知识点+练习题

这篇具有很好参考价值的文章主要介绍了C++ Primer 6.2参数传递 知识点+练习题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++ Primer 6.2参数传递 知识点+练习题,c++,开发语言

指针形参

void reset(int *p)
{
	*p=0;//p指向的整型对象变为0
	 p=0;//只是对形参改变p,使其为空指针
}

int i=42;
reset(&i);//i变为0,但地址仍为i的地址

使用引用拷贝

bool isShorter(const string &s1,const string &s2)
{
	return s1.size()<s2.size();
}

以上需要传入string可能很大,不适合用值传递,拷贝耗空间
不需要修改,最好用const

Const 形参实参

底层const:指向的对象是一个常量,不允许用指针修改
顶层const:只允许指向一个对象
P57 有时间详细整理

const int ci=42;//顶层const ci是常量不可变
int i=ci;//正确,把const赋值给i !!!相当于i=42;
int * const p=&i;//顶层const p只允许指向i的地址
*p=0;//正确,可通过p改变
const int *const pt=&i;//既不可修改,也不可指向其他
const int *cp=&i;
int *p=cp;//错!!!p有修改i的风险

尽量使用常量引用

string::size_type find_char(string &s,char c,string ::size_type occurs)
{}
此函数若传入("hello world",'o',ctr)会发生错误
类型不匹配
若传入的是const string 类型的变量时也会报错

不用const限制传入实参范围

数组形参

传入数组首元素地址
void print(const int*);
void print(const int[]);
void print(const int[10]);
三者等价,无法传递个数,第三个10还是多少都无影响

管理大小三种方式
1.使用标记指定(c风格字符数组)
void print(const char *cp)
{
	while(cp)
	{
		cout<<*cp++;
	}
}
只对char数组带'\0'有效,其余无法有合理标记
2.使用标准库规范
void print(const int* beg,const int *end)
{
	while(beg!=end)
	{
		cout<*beg++<<endl;
	}
}
int j[2]={0,1};
print(begin(j),end(j));
用标准库begin,end提供指针 end是指向最后一个元素下一位
3.传入数组大小
void print(const int ia[],size_t size)
{
	for(size_t i=0;i!=size;i++)
		cout<<ia[i]<<endl;
}
int j[]={0,1};
print(j,end(j)-begin(j));//!!!计算长度方法

数组引用形参

f(int (&arr)[10]);形参是数组引用
f(int &arr[10]);形参是大小为10的数组,每一个元素是int类型的引用
个数必须对应,传入数组必须也是10个元素才可以

传递多维数组

记住,多维数组就是数组的数组
若为2维数组,传入数组首元素地址(这个数组首元素也是数组,第一行),再传入个数(多少行)

void printf(int (*matrix)[10],int rowsize);//要加括号,不加括号则变成指针的数组了
void printf(int matrix[][10],int rowsize)

向main函数传参数

int main(int argc,char *argv[]){}//指针数组,每个元素都是char类型的指针
int main(int argc,char **argv){}//等价,数组转为指针
在命令行里g++ mymain.cpp a b 
则argv[0]是程序名
argv[1]是a argv[2]是b

含有可变形参的函数

无法提前预知应该向函数传递几个实参
解决办法:1.initializer_list 标准库类型
2.可变参数模板P618
initializer_list:函数实参数量未知但全部实参类型相同,需添加同名头文件

操作 解释
initializer_list lst; 默认初始化类型为T的空列表
initializer_list lst{a,b,c…} 初始化lst列表,元素为const
lst2(lst),lst2=lst 拷贝,赋值 不会拷贝元素,是共享元素
lst.size() 列表中的元素数量
lst.begin() 返回首元素指针
lst.end() 返回尾元素下一位置指针

initializer_list 对象中的元素永远是常量值,无法改变

void erroe_msg(initializer_list<string> il)
{
		for(auto beg-il.begin();beg!=il.end();++beg)//!!!注意此时beg不是迭代器类型,是指针
				cout<<*beg<<" ";
		cout<<endl;
}

练习题

6.22 三个swap,分别什么都不变,变值,交换指针
#include<iostream>

using std::cout;
using std::endl;

void swap0(int *pt1,int *pt2);
void swap1(int *pt1,int *pt2);
void swap2(int *&r1,int *&r2);

int main()
{
    int a=100;
    int b=200;
    int *pa=&a;
    int *pb=&b;
    cout<<"swap0"<<endl;
    cout<<"before"<<endl;
    cout<<"pa="<<pa<<" pb="<<pb<<endl;
    cout<<"*pa="<<*pa<<" *pb="<<*pb<<endl;
    swap0(pa,pb);
    cout<<"after"<<endl;
    cout<<"pa="<<pa<<" pb="<<pb<<endl;
    cout<<"*pa="<<*pa<<" *pb="<<*pb<<endl;
cout<<endl;
    cout<<"swap1"<<endl;
    cout<<"before"<<endl;
    cout<<"pa="<<pa<<" pb="<<pb<<endl;
    cout<<"*pa="<<*pa<<" *pb="<<*pb<<endl;
    swap1(pa,pb);
    cout<<"after"<<endl;
    cout<<"pa="<<pa<<" pb="<<pb<<endl;
    cout<<"*pa="<<*pa<<" *pb="<<*pb<<endl;
    cout<<endl;
    cout<<"swap2"<<endl;
    cout<<"before"<<endl;
    cout<<"pa="<<pa<<" pb="<<pb<<endl;
    cout<<"*pa="<<*pa<<" *pb="<<*pb<<endl;
    swap2(pa,pb);
    cout<<"after"<<endl;
    cout<<"pa="<<pa<<" pb="<<pb<<endl;
    cout<<"*pa="<<*pa<<" *pb="<<*pb<<endl;
    return 0;
}

void swap0(int *pt1,int *pt2)
{
    int *tmp=pt1;
    pt1=pt2;
    pt2=tmp;
}

void swap1(int *pt1,int *pt2)
{
    int tmp=*pt1;
    *pt1=*pt2;
    *pt2=tmp;
}

void swap2(int *&r1,int *&r2)
{
    int *tmp=r1;
    r1=r2;
    r2=tmp;
}


待更新

1.const顶层底层
2.副本拷贝值内存
3.引用和指针文章来源地址https://www.toymoban.com/news/detail-782106.html

到了这里,关于C++ Primer 6.2参数传递 知识点+练习题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二分查找知识点及练习题

    一、没有相同元素查找 请在一个有序递增数组中(不存在相同元素),采用二分查找,找出值x的位置,如果x在数组中不存在,请输出-1!  输入格式  第一行,一个整数n,代表数组元素个数(n = 600000) 第二行,n个数,代表数组的n个递增元素(1=数组元素值=2000000)  第三

    2024年04月25日
    浏览(27)
  • 计算机组成原理期末考试知识点练习题

    全部内容包括1-8章,本篇是1-5章,后3章会在作者学习完新课后第一时间更新。(大概16号左右,请大家耐心等待) 目录 1. 计算机系统由     软件     、   硬件    两部分组成。 2. 计算机硬件系统由     存储器      、   运算器    、     控制器     、   输入设备

    2024年02月08日
    浏览(49)
  • 计算机组成原理期末考试知识点练习题(补发)

    按时来更新了  不过由于作者这边的考试推迟 第八章I/O没有学到,不能全更了 不过我会把相应的练习题上传,对于第八章,大家可以给班里同学商量着做。 若是下周能学到,会第一时间补上。 6.控制器 7.总线 6.控制器 一、填空 1. 控制器 是整台计算机的指挥系统,它指挥和

    2024年01月18日
    浏览(53)
  • 数据库系统概述——第一章 绪论(知识点复习+练习题)

    ✨ 博主: 命运之光 🦄 专栏: 离散数学考前复习(知识点+题) 🍓 专栏: 概率论期末速成(一套卷) 🐳 专栏: 数字电路考前复习 🦚 专栏: 数据库系统概述 ✨ 博主的其他文章: 点击进入博主的主页​​​​​ 前言: 身为大学生考前复习一定十分痛苦,你有没有过以

    2024年02月09日
    浏览(41)
  • 数据库系统概述——第六章 关系数据理论(知识点复习+练习题)

    🌟 博主: 命运之光 🦄 专栏: 离散数学考前复习(知识点+题) 🍓 专栏: 概率论期末速成(一套卷) 🐳 专栏: 数字电路考前复习 🦚 专栏: 数据库系统概述 ☀️ 博主的其他文章: 点击进入博主的主页​​​​​ 前言: 身为大学生考前复习一定十分痛苦,你有没有过

    2024年02月09日
    浏览(38)
  • 数据库系统概述——第三章 关系数据库标准语言SQL(知识点复习+练习题)

    🌟 博主: 命运之光 🦄 专栏: 离散数学考前复习(知识点+题) 🍓 专栏: 概率论期末速成(一套卷) 🐳 专栏: 数字电路考前复习 🦚 专栏: 数据库系统概述 ☀️ 博主的其他文章: 点击进入博主的主页​​​​​ 前言: 身为大学生考前复习一定十分痛苦,你有没有过

    2024年02月10日
    浏览(53)
  • 【知识点】nn.Conv2d参数设置

    reference   in_channels   这个很好理解,就是输入的四维张量[N, C, H, W]中的C了,即输入张量的channels数。这个形参是确定权重等可学习参数的shape所必需的。 out_channels   也很好理解,即期望的四维输出张量的channels数。 kernel_size   卷积核的大小,一般我们会使用5x5、3x3这

    2024年02月12日
    浏览(25)
  • C++碎知识点

    二叉树 由 n个节点构成的形态不同的⼆叉树 同余符号 定义设m是大于1的正整数,a,b是整数,如果m|(a-b),则称a与b关于模m同余,记作abmod(m),读作a同余于b模m。 符号= 按位与 后赋值 C语言中计算优先级 1LL 1LL会在运算时把后面的临时数据扩容成long long类型,再在赋值给左边时转

    2024年02月12日
    浏览(35)
  • C++知识点 -- 智能指针

    对于上面的场景,p1和p2在new申请空间后,div函数如果出现了除0错误,那么程序就会抛出异常,跳到接受异常的程序段继续执行,p1和p2申请的空间就没有被正常释放,造成了内存泄漏; 这种场景我们就可以使用智能指针来解决空间的释放问题。 RAII(Resource Acquisition Is Initia

    2024年02月03日
    浏览(55)
  • 波奇学C++:多态知识点

    结果是 student 0 原因在于重写时只重写函数的实现,就是说相当于Person的fun的声明和Student的函数实现的拼在一起所以缺省值是0。 如果是子类指针或者引用就不是多态调用了只是单存子类对父类的重定义,隐藏函数。 上一篇文章提到的,多态的本质就是基类和派生类的虚表中

    2024年02月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包