C++Primer第五版 6.2.2节练习

本文通过几个具体的编程练习,深入探讨了C++中引用的用法及其与指针的区别。包括如何使用引用重置变量值、交换两个整数的值,并讨论了函数参数选择引用类型的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

练习6.11:编写并验证你自己的reset函数,使其作用于引用类型的参数。

练习6.12:改写6.2.1节中练习6.10(第188页)的程序,使用引用而非指针交换两个整数的值。你觉得哪种方法更易于使用呢?为什么?
答:使用引用更容易

练习6.13:假设类型T是某种类型的名字,说明以下两个函数声明的区别:一个是void f(T),另一个是void f(&T)
答案:参见程序练习6.14就明白了,就是void f(&T) 引用的形参绑定了实参,一旦引用的形参发生变化,实参也会跟着变化。而void f(T),实参传过来,作用范围仅在函数内部,本身实参没有变化。

练习6.14:举一个形参应该是引用类型的例子,再举一个形参不能是引用类型的例子。
答:见程序练习6.14

练习6.15:说明find_char函数中的三个形参为什么是现在的类型,特别说明为什么S是常量引用而occurs是普通引用?为什么s和occurs是引用类型而c不是?如果令s是普通引用会发生什么情况?如果令occurs是常量引用会发生什么情况?
答:字符串s的长度固定,且s本身不允许被修改,所以s是常量引用,occurs变化,反映了c可能出现的次数,c是输入的参数,字符串里可能没有,occurs如果是常量引用,则不能被改动,因此就不能实现统计次数的功能。

练习6.11

/*
*练习6.11 
*2015/6/10
*问题描述:练习6.11:编写并验证你自己的reset函数,使其作用于引用类型的参数。 
*功能:重置一个数 
*作者:Nick Feng 
*邮箱:nickgreen23@163.com 
* 
*/


#include <iostream>

using namespace std;

void Reset(int &val)
{
    val = 0;
}

int main()
{
    int val = 0;
    cout << "please input a number! " << endl; 
    while (cin >> val)
    {   
        cout << "Before Reseting : The number is: " << val << endl;
        Reset(val);
        cout << "After Reseting: The number is: " << val << endl;

    }
    return 0;
} 

练习6.12

/*
*练习6.12
*2015/6/10
*问题描述:练习6.12:改写6.2.1节中练习6.10(第188页)的程序,使用引用而非指针交换两个整数的值。你觉得哪种方法更易于使用呢?为什么? 
*功能:交换 
*作者:Nick Feng 
*邮箱:nickgreen23@163.com 
* 
*/


#include <iostream>

using namespace std;

void swap(int &a, int &b)
{
    int temp = a;
    a = b;
    b = temp;
}

int main()
{
    int x(0),y(0);
    cout << "please input two numbers! " << endl;
    while (cin >> x >> y)
    {
        cout << "Before swapping , they are :"  << x << " " << y << endl;
        swap(x,y);
        cout << "After swapping , they are :"  << x << " " << y << endl;
    }
    return 0;
}

练习6.14

/*
*练习6.14 
*2015/6/10 
*问题描述:练习6.14:举一个形参应该是引用类型的例子,再举一个形参不能是引用类型的例子。。 
*功能:传值和传应用的比较
*说明:针对题目本身,例子并不好举,但可以比较传值和传引用的区别 
*作者:Nick Feng 
*邮箱:nickgreen23@163.com 
* 
*/


#include <iostream>

using namespace std;

void Reset1(int val)
{
    val = 0;
}

void Reset2(int &val)
{
    val = 0;
}

int main()
{
    cout << "input two number!" << endl;
    int a;
    cin >> a ;
    cout << "a is : " << a << endl; 
    Reset1(a);
    cout << "After calling Reset1() : " << a << endl; // a的值没有变 
    Reset2(a);
    cout << "After calling Reset2() : " << a << endl; // a也变成0 

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值