c++ 拷贝构造函数

何时需要拷贝函数?

下面我们看一段代码?

c++ 复制代码
#include <iostream>

using namespace std;

class Line
{
  public:
    string m_name;
    int m_age;
    Line();
    ~Line(); // 析构函数
    
    void show();
};
Line:: Line()
{
  cout << "无参构造被调用" << endl;
}
Line:: ~Line()
{
  cout << "析构函数~Line()被调用" << endl;
}
void Line:: show()
{
  cout << "姓名:" << m_name << ",年龄: " << m_age << endl;
}
int main()
{
  Line line1("张三", 18);
  Line line2 = line1;
  
  return 0;
}

这时候编译,会提示你 已经告诉你答案了。

拷贝构造函数的规则

拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。

  • 用一个已存在的对象创建新的对象,不会调用(普通)构造函数,而是调用拷贝构造函数。

  • 如果类中没有定义拷贝构造函数,编译器将提供一个拷贝构造函数,它的功能是把已存在对象的成员变量赋值给新的对象的成员变量。

  • 用一个已存在的对象创建新的对象语法:

    • 类名 新对象名(已存在的对象名)

    Line line1("张三", 18);

    Line line2(line1);

    • 类名 新对象名 = 已存在的对象名。

    Line line1("张三", 18);

    Line line2 = line1;

拷贝构造函数的写法

c++ 复制代码
classname (const classname &obj) 
{ 
    // 构造函数的主体 
}

接下来把上面的例子补齐

c++ 复制代码
#include <iostream>

using namespace std;

class Line
{
  public:
    string m_name;
    int m_age;
    Line();
    Line(string name, int age);  // 构造函数
    Line(const Line &obj);
    Line(const Line &obj, int n);
    ~Line(); // 析构函数
    
    void show();
};
Line:: Line()
{
  cout << "无参构造被调用" << endl;
}
Line:: Line(string name, int age)
{
  m_name = name;
  m_age = age;
  cout << "构造函数Line(string name1, int age)被调用" << endl;
}
Line:: Line(const Line &obj)
{
  cout << "拷贝构造函数被调用" << endl;
  cout << "拷贝构造 - 姓名:" << obj.m_name << ",拷贝构造 - 年龄: " << obj.m_age << endl;
  m_name = obj.m_name;
  m_age = obj.m_age;
}
Line:: ~Line()
{
  cout << "析构函数~Line()被调用" << endl;
}

// 实现成员函数
void Line:: show()
{
  cout << "姓名:" << m_name << ",年龄: " << m_age << endl;
}
int main()
{
  Line line1("张三", 18);

  Line line2 = line1;
  line2.show();

  return 0;
}

执行结果如下:

相关推荐
Felix_XXXXL39 分钟前
IDEA + Spring Boot 的三种热加载方案
java·后端
程序员爱钓鱼39 分钟前
Python编程实战:面向对象与进阶语法——上下文管理器(with语句)
后端·python·ipython
我命由我1234540 分钟前
IDEA - IDEA 快速回到页面首尾、页面快速滑动、快速定位到指定行
java·运维·ide·后端·java-ee·intellij-idea·intellij idea
程序员爱钓鱼1 小时前
Python编程实战:面向对象与进阶语法——装饰器(Decorator)
后端·python·ipython
辻戋2 小时前
从零实现React Scheduler调度器
前端·react.js·前端框架
徐同保2 小时前
使用yarn@4.6.0装包,项目是react+vite搭建的,项目无法启动,报错:
前端·react.js·前端框架
Qrun3 小时前
Windows11安装nvm管理node多版本
前端·vscode·react.js·ajax·npm·html5
中国lanwp3 小时前
全局 npm config 与多环境配置
前端·npm·node.js
JELEE.4 小时前
Django登录注册完整代码(图片、邮箱验证、加密)
前端·javascript·后端·python·django·bootstrap·jquery
TeleostNaCl6 小时前
解决 Chrome 无法访问网页但无痕模式下可以访问该网页 的问题
前端·网络·chrome·windows·经验分享