(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)

时间: 2024-08-26 23:07:12

(C++)关于拷贝构造函数 Copy Constructor的相关文章

C++类的拷贝构造(Copy constructor)函数隐藏陷阱

好长时间没写C++了,今天写了个很简单的String类,竟然调试了半天,最终发现了一个十分隐蔽的陷阱,写出来供大家分享. C++中类的拷贝构造函数的作用就是通过类的一个对象来实例化另一个对象.下面是我写的一个MyString类,头文件MyString.h: #include <iostream> using namespace std; class MyString { public: MyString(); MyString(const MyString& str);//这里就是我们

Copy constructor拷贝构造函数

翻译的是wikipedia关于copy constructor,地址:点击打开链接 拷贝构造函数是C++语言中用一个已有对象创建一个新对象的特殊构造函数,该函数的第一个参数必须是函数所在类型的引用(译注:const/non-const都可以,可以有多个参数剩余参数必须有默认值,一定要是引用,这些原因见后,问:有多个参数拷贝构造如何调用?). 通常编译器会自动为每一个class创建一个拷贝构造函数(显示拷贝构造);有些情况下程序员自定义了拷贝构造函数(用户自定义拷贝构造),这时编译器不合成拷贝构造

C++ Copy Constructor in depth (深入理解C++拷贝构造函数)

The copy constructor is a special kind of constructor which creates a new object which is a copy of an existing one, and does it efficiently. (拷贝构造函数是一种特别的构造函数,用于复制已经存在的对象到新生成的对象,这是一种高效的方式.) Here below is a simple declaration of a copy constructor: (

const成员-拷贝构造函数(copy constructor)

const成员 const成员:被const修饰的成员变量.非静态成员函数 必须类里面初始化 class Car { public: const int m_price = 0; //const常量设置 Car() :m_price(0) {} //也可以在构造函数中初始化 void run() const { //const一般写最后 cout << "run()" << endl; m_price = 10; } }; const成员函数 两个同名函数构成了

关于 C++ 拷贝构造函数(copy constructor)中的形参必须为引用类型的详解

在<C++ primer>中文第四版中,关于拷贝构造函数(也称复制构造函数)是这样定义的:是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用. 问题来了!为什么形参必须为该类类型的引用?而不能是值传递方式?(PS:其实传值和传址都可以统一为传值,前者传的是对象的值,后者传的是对象的地址的值) 先看下边两组代码: 1. 1 class Example { 2 3 public: 4 5 Example() {} 6 7 Example(const Example&a

15.含有指针成员的类的拷贝(copy constructor)

http://zhedahht.blog.163.com/blog/static/25411174200722710364233/ http://www.cnblogs.com/t427/archive/2012/08/10/2633133.html http://blog.csdn.net/gamecreating/article/details/5382902 http://www.cppblog.com/xczhang/archive/2008/01/21/41569.html 题目:下面

构造函数语义学&mdash;&mdash;Copy Constructor的建构操作

?在三种情况下,会以一个object的内容作为另一个class object的初值: object明确初始化 123 class {...};X x;X xx = x; object被当作参数交与某个函数 12345 extern void foo(X x);void bar(){ X xx; foo(xx);} 函数返回值是一个class object 12345 X foo_bar(){ X xx; ... return xx;} 如果开发者已经明确定义了一个copy constructor

【C/C++学院】(6)构造函数/析构函数/拷贝构造函数/深copy浅copy

1.构造函数 类的初始化即为构造函数.也为:隐式的初始化. 构造函数在对象初始化的时候,自动被调用.隐式的调用. 构造函数分为三种:有参构造函数.无参构造函数.拷贝构造函数. 有参构造函数调用有三种:括号法.等号法.手工法. #include <iostream> using namespace std; class Test { private: int m_a; public: Test()//无参构造函数 { } Test(const Test &obj)//拷贝构造函数 { }

拷贝构造函数[c++]

拷贝构造函数何时会被调用? 1. 对象以值传递的方式传入函数参数 2.对象以值传递的方式从函数返回 3.对象需要通过另外一个对象进行初始化 下面我们来看代码: //#include <iostream> //using namespace std; //template <typename T, int MAX> //T:队列的类型,char,int,double,包括自己的struct .MAX:循环队列的最大长度 //class Queue //{ //private: //