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;
}

执行结果如下:

相关推荐
PBitW6 分钟前
git 中容易遗忘的点 (二) ⚡⚡⚡
前端·git·面试
Hilaku13 分钟前
2026 年前端大洗牌:React 服务端到 Vite 的底层重构
前端·javascript·程序员
PBitW26 分钟前
git 中容易遗忘的点 (三) 🚀🚀🚀
前端·git·面试
名字还没想好☜28 分钟前
React setState 连续调用「丢更新」排查:批量更新与函数式更新
前端·javascript·react.js·react·usestate
程序员cxuan40 分钟前
离谱,GPT-5.6 竟然在后台执行了 rm -rf
人工智能·后端·程序员
Csvn41 分钟前
📊 SQL 入门 Day 9:CTE(公用表表达式)— 让 SQL 像写代码一样优雅
后端·sql
come1123443 分钟前
Vue 2 与 Vue 3 语法区别及使用技巧
前端·javascript·vue.js
运维行者_44 分钟前
如何查看每个IP的带宽使用情况?NetFlow 技术实战指南
开发语言·网络·分布式·后端·架构·带宽
腻害兔1 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:ERP 企业资源模块,一个轻量级进销存的完整实现?
前端·javascript·vue.js·人工智能·前端框架·产品经理·ai编程
虹科网络安全1 小时前
艾体宝新闻|从 SQL 注入到服务器接管:CVE-2026-57517 暴露 Web 管理面板的供应链与安全编码风险
服务器·前端·sql