我现在正在学习C++,C++ Primer plus。但我只是想看看cplusplus网站,跳到文件处理上来。
我非常了解java,php,visual basic中的文件处理的基础知识。但我遇到了一条很奇怪的线。
ostream os(&fb);fb表示一个filebuf。我只是不明白它的语法,但我能想出它和:
ostream os = &fb;但是我从来没有读过这种初始化变量的方法。
所以我想知道。我是不是一直在失去一个真正有用的特性呢?这种初始化方式是不是已经过时了?是不是有什么不同?
提前谢谢。
发布于 2009-12-26 23:05:57
也许你应该读一下this和this
发布于 2009-12-27 03:23:45
这两种形式都执行初始化。第一种语法(使用())称为直接初始化语法。第二种语法(使用=)称为复制初始化语法。在大多数现实生活中,它们的行为是相同的,但两者之间确实存在差异。
在左侧(LHS)和右侧(RHS)的类型相同的情况下(忽略任何const/volatile限定符),两者实际上是完全相同的。语言标准明确规定,在这种情况下,=表单等同于()表单。
但当类型不同时( LHS类型是类类型),这两种形式的工作方式通常不同。
您可以立即注意到,复制初始化语法无条件地使用复制构造函数(复制和中间临时函数可以被优化掉,但从概念上讲它们是存在的)。如果LHS类没有可访问的复制构造函数,则复制初始化无条件地变得病态,而直接初始化可能仍然有效。
此外,应用于某些构造函数的关键字explicit将影响哪种形式的初始化可用于哪种类型组合。
发布于 2009-12-26 23:15:27
一个小程序,用于查看何时调用复制构造函数以及何时调用重载的赋值运算符函数:
#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;
}输出:
Default Ctor called
Copy Ctor called
Copy Ctor called
Overload operator function called因此,在您的示例中,在这两种情况下都会调用ostream的复制构造函数。
https://stackoverflow.com/questions/1963560
复制相似问题