C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造
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;
}
构造函数的访问控制
构造函数的访问权限可以使用访问控制修饰符来控制,例如 public、private 和 protected。
public:构造函数可以在类外部的任何地方调用。private:构造函数只能在类的内部调用。protected:构造函数可以在类的内部或其子类中调用。
总结
构造函数是 C++ 中重要的面向对象编程机制,用于初始化和管理对象的状态。通过理解不同类型的构造函数及其用法,您可以创建健壮且可维护的 C++ 代码。
最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎点赞、收藏、关注
C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造的更多相关文章
- C#利用反射动态创建对象 带参数的构造函数和String类型 (转载)
最近笔者有一个想法需要利用反射动态创建对象(如string,int,float,bool,以及自定义类等)来实现,一直感觉反射用不好,特别是当构造函数带参数的时候.MSDN上给出的例子十分复杂,网上的 ...
- C# 利用反射动态创建对象——带参数的构造函数和String类型
C# 利用反射动态创建对象——带参数的构造函数和String类型 最近笔者有一个想法需要利用反射动态创建对象(如string,int,float,bool,以及自定义类等)来实现,一直感觉反射用不好, ...
- mfc 带参数的构造函数
知识点 默认的构造函数 带参数的构造函数 重载构造函数 一.默认的构造函数 二.带参数的构造函数 三.重载构造函数 class Tdate { public: int year;//年 int mon ...
- C++构造函数重载以及默认参数引起的二义性
大家都知道当我们声明一个类时,系统会提供一个默认构造函数.当我们需要提供参数进行对类数据成员进行初始化时,就需要对类的带参构造函数进行重载.同时,如果我们需要调用默认构造函数进行类数据成员的初始化时, ...
- C#的泛型的类型参数可以有带参数的构造函数的约束方式吗?
Review后看到标题让我十分羞愧自己语文功底太差,估计...请见谅......我还特地把这句写回开头了...... 问题 前天遇到的一个问题,所以在MSDN发了个问,刚也丰富了下问题,关于泛型的. ...
- C++带参数默认值的函数
定义形式: void fun(int a = 1 ,int b = 2 ,int c = 3 ,int d = 4){ //函数定义 cout<<"a="<< ...
- C++构造函数的自动调用(调用一个父类的构造函数,有显性调用最好,否则就默认调用无参数的构造函数)——哲学思想:不调用怎么初始化父类的成员数据和VMT?
我总是记不住构造函数的特点,关键还是没有领会那个哲学思想:父类的构造函数一方面要初始化它自己的成员数据,另一方面也要建立它自己的VMT呀!心里默念一百遍:一定调用父类构造函数,一定调用父类构造函数,一 ...
- c++中在一个类中定义另一个只有带参数构造函数的类的对象
c++中在一个类中定义另一个只有带参数构造函数的类的对象,编译通不过 #include<iostream> using namespace std; class A { public: ...
- js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)
js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...
- JavaScript--关于实例对象带不带参数和构造函数带不带参数的关系
就是一句话: 构造函数创建对象时,也可以带参数,因为可以对对象进行一些属性的初始化,也就是你创建对象时,就带着这些属性,当然你也可以不带参数,后面实例化对象后再进行添加.而且,js函数的参数在定义函数 ...
随机推荐
- viewui tree 自定义化(源码copy出来改动)#添加 获取selected 解决方案
需求: 对树有title的点击效果,右侧有说明文字 和 按钮能点击,不能右键,系统用的壳已经有右键了. 出现的问题: viewui的tree有两年没更新了,对ui这块,是采取的render自定义,但是 ...
- yarn install --offline 离线安装 回头试试 npm install ./package.tgz
yarn install --offline npm pack npm install ./package.tgz 尝试了 npm-pack-all --dev-deps 也不行,太慢,等了20分钟 ...
- Rust GUI库 egui 的简单应用
目录 简介 简单示例 创建项目 界面设计 切换主题 自定义字体 自定义图标 经典布局 定义导航变量 实现导航界面 实现导航逻辑 实现主框架布局 调试运行 参考资料 简介 egui(发音为"e ...
- JSP、Servlet中的相对路径和绝对路径
http://www.webjx.com 更新日期:2005-03-31 11:11 出处:网页教学网 作者: JSP和Servlet中的绝对路径和相对路径问题困扰了我好几天,经过努力之后将其部 ...
- undefined reference to vtable for "xxx::xxx" in QT(已解决)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文发布于 2015-02-09 15:37:25 ...
- 【leetcode 952. 按公因数计算最大组件大小】【欧拉筛+并查集】
import java.util.ArrayList; import java.util.Arrays; import java.util.List; class Solution { List< ...
- 你是怎么理解ES6中 Decorator 的?使用场景?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.介绍 Decorator,即装饰器,从名字上很容易让我们联想到装饰者模式 简单来讲,装饰者模式就是一种在不改变原类和使用继承的情况下, ...
- 开发必会系列:《深入理解JVM(第二版)》读书笔记
一 开始前 HotSpot:http://xiaomogui.iteye.com/blog/857821 http://blog.csdn.net/u011521890/article/detail ...
- KingbaseES 等待事件之LWLock lock_manager
背景 相信我们不止一次遇到过一个等待事件:LWLock lock_manager.下面我们聊聊这个等待事件的含义,产生原因,以及解决方法. 等待事件含义 当数据库维护共享锁的内存区域以在无法实现以fa ...
- 【Java】快速排序
代码: 1 public static void quickSort(int[] arr) { 2 if (arr == null || arr.length < 2) { 3 return; ...