c ++是这个拷贝构造函数?

时间:2011-03-16 02:55:19

标签: c++

class A {};
class B { public: B (A a) {} };

A a;
B b=a;

我是从http://www.cplusplus.com/doc/tutorial/typecasting/读到的。它说这是一种隐式类型转换。从A班到B班。 我想问一下,这也是复制构造函数的一个例子吗? 感谢。

4 个答案:

答案 0 :(得分:4)

不,它不是复制构造函数。复制构造函数将一种类型的一个对象复制到另一个相同类型的对象中:

B::B(const B& b)
{
    // ...
}

作为旁注,如果你需要一个复制构造函数,那么你also need一个析构函数和一个赋值运算符,可能还有一个交换函数。

B::B(A)转换功能。它是一个构造函数,允许您将类型为A的对象转换为B类型的对象。

void f(const B& obj);

void g()
{
    A obja;
    B objb = obja;
    f(obja);
}

答案 1 :(得分:2)

不,复制构造函数的格式为

class A
{
public:
  A(const A& in) {...}
}

答案 2 :(得分:1)

不,从对象创建新变量时会调用复制构造函数。你有什么不同类型的两个对象。

答案 3 :(得分:0)

B b = a;表示使用了复制构造函数,就像您键入了B b = B(a);B b((B(a)));一样。也就是说,编译器将检查B是否具有可访问(公共)复制构造函数 - 无论是用户定义的还是编译器提供的默认构造函数。但是,这并不意味着必须实际调用复制构造函数,因为该语言允许编译器优化对构造函数的冗余调用。

通过向B添加用户定义的复制构造函数并使其无法访问,相同的代码应该产生编译器错误:

class A {};
class B { 
public: 
    B (A ) {}
private:
    B (const B&) {} // <- this is the copy constructor
};

A a;
B b=a;

例如,Comeau说:

"ComeauTest.c", line 10: error: "B::B(const B &)" (declared at line 6), required
          for copy that was eliminated, is inaccessible
  B b=a;
      ^