C++入门拷贝构造函数详解
Posted 正在起飞的蜗牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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++入门拷贝构造函数详解的主要内容,如果未能解决你的问题,请参考以下文章