首页 > 编程语言 >C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造

C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造

时间:2024-04-22 20:57:44浏览次数:33  
标签:name 对象 C++ Person int 构造 构造函数

C++ 构造函数

构造函数是 C++ 中一种特殊的成员函数,当创建类对象时自动调用。它用于初始化对象的状态,例如为属性分配初始值。构造函数与类同名,且没有返回值类型。

构造函数类型

C++ 支持多种类型的构造函数,用于满足不同的初始化需求:

  • 默认构造函数: 不带参数的构造函数,通常用于初始化对象的默认状态。
  • 带参数构造函数: 允许传入参数来初始化对象的状态。
  • 拷贝构造函数: 用于从另一个已存在的对象创建新对象。
  • 移动构造函数: 用于从即将销毁的临时对象转移资源到新对象。

默认构造函数

默认构造函数是最简单的构造函数,不接受任何参数。它通常用于为对象的属性设置默认值,或者执行简单的初始化操作。

class Person {
public:
  string name;
  int age;

  Person() { // 默认构造函数
    name = "Unknown";
    age = 0;
  }
};

int main() {
  Person p1; // 创建 Person 对象
  cout << p1.name << ", " << p1.age << endl; // 输出:Unknown, 0

  return 0;
}

带参数构造函数

带参数构造函数允许传入参数来初始化对象的状态。参数可以是任何有效的 C++ 数据类型,包括基本类型、自定义类对象和指针。

class Car {
public:
  string brand;
  string model;
  int year;

  Car(string b, string m, int y) { // 带参数构造函数
    brand = b;
    model = m;
    year = y;
  }
};

int main() {
  Car car1("Ford", "Mustang", 1967); // 创建 Car 对象并传入参数
  cout << car1.brand << " " << car1.model << " " << car1.year << endl; // 输出:Ford Mustang 1967

  return 0;
}

拷贝构造函数

拷贝构造函数用于从另一个已存在的对象创建新对象。它通常用于复制另一个对象的属性值,而不共享原始对象的数据。

class Person {
public:
  string name;
  int age;

  Person(const Person& other) { // 拷贝构造函数
    name = other.name;
    age = other.age;
  }
};

int main() {
  Person p1("Alice", 30); // 创建 Person 对象
  Person p2(p1); // 拷贝构造函数创建 p2

  cout << p2.name << ", " << p2.age << endl; // 输出:Alice, 30

  return 0;
}

移动构造函数

移动构造函数用于从即将销毁的临时对象转移资源到新对象。它通常用于避免不必要的资源复制,并提高性能。

class Person {
public:
  string name;
  int age;

  Person(Person&& other) { // 移动构造函数
    name = std::move(other.name);
    age = other.age;

    // 将 other 的资源转移到 this
  }
};

int main() {
  Person p1("Bob", 25); // 创建 Person 对象

  Person p2(std::move(p1)); // 移动构造函数创建 p2

  cout << p2.name << ", " << p2.age << endl; // 输出:Bob, 25
  cout << p1.name << ", " << p1.age << endl; // 输出:, 0 (p1 的资源已转移)

  return 0;
}

构造函数的访问控制

构造函数的访问权限可以使用访问控制修饰符来控制,例如 publicprivateprotected

  • public:构造函数可以在类外部的任何地方调用。
  • private:构造函数只能在类的内部调用。
  • protected:构造函数可以在类的内部或其子类中调用。

总结

构造函数是 C++ 中重要的面向对象编程机制,用于初始化和管理对象的状态。通过理解不同类型的构造函数及其用法,您可以创建健壮且可维护的 C++ 代码。

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注

标签:name,对象,C++,Person,int,构造,构造函数
From: https://www.cnblogs.com/xiaowange/p/18151512

相关文章

  • 【每周例题】力扣 C++ 分割字符串
    分割字符串题目 题目分析1.先确定用容器存储,容器的存储结构如下图所示: 2.这个题目的话,第一反应应该是用到动态规划,下面是动态规划的模板:res=[]ans=[]defbacktrack(未探索区域,res,path):if未探索区域满足结束条件:res.add(ans)#深度拷贝......
  • 【每周例题】力扣 C++ 最小和分割
    最小和分割题目 题目分析1.num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。即,num1与num2是从num中提取出来的,且不会重复提取同一个数字,且提取的顺序并不需要按照num的数字顺序2.返回 num1 和 num2 可以得到的和的最小值。要想得到最小值,需......
  • C++八股之函数重载与重写-静态多态与动态多态
    重载:是指在同一作用域中允许存在多个同名函数,⽽这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。重载与类无关,重载实现编译时多态,属于静态绑定。重写:指⼦类新定义⽗类的函数的做法。如果重写的函数在父类中是虚函数,那么能够实现动态多态。如果在父类中没......
  • UE4纯C++实现游戏中快捷栏之创建快捷栏UI
    作为一个在游戏界面中显示的快捷栏,我们需要在游戏运行时就显示出快捷栏UI,故我们创建两个Widget。1.SlAiGameHUDWidget:负责游戏中界面UI的整体显示2.SlAiShortcutWidget:负责快捷栏部件的显示与逻辑然后我们通过:1.将GameHUDWidget添加进视口:在GameHUD文件中添加Game......
  • 构造顺序表并进行基础操作
    //定义顺序表中的元素的数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造记录顺序表SeqList各项参数(顺序表的首地址+顺序表的容量+顺序表中最后有效元素的下标)的结构体typedefstructSeqList{DataType_t*Addr;unsignedintSize;int......
  • 深度解读《深度探索C++对象模型》之数据成员的存取效率分析(三)
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表。前面两篇请通过这里查看:深度解读《深度探索C++对象模型》之数据成员的存取效率分析(一)深度解读《深度探索C++对象模型》之数据成员的......
  • C++ 上位软件通过Snap7开源库访问西门子S7-1200/S7-1500数据块的方法
    前言本人一直从事C++上位软件开发工作较多,在之前的项目中通过C++访问西门子PLCS7-200/S7-1200/S7-1500并进行数据交互的应用中一直使用的是ModbusTCP/ModbusRTU协议进行。Modbus上位开源库采用的LibModbus。经过实际应用发现Modbus开源库单次发送和接受的数据不能超......
  • C++ 连接pg数据库
    环境:windows10vs2022引入pqxxs一些增删改查的示例代码#include"pqxx/pqxx"voidinsertPg(){try{//建立连接pqxx::connectionconn("dbname=postgresuser=postgrespassword=123hostaddr=127.0.0.1port=5432");//添加数据......
  • 关于c++输入输出缓冲区,和IO加速流的一些理解
    首先,让我们来介绍一下这个函数ios::sync_with_stdio();这个函数在缺省状态下默认为true,即开启,这个函数的作用是同步c和c++的缓冲区这个操作是c++为了兼容c而做出的保守决定,即将c和c++的缓冲区合并为一个,但是这样会带来性能上的开销为什么呢?因为这个兼容缓冲区先执行c的输入输......
  • 默认构造函数学习
    转自:https://blog.csdn.net/sevenjoin/article/details/88314531,讲的很好。1.介绍若针对一个类没有显式地定义构造函数,那么编译器会隐式的为这个类生成一个默认构造成员函数。 默认构造函数就是在调用时不需要显示地传入实参的构造函数。假如用户定义了其他构造函数(比如有参数......