深入C++拷贝构造函数的总结详解

 更新时间:2013年05月16日 11:21:40   作者:  
本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下

拷贝构造函数是C++最基础的概念之一,大家自认为对拷贝构造函数了解么?请大家先回答一下三个问题:
1. 以下函数哪个是拷贝构造函数,为什么?
X::X(const X&);  
X::X(X);  
X::X(X&, int a=1);  
X::X(X&, int a=1, b=2); 
2. 一个类中可以存在多于一个的拷贝构造函数吗?
3. 写出以下程序段的输出结果, 并说明为什么? 如果你都能回答无误的话,那么你已经对拷贝构造函数有了相当的了解。
 
#include <iostream> 
#include <string>    
struct X {  
  template<typename T>  
  X( T& ) { std::cout << "This is ctor." << std::endl; }  

  template<typename T>  
    X& operator=( T& ) { std::cout << "This is ctor." << std::endl; }  
};  

void main() {  
  X a(5);  
  X b(10.5);  
  X c = a;  
  c = b;  


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

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  
};  

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

相关文章

  • C++ Vector用法深入剖析

    C++ Vector用法深入剖析

    C++ Vector应用方式是比较特殊的,我们将会在这篇文章中针对于它的应用方式进行一个详细的介绍,希望大家能充分掌握这一应用技巧
    2014-08-08
  • C语言实现经典小游戏井字棋的示例代码

    C语言实现经典小游戏井字棋的示例代码

    这个三子棋游戏是在学习C语言的过程中自己编写的一个小游戏,现在将自己的思路(主要以流程图形式和代码中的注释表达)和具体代码以及运行结果分享出来以供大家学习参考,希望对大家有所帮助
    2022-11-11
  • C语言memset函数详解

    C语言memset函数详解

    这篇文章主要介绍了C语言中的memset()函数,包括其与memcpy()函数的区别,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09
  • c语言之char*和unsigned char*的区别及说明

    c语言之char*和unsigned char*的区别及说明

    这篇文章主要介绍了c语言之char*和unsigned char*的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言实现成绩统计示例

    C语言实现成绩统计示例

    这篇文章主要介绍了C语言实现成绩统计示例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 利用C++实现从std::string类型到bool型的转换

    利用C++实现从std::string类型到bool型的转换

    利用C++实现从std::string类型到bool型的转换。需要的朋友可以过来参考下。希望对大家有所帮助
    2013-10-10
  • C语言简明讲解快速排序的应用

    C语言简明讲解快速排序的应用

    快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影
    2022-05-05
  • 用c语言实现HUP信号重启进程的方法

    用c语言实现HUP信号重启进程的方法

    本篇文章是对使用c语言实现HUP信号重启进程的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 基于Linux系统调用--getrlimit()与setrlimit()函数的方法

    基于Linux系统调用--getrlimit()与setrlimit()函数的方法

    本篇文章是对在Linux系统中调用getrlimit()与setrlimit()函数的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言实现简单的抽奖系统

    C语言实现简单的抽奖系统

    这篇文章主要为大家详细介绍了C语言实现简单的抽奖系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论