(C++)关于拷贝构造函数 Copy Constructor

题目:

In which of the following scenarios is a Copy Constructor called or invoked?

A.    When no conversion function exists for converting the class object to another class object

B.    When an existing object is assigned an object of its own class

C.    When a function receives as an argument, an object of the class, by value

D.    When a function returns an object of the class by value

E.    When creating an object and initializing it with an object of its own class

思路:

答案:CDE

拷贝构造函数在以下情况下被调用:

Class A{};

1、类对象以传值的形式作为函数参数,如 void func(A a);

2、函数返回值为类对象的值,如 A func();

3、创建某个类并初始化它,如 Class B; Class A(B);

扩展:

1、什么是拷贝构造函数?

对于一个类X,如果一个构造函数的第一个参数是下列之一:
a) X&
b) const X&
c) volatile X&
d) const volatile X&
且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构造函数. 

X::X(const X&);  //是拷贝构造函数   

X::X(X&, int=1); //是拷贝构造函数 

 2、一个类中可以存在多于一个的拷贝构造函数吗?

类中可以存在超过一个拷贝构造函数

class X {      

public:      

  X(const X&);      

  X(X&);            // OK   

};  

注意,如果一个类中只存在一个参数为X&的拷贝构造函数,那么就不能使用const X或volatile X的对象实行拷贝初始化.

class X {   

public:   

  X();   

  X(X&);   

};   

const X cx;   

X x = cx;    // error

如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数.
这个默认的参数可能为X::X(const X&)或X::X(X&),由编译器根据上下文决定选择哪一个.

默认拷贝构造函数的行为如下:
 默认的拷贝构造函数执行的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造.
 拷贝构造函数对类中每一个数据成员执行成员拷贝(memberwise Copy)的动作.
 a)如果数据成员为某一个类的实例,那么调用此类的拷贝构造函数.
 b)如果数据成员是一个数组,对数组的每一个执行按位拷贝. 
 c)如果数据成员是一个数量,如int,double,那么调用系统内建的赋值运算符对其进行赋值.

3、拷贝构造函数可以由成员函数模板生成吗?

拷贝构造函数不能由成员函数模版生成. 

struct X {   

    template<typename T>   

    X( const T& );    // NOT copy ctor, T can't be X   

  

    template<typename T>   

    operator=( const T& );  // NOT copy ass't, T can't be X   

};   

  

原因很简单, 成员函数模版并不改变语言的规则,而语言的规则说,如果程序需要一个拷贝构造函数而你没有声明它,那么编译器会为你自动生成一个. 所以成员函数模版并不会阻止编译器生成拷贝构造函数。

赋值运算符重载也遵循同样的规则.(参见Effective C++ 3edition, Item45)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值