【发布时间】:2019-02-25 02:59:59
【问题描述】:
我正在使用 C++ 为 String 创建自己的课程,仅用于学习目的。
我坚持我应该做出决定的地方。让我解释一下。
我的班级有两个选择。我将只在下面发布相关的代码片段,因为我不想分散您对手头问题的注意力。如果为了帮助我,您需要更多信息,我很乐意提供。
选项 1
class String {
size_t _length;
char* _stringHead;
public:
String(const std::string&);
String(const char*);
String(const char);
};
String operator+(String, const String);
const bool operator==(const String, const String);
const bool operator!=(const String, const String);
const bool operator<(const String, const String);
const bool operator<=(const String, const String);
const bool operator>(const String, const String);
const bool operator>=(const String, const String);
选项 2
class String {
size_t _length;
char* _stringHead;
public:
//irrelevant part of code in Option 2
String(const std::string&);
String(const char*);
String(const char);
//irrelevant part of code in Option 2
};
String operator+(String, const String&);
const bool operator==(const String&, const String&);
const bool operator!=(const String&, const String&);
const bool operator<(const String&, const String&);
const bool operator<=(const String&, const String&);
const bool operator>(const String&, const String&);
const bool operator>=(const String&, const String&);
//for std::string
String operator+(String, const std::string&);
const bool operator==(const String&, const std::string&);
const bool operator!=(const String&, const std::string&);
const bool operator<(const String&, const std::string&);
const bool operator<=(const String&, const std::string&);
const bool operator>(const String&, const std::string&);
const bool operator>=(const String&, const std::string&);
String operator+(const std::string&, String);
const bool operator==(const std::string&, const String&);
const bool operator!=(const std::string&, const String&);
const bool operator<(const std::string&, const String&);
const bool operator<=(const std::string&, const String&);
const bool operator>(const std::string&, const String&);
const bool operator>=(const std::string&, const String&);
//for std::string
//the same goes for char* and char
...
//the same goes for char* and char
所以,从 Option 1 和 Option 2 规范中可以看出,这里的决定是关于是否使用在构造函数的帮助下完成的隐式类型转换或者为我希望 String 类型使用的每种类型分别键入每个实用程序。
据我目前所见,使用第一种方法的好处是更容易实现和维护。而第二种方法可能会产生更好的性能结果。
我想获得建设性的论点,哪种方法更好,在什么情况下,你会使用哪种方法。我认为我在这里最感兴趣的部分是第二种方法的性能优势是否合理。
【问题讨论】:
-
由于这仅用于学习目的,因此双向进行并运行一些性能测试(计时)以查看哪个性能更好。
-
@hellohowdoyoudo,同意,您必须在循环中进行 1000 次迭代。有时我这样做只是为了满足自己的好奇心。如果差异可以忽略不计,我会坚持使用更简单的实现。
-
const bool operator==(const String, const String);创建任意长度的String参数的副本。比较见std::string::operator+:en.cppreference.com/w/cpp/string/basic_string/operator%2B -
请记住,任何采用单个参数的构造函数都可能被编译器捕获并用于将对象静默转换为另一种类型。当您尝试将错误类型的参数传递给函数时,通常会发生这种情况。隐式转换的存在会使发现错误变得相当困难。无论如何,这不是一个确定的论点,但它(在我看来)是一个强有力的论据,可以让你的所有“转换”构造函数
explicit。 -
@hellohowdoyoudo 我推荐Quick C++ Benchmark 进行微基准测试。它可以测量非常短的运行时间。例如,请参阅quick-bench.com/LXeHNjtCLFtB-Ld1A_tLK9J3cKo,其中 小字符串优化 的效果是针对单个对象的创建/销毁来衡量的。
标签: c++ class constructor header explicit