首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“正在初始化括号”。(C++)

“正在初始化括号”。(C++)
EN

Stack Overflow用户
提问于 2009-12-26 23:01:32
回答 5查看 3.5K关注 0票数 5

我现在正在学习C++,C++ Primer plus。但我只是想看看cplusplus网站,跳到文件处理上来。

我非常了解java,php,visual basic中的文件处理的基础知识。但我遇到了一条很奇怪的线。

代码语言:javascript
复制
ostream os(&fb);

fb表示一个filebuf。我只是不明白它的语法,但我能想出它和:

代码语言:javascript
复制
ostream os = &fb;

但是我从来没有读过这种初始化变量的方法。

所以我想知道。我是不是一直在失去一个真正有用的特性呢?这种初始化方式是不是已经过时了?是不是有什么不同?

提前谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-26 23:05:57

也许你应该读一下thisthis

票数 4
EN

Stack Overflow用户

发布于 2009-12-27 03:23:45

这两种形式都执行初始化。第一种语法(使用())称为直接初始化语法。第二种语法(使用=)称为复制初始化语法。在大多数现实生活中,它们的行为是相同的,但两者之间确实存在差异。

在左侧(LHS)和右侧(RHS)的类型相同的情况下(忽略任何const/volatile限定符),两者实际上是完全相同的。语言标准明确规定,在这种情况下,=表单等同于()表单。

但当类型不同时( LHS类型是类类型),这两种形式的工作方式通常不同。

  • 复制-初始化表单的工作方式如下:将rhs值转换为LHS类型的临时对象(通过任何可能的方法:标准转换、转换运算符、转换构造函数)。然后使用LHS类的复制构造函数将临时对象复制到LHS对象中。
  • 直接初始化表的工作方式如下:只需考虑LHS的所有构造函数,并使用重载解析选择最合适的一个。

您可以立即注意到,复制初始化语法无条件地使用复制构造函数(复制和中间临时函数可以被优化掉,但从概念上讲它们是存在的)。如果LHS类没有可访问的复制构造函数,则复制初始化无条件地变得病态,而直接初始化可能仍然有效。

此外,应用于某些构造函数的关键字explicit将影响哪种形式的初始化可用于哪种类型组合。

票数 6
EN

Stack Overflow用户

发布于 2009-12-26 23:15:27

一个小程序,用于查看何时调用复制构造函数以及何时调用重载的赋值运算符函数:

代码语言:javascript
复制
#include <iostream>

using namespace std;

class test
{
    public:
        // default constructor.
        test()
        {
            cout<<"Default Ctor called"<<endl;
        }

        // copy constructor.
        test(const test& other)
        {
            cout<<"Copy Ctor called"<<endl;
        }

        // overloaded assignment operator function.
        test& operator=(const test& other)
        {
            cout<<"Overload operator function called"<<endl;
            return *this;
        }
};

int main(void) 
{
    test obj1;  // default constructor called.

    test obj2 = obj1; // copy constructor called.

    test obj3(obj2); // again copy constructor called.

    obj1 = obj2; // overloaded assignment operator function.

    return 0;
}

输出:

代码语言:javascript
复制
Default Ctor called
Copy Ctor called
Copy Ctor called
Overload operator function called

因此,在您的示例中,在这两种情况下都会调用ostream的复制构造函数。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1963560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档