要求定义一个书Book类,包含私有数据成员书名、序号、书的总数,公有的构造函数,拷贝构造函数和输出函数等。 要求序号是从1开始顺序自动生成的;拷贝构造函数,是用另一个对象的书名连上_新生成对象的序号构成。 请根据main函数和运行结果定义Book类。 备注:to_string(i)将整数i转换为字符串。 函数接口定义: int main() 裁判测试程序样例:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
/* 请在这里填写答案 */
int main()
{
string bname;
cin>>bname;
Book b1(bname),b2(b1),b3(b2);
b1.print();
b2.print();
b3.print();
cout<<"共有"<<Book::get_bsum() <<"本书." <<endl;
return 0;
}
answer:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Book
{
private:
string title;
int id;
static int totalBooks;
public:
Book(string t) : title(t)
{
id = ++totalBooks;
}
Book(const Book &other)
{
stringstream ss;
ss << other.title << "_" << totalBooks;
ss >> title;
id = ++totalBooks;
}
void print()
{
cout << "No " << id << ",book name is " << title << endl;
}
static int get_bsum()
{
return totalBooks;
}
};
int Book::totalBooks = 0;
int main()
{
string bname;
cin >> bname;
Book b1(bname), b2(b1), b3(b2);
b1.print();
b2.print();
b3.print();
cout << "共有" << Book::get_bsum() << "本书." << endl;
return 0;
}
在这个代码中,根据输入创建了三本书,并通过拷贝构造函数确保每本书名字后面都带有相应的序号。最后输出了每本书的信息以及总书数量。
Book(const Book &other)
{ stringstream ss;
ss << other.title << "_" << totalBooks; ss >> title;
id = ++totalBooks; }
详细解释每一步
在这个拷贝构造函数中,我们首先创建了一个 stringstream 对象 ss,用于处理字符串流。然后,我们将另一个 Book 对象的书名(other.title)和当前书的总数(totalBooks)连接在一起,并将结果存入 stringstream 对象 ss 中。接着,我们从 stringstream 对象 ss 中读取拼接后的字符串,赋值给当前对象的书名(title)。最后,我们将当前书的序号设置为递增的总书数(++totalBooks)。
具体步骤如下:
- 创建一个 stringstream 对象 ss。
- 将另一个 Book 对象的书名和当前书的总数连接在一起,得到类似 "C++程序设计_2" 的字符串,存入 stringstream 对象 ss 中。
- 从 stringstream 对象 ss 中读取拼接后的字符串,赋值给当前对象的书名 title。
- 设置当前书的序号为递增的总书数 totalBooks。
通过这个拷贝构造函数,确保了每次拷贝构造都能按照要求将另一个对象的书名连上新生成对象的序号构成,从而实现了题目要求的逻辑。
stringstream 对象是什么
stringstream 是 C++ 标准库中的一个类,它允许字符串流和数据类型之间的转换。stringstream 类可以将字符串和各种数据类型(如整数、浮点数等)相互转换,方便地进行输入和输出操作。
在 C++ 中,stringstream 类通常用于以下场景:
- 将各种数据类型转换为字符串:通过向 stringstream 对象插入不同类型的数据,可以将它们转换为字符串。
- 将字符串转换为各种数据类型:通过从 stringstream 对象提取数据,可以将字符串解析为不同类型的数据。
stringstream 类中包含了像 << 和 >> 这样的运算符重载,使得我们可以像使用标准输入输出流一样使用 stringstream 对象。通过这些运算符重载,我们可以实现数据类型和字符串之间的相互转换,非常方便实用。
在前面的例子中,我们利用 stringstream 对象 ss 将另一个 Book 对象的书名与当前书的总数连接在一起,并最终将拼接后的字符串赋值给当前对象的书名。这样就利用了 stringstream 的特性来处理字符串流的操作。
Book(const Book &other)这个是什么意思
在 C++ 中,Book(const Book &other)
是一个拷贝构造函数的声明。拷贝构造函数是一种特殊的成员函数,用于创建一个新对象并将其初始化为另一个同类对象的副本。
具体来说,Book(const Book &other)
中的参数 const Book &other
表示接受一个常引用(const reference)作为参数,这个参数通常是指向同类对象的引用,用于初始化新对象。在拷贝构造函数中,我们可以通过传入另一个对象的引用来创建一个新对象,并将其属性初始化为相应对象的副本。
在之前提供的例子中,拷贝构造函数 Book(const Book &other)
用于创建一个新的 Book 对象,这个新对象会复制另一个 Book 对象的书名,并在书名后面加上当前书的总数作为序号。这样可以确保每次拷贝构造都能按照要求将另一个对象的书名连上新生成对象的序号构成。
const 和static什么区别
const
和 static
都是 C++ 中的关键字,它们有不同的作用和用途。
-
const:
const
用于声明一个常量,表示其数值在程序运行过程中不能被修改。一旦一个变量被声明为const
,其数值就不可改变。- 在函数参数列表中,
const
修饰的参数表示该参数是只读的,函数内部不能修改这个参数的值。 - 在类中,
const
可以用于声明常量成员变量,表示该成员变量在对象创建后不能被修改。
-
static:
- 在全局变量中,
static
关键字可以限制变量的作用域,使其只在当前文件内可见,不会被其他文件访问到。 - 在局部变量中,
static
关键字可以使变量在程序的整个生命周期内保持其数值,而不像普通局部变量那样在函数调用结束后被销毁。 - 在类中,
static
成员变量与类相关,而不是与对象相关,所有对象共享同一个static
成员变量的副本。static
成员函数是独立于任何对象的,它不具有 this 指针,因此不能访问非静态成员变量。
- 在全局变量中,
总的来说,const
用于定义常量,而 static
则用于指定变量、函数或成员的作用范围和生命周期。这两个关键字在 C++ 中有着不同的作用,但它们都是非常重要的,并且经常被用于代码的设计和实现中。