美文网首页
拷贝构造函数

拷贝构造函数

作者: 黑键_ | 来源:发表于2018-05-21 20:32 被阅读0次

拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的形参必须是引用,但并不限制为const,一般普遍的会加上const限制。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。

调用拷贝构造函数的情形:

在C++++++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):

一个对象作为函数参数,以值传递的方式传入函数体;

一个对象作为函数返回值,以值传递的方式从函数返回;

一个对象用于给另外一个对象进行初始化(常称为赋值初始化)。

如果在前两种情况不使用拷贝构造函数的时候,就会导致一个指针指向已经被删除的内存空间。对于第三种情况来说,初始化和赋值的不同含义是拷贝构造函数调用的原因。事实上,拷贝构造函数是由普通构造函数和赋值操作符共同实现的。描述拷贝构造函数和赋值运算符的异同的参考资料有很多。

通常的原则是:

①对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;

②在提供拷贝构造函数的同时,还应该考虑重载"="赋值操作符号。原因详见后文。

拷贝构造函数必须以引用的形式传递(参数为引用值)。其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。

(以上文字段来自百度百科拷贝构造函数)

另外需要提一下的是explicit:

C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。

#include <iostream>

using namespace std;

class A

{

public:

A(int a){ m_a = a; }

// explicit A(int a){ m_a = a; }  //explicit:使构造函数不能对单个数字进行强制转换

private:

int m_a;

};

int main()

{

A a(3);

A b = 6;  //相当于A b = A(6),将6强制转换

return 0;

}

注意:只有单个的数字才可以A b = 6; 这样。但是不建议这么使用。请按照上面的A a(3);方式使用。

示例:C++ 拷贝构造函数

#include <iostream>

using namespace std;

class Cpy

{

public:

Cpy(int nA = 0, double douB = 0.0);  //构造函数

Cpy(Cpy &p);                        //拷贝构造函数

private:

int m_nA;

double m_douB;

};

//构造函数

Cpy::Cpy(int nA, double douB)

{

m_nA = nA;

m_douB = douB;

cout<<"Tip : Cpy::Cpy(int nA, double douB) ..."<<endl;

}

//拷贝构造函数

Cpy::Cpy(Cpy &p)

{

m_nA = p.m_nA;

m_douB = p.m_douB;

cout<<"Tip : Cpy::Cpy(Cpy &p) ..."<<endl;

}

//外部函数,返回值为一个类对象.

Cpy fn()

{

cout<<"Tip : Cpy fn() ..."<<endl;

Cpy buf;

return buf;

}

int main()

{

Cpy a;      //调用构造函数

Cpy b(a);    //调用拷贝构造函数

Cpy c = a;  //调用拷贝构造函数

fn();        //return时,调用拷贝构造函数

return 0;

}

运行结果:

拷贝构造函数

相关文章

  • C++语言基础(02)

    1.可变参数 2.构造函数、析构函数、拷贝构造函数 构造函数 拷贝构造函数 //浅拷贝(值拷贝)问题 //深拷贝

  • C++面向对象高级编程(上)-第二周-博览网

    第二周 三大函数:拷贝构造,拷贝赋值,析构 字符串的构造函数,拷贝构造函数, 拷贝构造函数和拷贝赋值函数没有自主定...

  • (GeekBand)Second class

    一、Big Three:拷贝构造函数,拷贝赋值函数,析构函数 1.拷贝构造函数 文字定义:拷贝构造函数,又称复制构...

  • c++:拷贝构造函数&&深浅拷贝

    默认拷贝构造函数的汇编代码: 其实就相当于这一段代码 拷贝构造函数 多态拷贝构造函数 子类拷贝构造函数调用父类拷贝...

  • C++之构造进阶之拷贝构造

    拷贝构造函数的概述 拷贝构造函数的本质是构造函数。 调用拷贝构造的时机:旧对象给新对象初始化。 用户不提供拷贝构造...

  • 博览网--C++面向对象高级编程(上)-- C++学习第二周笔记

    一、拷贝构造, 拷贝赋值, 析构 Class 带指针 , 必须有拷贝构造和拷贝赋值函数 1) 拷贝构造函数: ...

  • C++boolan part1_week2

    Big Three三个特殊函数 (拷贝构造函数、拷贝赋值函数、析构函数) 1 拷贝构造函数 定义:如果一个构造函数...

  • c++11 拷贝控制

    拷贝控制操作包括,拷贝构造函数,拷贝赋值运算符,移动构造函数,移动赋值运算符,析构函数。拷贝和移动构造函数定义了用...

  • 20-拷贝构造函数

    拷贝构造函数(Copy Constructor) 拷贝构造函数,也是构造函数的一种。大家都知道,构造函数是在对象创...

  • C++ 构造函数,类的成员变量

    c++ 05 构造函数无参构造函数有参构造函数 拷贝构造函数 浅拷贝 深拷贝 类的成员变量 四类特殊的成员变量

网友评论

      本文标题:拷贝构造函数

      本文链接:https://www.haomeiwen.com/subject/czgqjftx.html