C++链表与字符串类相关编程问题解析

106、请说出调用拷贝构造函数的三种情况。

  1. 初始化新对象时,如使用替代语法 bag y = x; bag y(x);
  2. 函数返回值为对象时,将局部变量的值复制到返回位置;
  3. 当值参数为对象时,将实际参数复制到形式参数。

107、编写一段 C++ 代码,声明一个常规的 C++ 以空字符结尾的字符串,该字符串最多可容纳 20 个字符,将用户输入读取到该字符串中,在字符串末尾追加一个感叹号,并打印结果。

#include <iostream>
int main() {
    char str[20];
    std::cin >> str;
    int i = 0;
    while (str[i] != '\0') {
        i++;
    }
    if (i < 19) {
        str[i] = '!';
        str[i + 1] = '\0';
    }
    std::cout << str << std::endl;
    return 0;
}

108、为什么字符串类需要析构函数?

因为字符串类使用了动态内存,析构函数的主要目的是在对象不再使用时将对象的动态内存返回给堆。

109、编写一个支票簿对账程序。该程序将读取自上次核对支票簿以来所有未兑现支票的以下信息:每张支票的编号、支票金额。程序还需读取所有存款、旧账户余额和新账户余额。实现程序,使其完成对支票簿的对账功能。

程序需使用动态数组存储“支票”,每个支票是自定义的数据类型对象。可用第二个动态数组存储存款列表。新账户余额应等于旧余额加上所有存款,减去所有已兑现的支票。

程序要打印以下信息:

  • 已兑现支票总额
  • 存款总额
  • 新余额应有的数值
  • 该数值与银行所说的新账户余额的差值

此外,还需打印两份支票列表:

  1. 自上次核对支票簿以来已兑现的支票
  2. 仍未兑现的支票

110、编写链表中节点所需的类定义,使用名称 value_type 表示数据类型。

class node {
public:
    typedef double value_type;
    value_type data_field;
    node *link_field;
};

111、C++常量NULL的含义是什么?在程序中使用NULL需要添加什么额外代码?

`NULL` 表示空指针,是一个特殊的 C++ 常量,可用于任何没有指向位置的指针值。要在程序中使用 `NULL`,需要包含标准库工具 `<cstdlib>`,且 `NULL` 不属于 `std` 命名空间,可直接写 `NULL`。

112、描述空指针的两种常见用途。

  • 用于链表最后一个节点的链接字段;
  • 当链表还没有任何节点时,用于头指针和尾指针的值,表示空链表。

113、如果value_type是内置数字或布尔类型之一,其默认构造函数会给出什么值?

对于数字类型返回零,对于布尔类型返回false。

114、假设 head_ptr 指向一个非空链表的第一个节点。编写代码,若第一个节点中的数据为 0,则打印单词 “zero”。

可使用如下代码:

if (head_ptr->data() == 0) {
    cout << "zero";
}

115、考虑语句:cout << (*head_ptr).data( );。如果省略head_ptr周围的括号会发生什么?请写出调用data( )类成员的替代语法。

如果省略括号,表达式 *head_ptr.data() 会导致语法错误,因为访问成员(如 data 成员函数)的操作比解引用星号的优先级高,会尝试在解引用之前调用 head_ptr.data() 。替代语法是使用成员选择运算符 -> ,即 head_ptr->data()

116、假设b_ptr是一个指向对象的指针,该对象有一个成员函数size,它返回对象中元素的数量。请使用成员选择运算符编写一条语句,用于打印b_ptr所指向的对象中元素的数量。

std::cout << b_ptr->size() << std::endl;

117、描述如果对空指针进行解引用可能会出现的问题。

对空指针进行解引用不会导致语法错误,但在程序运行时,会尝试将空指针解释为有效地址。

有时会立即引发运行时错误,显示如以下消息:

  • “地址保护违规”
  • “总线错误,核心转储”

在其他机器上,空地址可能被视为有效地址,导致程序读写意外的内存位置:

  • 该位置可能是操作系统的一部分
  • 从而损坏操作系统
  • 在程序完成后的某个时刻可能引发错误

118、为什么这个 link 实现是错误的?node* link( ) const { return link_field; }

该实现将 link 定义为常量成员函数,但返回了一个非常量的 node* 指针。常量成员函数应保证不修改对象状态,而返回非常量指针可能被用于修改链表,违背了常量成员函数的初衷。此外,当通过常量对象调用此函数时,会得到一个可修改链表的指针,这不符合常量对象不能被修改的规则。

119、假设你想使用一个链表,其中的元素是标准库字符串类中的字符串。你需要如何修改 node1.h 头文件?

必须在工具包头文件的其他包含指令中添加 #include <string> 指令。然后将 typedef 语句修改为:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值