跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 关于 C++ default constructor 的疑问
未分類
21 2 月 2021

关于 C++ default constructor 的疑问

关于 C++ default constructor 的疑问

資深大佬 : zxCoder 2

看 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; } 

大佬有話說 (9)

  • 資深大佬 : hello2060

    已经忘了 c++了,随便猜猜

    第一种情况,一个无参数,一个默认参数,冲突是正常的啊。

    第二种情况,一个无参数,一个两个参数,第二个不是默认构造函数,也很正常啊

  • 資深大佬 : hello2060

    手机上看贴的,似乎你说的是第二种情况还是有默认参数?

  • 資深大佬 : anonymous256

    “是因为 Triangular(int len = 1, int bp = 1)这个构造函数也被认为是无参构造?” 是啊
    你没提供参数,编译器不知道选择哪个构造函数了。 你需要移除一个构造函数

  • 資深大佬 : hello2060

    你的 code 里这种写法和第一种是一样的吧,默认参数只要在声明里指定,定义里不用吧

  • 資深大佬 : ipwx

    … 为什么要用这种有歧义的语法。。。

    你难道会定义两个函数,一个 int f(); 一个 int f(int a=1, int b=2); 嘛?

  • 資深大佬 : wutiantong

    1. 你定义函数时指定了一些参数
    2. 你为函数参数配置了一些默认值
    3. 你写一句调用函数的表达式时,编译器尝试通过各种上下文信息来找到正确的被调用函数(静态重载)

    以上是三件独立的事情,不要混淆在一起理解。

  • 資深大佬 : yulon

    如果没有冲突的话,你觉得你要怎么调用,才能利用到 len = 1 这个默认值?

  • 資深大佬 : GeruzoniAnsasu

    首先像 #6 说的先把默认构造 / 构造函数带有默认参数 / 编译器选择重载这三者区分开来

    Class() 无参默认构造
    Class(type param=1) 带有一个参数的构造函数,且这个函数有默认值

    定义的时候,这是两个不同的构造函数,这应该不难理解

    然后如果一个类同时存在这两个构造函数,当你写下 Class obj 时,编译器会寻找可以满足对象定义语义的构造函数,于是这两个函数都能被找到,于是会产生 ambiguous 。当你写 Class obj(1) 的时候,无参构造不能满足语义,只有第二个构造可以满足,因此无歧义

  • 資深大佬 : dangyuluo

    看编译器报错,找 candidate 关键词

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具