C++中怎么拷贝构造函数(格式及相关符号的意识分别是啥)并且拷贝函数的作用是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中怎么拷贝构造函数(格式及相关符号的意识分别是啥)并且拷贝函数的作用是啥相关的知识,希望对你有一定的参考价值。

    拷贝构造函数的格式:

    假设一个类的声明如下:

    class TestCL

    private:

    int para;

    public:

    TestCL()para = 0;

    TestCL(int paraIn)para = paraIn;

    TestCL(const TestCl& inputCL)[para = inputCL.para;

    ~TestCL()

    .......

上面的声明中,TestCL(const TestCl& inputCL)para = inputCL.para; 就是拷贝构造函数,格式一般如下: ClassName(const ClassName& in)...

2.相关符号的意思:

首先需要明白,拷贝构造函数是构造函数的一类,因此该函数的名字与类名是相同的(这一点与普通的构造函数相同,也就是上面例子中的“TestCL”);其次,拷贝构造函数的参数一般只有一个,就是这个类的一个对象的引用(上面例子中的“const TestCl& inputCL”);第三,拷贝构造函数的内容,就是把入参(这个类的一个对象的引用)的成员变量的值赋给当前需要构造的对象的成员变量(上面例子中的“para = inputCL.para”)——在这里需要注意深拷贝和浅拷贝的问题(上面的例子中的是浅拷贝)

3.拷贝函数的作用

就是通过已有的这个类的某个对象,来初始化,或者赋值给当前的这个对象;

参考技术A #include<iostream.h>
#include <iomanip>
using namespace std;

//定义一个时间类
class data

public:
data(int y,int m,int d)

year=day;month=m;day=d;

data(data & p);
void shuchu()

cout<<"The people's birthday is:"<<year<<"year"<<month<<"month"<<day<<"day"<<endl;

~data()



private:
int year,month,day;
;
//拷贝构造函数的实现
data::data(data & p)

year=p.year;month=p.month;day=p.day;

//建立一个人员类
class hires

public:
hires(long ma,int se,long hao,data b)//:b(y,m,d)

data birth(b);mark=ma;sex=se;number=hao;

hires(hires & p);
void shuchu();
~hires()



private:
int sex;
long mark,number;
//data birth(0,0,0);
;

hires::hires(hires & p)

sex=p.sex;mark=p.mark;number=p.number;

//拷贝构造函数的实现

void hires::shuchu()

cout<<mark<<ends;
if(sex==0)
cout<<"male"<<ends;
else
cout<<"female"<<ends;
cout<<number<<ends;


void main()

long ma,hao;
int y,m,d,se;
cin>>ma>>se>>y>>m>>d>>hao;
data b(y,m,d);
hires a(ma,se,hao,b);
a.shuchu();
b.shuchu();

C++入门拷贝构造函数详解

1、构造函数和析构函数

参考博客:《【C++入门】(拷贝)构造函数和析构函数》

2、深拷贝和浅拷贝

参考博客:《【C++入门】深拷贝和浅拷贝详解》

3、拷贝函数介绍

(1)拷贝构造函数是特殊的构造函数,其传参的格式是固定的,传入的都是const修饰的类引用;
(2)拷贝构造函数是在用同类型的对象进行初始化时调用的;
(3)拷贝函数需要考虑深拷贝和浅拷贝的问题。
(4)如果类中没有指针变量,则可以使用默认的拷贝构造函数(浅拷贝);
(5)如果类中有指针变量,则必须手动编写拷贝构造函数去进行拷贝;

4、示例代码

#include <iostream>

using namespace std;

class Person
public:
    int age;
    int gender;
    string *name;    //人的名字

    //构造函数
    Person();
    Person(string myname);
    Person(const Person &p);	//拷贝构造函数

     // 析构函数
    ~Person();

;

int main(void)

    //定义并初始化对象A
    Person A ("linux");
    A.age = 27;
    A.gender = 1;

	 //用A去初始化B
    Person B = A;

		//打印name的内存地址
    cout << "A.name=" << A.name  << endl <<"B.name=" << B.name << endl;

    cout << "*B.name=" << *B.name << endl;
    cout << "B.age=" << B.age << endl;
    cout << "B.gender=" << B.gender << endl;

    return 0;


//  默认构造函数
Person::Person()

    cout << "Person::Person()" << endl;
;

// 初始化name的构造函数
Person::Person(string myname)

    this->name = new string();
    *this->name=myname;
    cout << "Person::Person(string myname):name(myname)" << endl;
;

// 拷贝构造函数
Person::Person(const Person &p):age(p.age), gender(p.gender)

	 //对指针变量需要自己申请一块内存
    this->name = new string(*p.name);
    cout<< "copy constructor" << endl;
;

// 析构函数
Person::~Person()

    cout << "[~Person] delete this->name" << endl;
    delete (this->name);
;

5、代码执行结果分析

root@ubuntu:# ./app 
Person::Person(string myname):name(myname)
copy constructor
A.name=0x8442020
B.name=0x8442030
*B.name=linux
B.age=27
B.gender=1
[~Person] delete this->name
[~Person] delete this->name

(1)从执行顺序来看,拷贝构造函数是用A初始化B时被调用的;
(2)从A和B的name变量(内存地址)打印来看,两者地址不相同,说明拷贝构造函数的深拷贝是有效的;
(3)拷贝构造函数中,普通变量用浅拷贝,指针变量用深拷贝;

推荐

我会在C++专栏持续根据更新C++相关的知识点,这里也给大家推荐一款学习C++的神器,我也是在用这一款神器在学习C++。
链接:学习神器跳转
如果你是想入门C++这门语言或者是找C++岗位的工作,都推荐你试试这个网站,里面有针对C++知识点的选择题、编程题,更有C++岗位的面试题

以上是关于C++中怎么拷贝构造函数(格式及相关符号的意识分别是啥)并且拷贝函数的作用是啥的主要内容,如果未能解决你的问题,请参考以下文章

C++提高:继承

C++提高:继承

关于C++默认拷贝构造函数

C++类与对象第二篇:(构造函数析构函数拷贝构造运算符重载取地址及const取地址操作符重载)

C++入门拷贝构造函数详解

C++入门拷贝构造函数详解