看 Essential C++这本书
构造器这块实在很难理解,也可能是其他语言先入为主导致的...
书上说默认构造函数有两种形式,一种是无参,一种是给每一个参数提供默认值。
如果我这两种形式都定义了,这时候Triangular t1;
就会出现 ambiguous 的编译错误,是因为
Triangular(int len = 1, int bp = 1)
这个构造函数也被认为是无参构造?
但是我如果再定义一个Triangular(int len, int bp);
也不行,这时候Triangular(int len = 1, int bp = 1)
这个构造函数是被认为是两个参数的构造函数?
然后如果我的构造函数定义在 class 外,变成Triangular::Triangular(int len, int bp){}
和Triangular::Triangular(){}
,这也完全看不出这是两个冲突的 default constructor 了。。
这几个关系搞得有点乱,有大佬说说 C++这块的设计哲学吗。。。总感觉有点难记
class Triangular {
public:
Triangular();
// Triangular(int len);
Triangular(int len = 1, int bp = 1);
// Triangular(int len, int bp);
private:
int _length;
int _beg_pos;
int _next;
};
Triangular::Triangular(int len, int bp) {
_length = len > 0 ? len : 1;
_beg_pos = bp > 0 ? bp : 1;
_next = _beg_pos - 1;
}
Triangular::Triangular() {
_length = 1;
_beg_pos = 1;
_next = 0;
}
int main() {
// Triangular t1; // 无参构造
Triangular t2 = 5; // 一个参数的构造函数
Triangular t3(1); // 一个参数的构造函数
Triangular t4(1, 2); // 两个参数的构造函数
// Triangular t5(); // 为了兼容 C,这被认为是函数调用而不是无参构造
return 0;
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.