【问题标题】:C++ variable declaration and initialization rulesC++ 变量声明和初始化规则
【发布时间】:2010-08-03 15:51:34
【问题描述】:

考虑以下声明和初始化C 类型变量的方法:

C c1;

C c2;
c2 = C();

C c3(C());

C c4 = C();

所有这些是否完全等价,或者其中一些是否可以根据C 的确切定义而有所不同? (假设它具有公共默认构造函数和复制构造函数)。

【问题讨论】:

    标签: c++ initialization declaration


    【解决方案1】:

    这些意味着:

    C c1;   // default constructor
    
    C c2;   // default constructor
    c2 = C(); // default constructor followed by assignment
    
    C c3(C());   // default constructor possibly followed by copy constructor
    
    C c4 = C();  // default constructor possibly followed by copy constructor
    

    注意编译器可以省略复制构造函数调用。它们是等价的吗? - 好吧,这取决于复制构造函数和赋值运算符的作用。

    【讨论】:

    • 请注意,即使省略了副本,也要检查要求,这一点很重要。也就是说,如果复制构造函数在此级别不可访问(私有/受保护),则即使从不调用复制构造函数,3 和 4 也将无法编译。
    • @David True,但在这种情况下,问题明确指出复制构造函数是公共的。
    • 所以如果复制构造函数是私有的,c3c4 不会编译,但 c2 仍然可以,对吧? (包括作业)。调用func(c2) 怎么样?使用私有复制构造函数也会编译失败吗?
    • 在 C3 的情况下,某些编译器(至少是 Visual Studio)无法区分 C c3(C()); 和函数声明。您可能需要添加额外的括号以避免编译器警告:C c3((C()));
    • @rom 是的,它会,就像返回一个 C 值一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2015-09-17
    相关资源
    最近更新 更多