第19.3节呈现了一章,其主要重点是运算符重载的字符串表示,特别是特种作业[],->和().它实现了copy_from()如下的辅助功能:
void String::copy_from(const String &x)
// make *this a copy of x
{
if (x.sz <= short_max)
{
memcpy(this, &x, sizeof(x);
ptr = ch;
}
else
{
ptr = expand(x.ptr, x.sz+1);
sz = x.sz;
space = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
类接口如下所示:
#ifndef STRING_EXERCISE_H
#define STRING_EXERCISE_H
namespace simple_string
{
class String;
char *expand(const char *ptr, int n);
}
class String
{
public:
String(); // default constructor x{""}
explicit String(const char *p); // constructor from …Run Code Online (Sandbox Code Playgroud) 我是否应该期望用户提供足够大小的内存块,比如将文件复制到缓冲区?或者我应该自己分配内存,并希望用户在完成后释放它?例如,函数strdup()本身分配内存,但该函数fread()只需要一个足够大小的缓冲区.
我正在尝试使用工会,并使用匿名工会成员将此示例类设为A。由于联合包含一个std::string和一个,因此std::vector我需要为该类定义一个析构函数。但是,当我尝试手动调用~string()我得到
union.cpp: In destructor 'A::~A()':
union.cpp:14:14: error: expected class-name before '(' token
s_.~string();
Run Code Online (Sandbox Code Playgroud)
我不知道这个向量。如果我删除s._~string();对它的调用,则编译正常。这是编译器错误吗?我正在使用MinGW64。
#include <string>
#include <vector>
class A
{
public:
explicit A(const std::string &s) : s_ {s}, is_string {true} {}
explicit A(const std::vector<int> &v) : v_ {v}, is_string {false} {}
~A()
{
if (is_string)
s_.~string();
else
v_.~vector();
}
private:
union
{
std::string s_;
std::vector<int> v_;
};
bool is_string;
};
int main()
{
A a("Hello, World!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用std::delete_at(std::addressof(s_)) …
我有一个接受a std::istream &并在分配一个成员(a std::istream &)之前检查它的构造函数。例如:
class Stream
{
public:
Stream(std::istream &is) : s_ {is.good() ? is : throw std::runtime_error {"Invalid input stream\n"}}
{}
private:
std::istream &s_;
};
Run Code Online (Sandbox Code Playgroud)
编译器抱怨的构造函数std::basic_istream(const basic_istream &)被删除(可以理解,因为您不能复制流)。但是,我看不到在这里进行任何复制吗?它必须在三元运算符中,因为
Stream(std::istream &is) : s {is} {}
Run Code Online (Sandbox Code Playgroud)
没有检查就可以了。std::istream尝试复制到哪里?我该如何解决呢?
考虑例如:
#include <array>
#include <iostream>
int main()
{
using Ram_bank = std::array<char, 0x2000>;
std::cout << "Size of ram bank is: " << Ram_bank::size() << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
显然,这不是有效的代码,Ram_bank不是实际的类型或对象,而是别名。但是,有什么方法可以实现这一目标吗?有没有一种方法来获取别名类型的大小?
阅读C++编程语言第4版,有一个类似的定义
class Vector
{
private:
int sz;
double *a;
public:
Vector(int s) :elem{new double[s]}, sz{s} {}
}
Run Code Online (Sandbox Code Playgroud)
我对这个构造函数语法的工作原理有点困惑.我相信Vector(int s)正在创建一个构造函数,它接受一个参数s,并初始化elem和sz.但为什么会有:?我以为功能体被包围了{}?那么最后的空括号{}是什么?