【c++ primer, 5e】参数传递
p187~p199:
【传值参数】
【传引用参数】
使用引用形参返回额外信息:传入一个(或者多个)额外的引用实参,令其保存字符出现的次数。
6.11
#include <iostream>
using namespace std;
void reset(int &i)
{
i = ;
}
int main()
{
int i = ;
reset(i);
cout << "i = " << i << endl; // output: i = 0
return ;
}
6.12
#include <iostream>
using namespace std;
void swap(int &p, int &q)
{
int temp;
temp = p;
p = q;
q = temp;
}
int main()
{
int a = , b = ;
cout << a << " " << b << endl;
swap(a , b);
// 交换之后
cout << a << " " << b << endl;
/* output:
4
3
*/
return ;
}
6.13
void f(T)中的T在调用函数的时候将拷贝实参的值,而voidd f(&T)中的T则是传入实参的临时别名。
6.14
感觉几乎都可以用引用类型,想到的一个是“删减字符串然后返回”,但是仍然可以在函数内部定义局部变量再进行操作。
6.15
因为不希望在函数里面改变string的值,因此s是常量引用(s设置为const可以提高可读性、更加安全,但是这应该不是必须的)。
s定义为引用类型可以避免拷贝,occurs定义为引用类型是为了返回“额外的信息”,定义成常量就无法统计值了。
至于c为什么不是引用类型。。。(更多原因见下文)
【const形参和实参】
续上节,补充尽量使用常量引用的原因:形参的初始化和变量的初始化是相同的,常量引用相比普通引用能够接收更多的类型。一个实例是f(string &s)无法传入字面值(非常量引用无非用字面值来初始化),如果传入将发生编译错误。正确的做法是:f(const string &s)。
6.16
见上文。
6.17
#include <iostream>
using namespace std;
// 函数1
bool has_bigc(const string &s)
{
for (char c : s) {
if (c >= 'A' || c <= 'Z') {
return true;
}
}
return false;
}
// 函数2
void to_Lower(string &s)
{
int L = 'A' - 'a';
for (char &c : s) {
if (c >= 'A' || c <= 'Z') {
c -= L;
}
}
}
int main()
{
cout << (has_bigc("Lovecpp") ? "Yes!" : "No!") << endl;
string s = "HeLlo WORLD";
to_Lower(s);
cout << s << endl;
return ;
}
6.18
bool compare(matrix&, matrix&);
vector<int>::iterator change_val(int , vector<int>::iterator);
6.19
不合法 合法 合法 合法
6.20
略。
【数组形参】
一维数组
含有数组形参的函数的声明方式:
void opera_array(const int*); // 推荐,更符合实际意义
void opera_array(const int[]);
void opera_array(const int[]);
以上三个函数是等价的。可以看出,函数参数实际接收的是指向数组首元素的指针(假设一个数组a,传入a等价于传入&a[0])。因为数组是以指针形式传递给函数,所以函数并不知道数组的确切尺寸。调用者因此应该提供额外的信息,主要有三种途径:
1、在数组尾部放标记。(例如c风格的字符串尾部的'\0')
2、传入指向数组首尾元素的指针。(借助标准库的begin(a);end(j);)
3、显式传入长度。(例如void f(int *a, int len);)
多维数组
多位数组实质上是“数组的数组”,数组的第二维(以及以后的维度)的大小都是数组类型的一部分,在声明的时候不可省略!正确使用的例子:
void f(int (*array)[]);
避免混乱的一个好办法就是:坚持一种直观的方式。
6.21
const int *p;
6.22
#include <iostream>
using namespace std;
void swap(int* &p, int* &q)
{
int* temp;
temp = p;
p = q;
q = temp;
}
int main()
{
int i = ;
int *p = &i;
int *q = nullptr;
swap(p, q);
cout << *q << endl;
return ;
}
6.23
略。
6.24
打印元素个数为10的int型数组元素,代码没问题。
【main:处理命令行选项】
简单的示例:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
for (size_t i = ; i != argc; ++i)
cout << argv[i] << endl; // c风格的字符串可以当成字面值来用。
return ;
}
$ a hello world i love you
a # 第一个元素是exe文件的名字
hello # 以下是传入的参数
world
i
love
you
6.25
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string hi = "";
for (size_t i = ; i != argc; ++i){
hi += argv[i];
hi += " ";
}
cout << hi << endl;
return ;
}
6.26
略。
【含有可变形参的函数】
initializer_list<T> 的特点:1、元素永远是常量 2、传入值要加花括号
6.27
#include <iostream>
#include <initializer_list>
using namespace std;
int sum(initializer_list<int> il)
{
int sum = ;
for (auto &x : il) {
sum += x;
}
return sum;
}
int main()
{
cout << sum({, , , , }) << endl; // output=15
return ;
}
6.28
string
6.29
看具体情况。
【c++ primer, 5e】参数传递的更多相关文章
- 【c++ primer, 5e】函数声明 & 分离式编译
p186~p188: 函数声明1.函数只能定义一次,但是可以声明多次. 2.函数的接口:返回类型 + 函数名 + 形参类型 3.为什么要在头文件中进行函数声明???在源文件中定义?暂时理解到,这么做可 ...
- 【c++ primer, 5e】【函数基础】
p182~p185: 函数1.在调用函数和执行return语句的同时,也发生了控制权的转移. 2.函数返回值不能是一个数组.(但是可以返回一个包含数组的对象,或者指向数组的指针) 3.重要概念:名字的 ...
- 【c++ primer, 5e】【try语句块】
p172~p177:c++的try语句块和异常处理: 1.通常,与用户交互的代码和对象相加(底层的代码)是分离开的,异常由与用户交互的代码处理(底层代码抛出异常就可以了). 2.C++的runtime ...
- 【c++ primer, 5e】构造函数 & 拷贝、赋值和析构
[构造函数] 1.构造器就是创建对象时被调用的代码. 2.如果没有自定义构造器,那么编译器将自动合成一个默认的无参构造器. 3.自定义的构造器不允许加const,所创建const的对象只有在构造器代码 ...
- 【c++ primer, 5e】定义类相关的非成员函数
练习 7.6 & 7.7 #include <iostream> #include <string> using namespace std; // Sales_dat ...
- 【c++ primer, 5e】设计Sales_data类 & 定义改进的Sales_data类
[设计Sales_data类] 1.考虑Sales_data类应该有那些接口. isbn.combine.add.read.print... 2.考虑如何使用这些接口. Sales_data tota ...
- 【c++ primer, 5e】函数指针
简单的示例: #include <iostream> using namespace std; int sum(int x, int y) { return x + y; } int ma ...
- 【c++ primer, 5e】函数匹配
练习 6.49 候选函数:与所调用的函数的名字相同的函数的集合. 可行函数:给候选函数加上参数数量.参数类型的约束所得到的函数的集合. 6.50 a 3.4可行,二义匹配 b 2.4可行,2是最佳匹配 ...
- 【c++ primer, 5e】特殊用途语言特性
[默认实参] 1.注意点:函数的默认实参可以在函数的声明中添加,但是后续声明只能添加默认参数而不能改变先前声明的默认参数.(函数的声明通常是定义在头文件上的,多次声明同一个函数是合法的) 2.默认实参 ...
随机推荐
- Android无线测试之—UiAutomator UiScrollable API介绍七
滑动到某个对象 一.滑动到某个对象相关API 返回值 API 描述 boolean scrollIntoView(UiSelector selector) 滑动到条件元素所在位置,并且尽量让其居于屏幕 ...
- C/C++编译过程
C/C++编译过程 C/C++编译过程主要分为4个过程 1) 编译预处理 2) 编译.优化阶段 3) 汇编过程 4) 链接程序 一.编译预处理 (1)宏定义指令,如#define Name Token ...
- Network Security Services If you want to add support for SSL, S/MIME, or other Internet security standards to your application, you can use Network Security Services (NSS) to implement all your securi
Network Security Services | MDN https://developer.mozilla.org/zh-CN/docs/NSS 网络安全服务 (NSS) 是一组旨在支持支持安 ...
- linux devcie lspci,lscpu,blkdiscard,fstrim,parted,partprobe,smartctl
blkdiscard/sparse/thin-provisioned device,like ssdfstrim--- discard unused blocks on a mounted files ...
- 算法大神之路——排序
从今天开始,给自己立下一个目标,每天晚上写一篇算法与数据结构的博客,用来给自己以后的算法工程师的目标铺路! 今天晚上就以算法里面的排序,作为自己的第一章节吧. 排序,就是讲一组数据,按照特定的规则去调 ...
- ntopng基础
当你在本地网络监控网络流量,根据流量大小.监控平台/接口.数据库类型等等,可以有许多不同的选择.ntopng是一套开源(遵循GPLv3协议)网络流量分析解决方案,提供基于web界面的实时网络流量监控. ...
- LeetCode_Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number. The ...
- 【opencv】projectPoints 三维点到二维点 重投影误差计算
今天计算rt计算误差——重投影误差 用solvepnp或sovlepnpRansac,输入3d点.2d点.相机内参.相机畸变,输出r.t之后 用projectPoints,输入3d点.相机内参.相机畸 ...
- 使用Custom Draw优雅的实现ListCtrl的重绘
common control 4.7版本介绍了一个新的特性叫做Custom Draw,这个名字显得模糊不清,让人有点摸不着头脑,而且MSDN里也只给出了一些如风的解释和例子,没有谁告诉你你想知道的,和 ...
- Linux上安装pip以及setuptools
毕竟丰富的第三方库是python的优势所在,为了更加方便的安装第三方库,使用pip命令,我们需要进行相应的安装. 1.安装pip前需要前置安装setuptools 命令如下: wget --no-ch ...