我所知道的使用初始化列表的好处是它们在初始化非内置的类成员时提供了效率.例如,
Fred::Fred() : x_(whatever) { }
比较好,
Fred::Fred() { x_ = whatever; }
如果x是自定义类的对象.除此之外,为了保持一致性,这种风格甚至与内置类型一起使用.
这样做的最常见好处是提高了性能.如果表达式与成员变量x_的类型相同,则任何表达式的结果都直接在x_中构造 - 编译器不会创建该对象的单独副本.
使用另一种样式,表达式可以创建单独的临时对象,并将此临时对象传递给x_对象的赋值运算符.然后该临时对象在;处被破坏.那效率很低.
问题
使用初始化列表,以下示例中是否存在任何效率增益.我认为没有收获.第一个版本调用字符串的复制构造函数,另一个调用字符串的赋值运算符(没有创建任何临时的).这是正确的吗?
class MyClass
{
public:
MyClass(string n):name(n) { }
private:
string name;
};
class MyClass
{
public:
MyClass(string n)
{
name=n;
}
private:
string name;
};
Run Code Online (Sandbox Code Playgroud) 我明白,当我们定义类的类复制构造函数时,必须作为三个状态的规则.我还注意到复制构造函数的参数通常const如下面的代码所示:
class ABC {
public:
int a;
int b;
ABC(const ABC &other)
{
a = other.a;
b = other.b;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如果复制构造函数的参数不是const会发生什么:
class ABC
{
public:
int a;
int b;
ABC(ABC &other)
{
a = other.a;
b = other.b;
}
}
Run Code Online (Sandbox Code Playgroud)
我理解在某些情况下,如果复制构造函数的参数是const,那么第二个实现将失败.此外,如果复制构造函数的参数是const,则要复制的对象在此过程中不会更改其内容.但是,我注意到有些人仍然使用第二个实现而不是第一个实现.是否有任何理由认为第二种实施方式是首选的?
请查看以下示例代码:
#include <iostream>
struct Foo {
Foo() { std::cout << "Default!\n"; }
Foo(const Foo& foo) { std::cout << "Copy!\n"; }
Foo(Foo&& foo) { std::cout << "Move!\n"; }
};
struct Bar {
Foo foo;
Bar() {}
Bar(Bar &that) : foo(that.foo) {}
Bar(Bar &&that) : foo(std::move(that.foo)) {}
};
Bar f() {
Bar bar;
return bar;
}
int main() {
Bar bar(f());
}
Run Code Online (Sandbox Code Playgroud)
我希望这段代码的输出应该是:
Default!
Move!
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
Default!
Copy!
Run Code Online (Sandbox Code Playgroud)
我看不出为什么调用复制构造函数而不是移动构造函数的原因.如果我把关键字const放在Bar &that复制构造函数的声明前面struct Bar,我就得到了正确的结果.我知道在很多情况下采用const左值引用而不仅仅是复制构造函数的左值引用更好,但我只是想知道发生这种情况的原因.
为什么在这个例子Bar &中被优先考虑,Bar …
我有一个类Graph,其复制构造函数在Graph.h中声明如下:
template<typename Object,typename Weight>
Graph<Object,Weight>::Graph(Graph<Object,Weight>& G)
Run Code Online (Sandbox Code Playgroud)
在其他地方,我尝试使用它:
Graph<double,double> G = make_graph("dense.g");
Run Code Online (Sandbox Code Playgroud)
...但是它给了我以下错误:
time_trialsALIST.cpp:37: error: no matching function for call to `Graph::Graph(Graph)' Graph.h:142: note: candidates are: Graph::Graph(Graph&) [with Object = double, Weight = double]
我不明白为什么会这样; make_graph函数只返回一个Graph:
Graph<double,double> make_graph(string filename){...}
Run Code Online (Sandbox Code Playgroud)
在某个地方我需要一个'&'吗?
#include<iostream>
using namespace std;
class Test
{
/* Class data members */
public:
Test(Test &t) { /* Copy data members from t*/}
Test() { /* Initialize data members */ }
};
Test fun()
{
cout << "fun() Called\n";
Test t;
return t;
}
int main()
{
Test t1;
Test t2 = fun();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的C++代码有什么问题?编译器抛出以下错误.
error: no matching function for call to ‘Test::Test(Test)’