【 C++】构造函数和成员函数
详细探讨 C++ 中的构造函数和成员函数(方法),并通过代码示例进行说明。
1. 构造函数 (Constructors)
- 目的: 构造函数是一种特殊的成员函数,其主要目的是在创建对象时初始化对象的数据成员。
- 名称: 构造函数的名称必须与类名完全相同。
- 返回类型: 构造函数没有返回类型,甚至不能声明为
void。 - 调用时机: 当创建类的对象时,构造函数会自动被调用。
- 重载: 构造函数可以被重载,这意味着你可以定义多个具有不同参数列表的构造函数。
构造函数的类型
-
默认构造函数 (Default Constructor):
- 不带任何参数的构造函数。
- 如果没有显式定义任何构造函数,编译器会提供一个默认构造函数(但这个默认构造函数可能不做任何初始化工作,特别是对于内置类型成员)。
- 如果定义了其他构造函数,编译器不再提供默认构造函数。
-
带参数的构造函数 (Parameterized Constructor):
- 接受一个或多个参数的构造函数。
- 用于在创建对象时使用特定的值初始化对象。
-
拷贝构造函数 (Copy Constructor):
- 接受一个同类型对象的引用作为参数的构造函数。
- 用于通过复制现有对象来创建一个新对象。
- 如果没有显式定义,编译器会提供一个默认拷贝构造函数(执行浅拷贝)。
-
移动构造函数 (Move Constructor) (C++11):
- 接受一个同类型对象的右值引用作为参数的构造函数
- 将资源从一个临时对象“移动”到新创建的对象, 而不是复制, 提升效率。
代码示例
#include <iostream>
#include <string>class Rectangle {
private:double width;double height;public:// 默认构造函数Rectangle() : width(0.0), height(0.0) {std::cout << "Default constructor called" << std::endl;}// 带参数的构造函数Rectangle(double w, double h) : width(w), height(h) {std::cout << "Parameterized constructor called" << std::endl;}// 拷贝构造函数Rectangle(const Rectangle& other) : width(other.width), height(other.height) {std::cout << "Copy constructor called" << std::endl;}// 移动构造函数 (C++11)Rectangle(Rectangle&& other) noexcept : width(std::move(other.width)), height(std::move(other.height)){other.width = 0;other.height = 0;std::cout << "Move constructor called\n";}// 成员函数(方法)double getArea() const {return width * height;}void setDimensions(double w, double h) {width = w;height = h;}void print() const{std::cout << "Width: " << width << ", Height: " << height << std::endl;}
};int main() {// 使用默认构造函数创建对象Rectangle rect1;rect1.print(); // 输出 Width: 0, Height: 0// 使用带参数的构造函数创建对象Rectangle rect2(5.0, 3.0);rect2.print(); // 输出 Width: 5, Height: 3// 使用拷贝构造函数创建对象Rectangle rect3 = rect2; rect3.print(); // 输出 Width: 5, Height: 3// 使用成员函数std::cout << "Area of rect2: " << rect2.getArea() << std::endl; // 输出 Area of rect2: 15rect2.setDimensions(7.0, 4.0);std::cout << "Area of rect2 after setDimensions: " << rect2.getArea() << std::endl; // 输出 28//移动构造Rectangle rect4 = std::move(rect2); // 调用移动构造函数rect4.print(); // rect4 的值rect2.print(); // rect2 的width, height 已经被设置为0return 0;
}
2. 成员函数 (Member Functions / Methods)
- 目的: 成员函数是定义在类内部的函数,用于操作对象的数据成员或执行与对象相关的操作。
- 访问权限: 成员函数可以访问类的所有成员(包括私有成员)。
this指针: 在成员函数内部,可以使用this指针来引用当前对象。this指针是一个指向当前对象的指针。const成员函数:- 在函数声明的末尾加上
const关键字,表示该函数不会修改对象的数据成员。 const对象只能调用const成员函数。
- 在函数声明的末尾加上
代码示例 (接上面的 Rectangle 类)
// ... (Rectangle 类的定义) ...int main() {// ... (之前的代码) ...const Rectangle constRect(2.0, 2.0); // 创建一个 const 对象// constRect.setDimensions(4.0, 4.0); // 错误!const 对象不能调用非 const 成员函数std::cout << "Area of constRect: " << constRect.getArea() << std::endl; // 正确,可以调用 const 成员函数constRect.print(); //正确return 0;
}
要点总结
- 构造函数用于初始化对象,成员函数用于操作对象。
- 构造函数没有返回类型,名称与类名相同,可以重载。
- 成员函数可以访问类的所有成员,
this指针指向当前对象。 const成员函数不能修改对象的数据成员,const对象只能调用const成员函数。- 理解构造函数和成员函数对于编写面向对象的 C++ 代码至关重要。
希望这些详细的解释和代码示例能帮助你更好地理解 C++ 中的构造函数和成员函数。如果有任何其他问题,请随时提出!
相关文章:
【 C++】构造函数和成员函数
详细探讨 C 中的构造函数和成员函数(方法),并通过代码示例进行说明。 1. 构造函数 (Constructors) 目的: 构造函数是一种特殊的成员函数,其主要目的是在创建对象时初始化对象的数据成员。名称: 构造函数的…...
OpenCV计算摄影学(22)将输入的彩色图像转换为两种风格的铅笔素描效果函数pencilSketch()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 铅笔风格非写实线描图。 该函数通过图像处理技术将输入的彩色图像转换为两种风格的铅笔素描效果: dst1:炭笔效果的灰度图…...
Event driven agentic document workflows 笔记 - 1
1. 课程介绍 主题:与 LlamaIndex 合作构建的事件驱动代理文档工作流讲师:Laurie Voss(LlamaIndex 开发者关系副总裁) 2. 代理文档工作流简介 定义:基于代理的应用程序,用于自动化端到端文档处理工作流。…...
影响单模光纤耦合效率的分析
影响单模光纤耦合效率的因素 如果想使单模光纤的耦合效率最高,入射光束需要满足以下条件: (1)入射光束接近高斯光; (2)入射光束从光纤端面正入射; (3)入射…...
windows+ragflow+deepseek实战之一excel表查询
ragflows平台部署参考文章 Win10系统Docker+DeepSeek+ragflow搭建本地知识库 ragflow通过python实现参考这篇文章 ragflow通过python实现 文章目录 背景效果1、准备数据2、创建知识库3、上传数据并解析4、新建聊天助理5、测试会话背景 前面已经基于Win10系统Docker+DeepSeek+…...
从“不敢买大”到“按墙选屏”,海信电视如何凭百吋重构客厅?
电视买小了,成为茜茜新房入住后最大的遗憾。 新房装修的时候,茜茜担心电视买大了眼睛看着累,因此把尺寸选在了65吋。结果入住后,孩子看动画片嚷着“画面太小”,老公看球赛吐槽“看不清球员号码”,全家追剧…...
ABAP 长文本编辑器
加个屏幕 *&---------------------------------------------------------------------* *& Report YDEMO2 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------…...
【K8S】ImagePullBackOff状态问题排查。
ImagePullBackOff 是在使用 Kubernetes(K8s)时经常遇到的一种错误状态,下面为你详细介绍其含义、可能的原因及解决办法。 含义 当你在 K8s 集群中创建一个 Pod 时,Kubelet 会尝试从指定的镜像仓库拉取所需的容器镜像。如果拉取镜…...
Logstash 使用指南
Logstash 是一个开源的数据收集引擎,能够从多种数据源收集数据,进行转换和过滤,并将数据发送到指定的目的地(如 Elasticsearch、文件、数据库等)。它是 Elastic Stack(ELK Stack)的重要组成部分…...
Python 位运算符大全
在 Python 中,位运算符用于对整数进行位级别的操作。位运算符直接操作二进制位,适用于处理二进制数据、位掩码、权限控制等场景。Python 提供了多种位运算符,包括按位与、按位或、按位异或、按位取反、左移和右移等。 1. 常见的位运算符 运算符描述示例&按位与a & b…...
MATLAB 调用arduino uno
为了授课,必须重新把arduino用上。 采用MATLAB编码,可以简化相关程序授课部分 1 安装包 MATLAB Support Package for Arduino Hardware - File Exchange - MATLAB Central (mathworks.com) 需要这个插件。 当然也可下载simulink的模块,但…...
Git——分布式版本控制工具使用教程
本文主要介绍两种版本控制工具——SVN和Git的概念,接着会讲到Git的安装,Git常用的命令,以及怎么在Vscode中使用Git。帮助新手小白快速上手Git。如果想直接上手用Vscode操作远程仓库则直接看7和9即可! 目录 1. SVN和Git介绍 1.1 …...
HarmonyOS 开发中条件渲染的选择:if/else 与取反操作的对比与实践
在HarmonyOS开发里,if/else 条件渲染和取反操作(常借助三元运算符)都能根据不同情况设置组件属性值。下面从多个维度分析如何选择,以及各自的利弊,并附上代码示例。 选择方法 简单二元条件:当条件只有两种…...
【数据分析】数据筛选与访问行列元素3
访问元素 .loc属性可以通过传入index的值访问行数据。 .loc属性允许传入两个参数,分别是index的值和columns的值,参数间用“逗号”隔开,这样便可以访问数据中的元素。 1. 访问单个元素 访问单个元素比较简单,只需要通过它的in…...
前沿技术一览科技改变生活新趋势
虚拟现实技术最近在教育里变得特别火。它能让人感觉像是真的到了另一个地方。比如学生戴上VR眼镜,就能“走进”历史事件的发生地或者深入细胞内部去了解生命科学。 这种学习方法能让知识更生动。学生不再只是看书听讲,而是可以亲手体验。比如在学习地理…...
Python连接数据库进行增删改查
更多优质文章 _>_>_>_>_>✍✈✉戳我 目录 1.导入相关库 2.创建连接 3.插入数据 4.删除数据 5.修改数据 6.查询数据 7.更多干货 1.导入相关库 import pymysql -----pip install pymysql #下载库 2.创建连接 conn pymysql.connect(hostlocalho…...
爬虫——playwright获取亚马逊数据
目录 playwright简介使用playwright初窥亚马逊安装playwright打开亚马逊页面 搞数据搜索修改bug数据获取翻页优化结构 简单保存 playwright简介 playwright是微软新出的一个测试工具,与selenium类似,不过与selenium比起来还是有其自身的优势的ÿ…...
大数据学习(77)-Hive详解
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
回调方法传值汇总
<template v-slot"scope"><el-switch v-model"scope.row.open" change"(p1) > changeOpen(p1, scope.row)"></el-switch></template>公域流量 多选 selection-change“val > multipleSelection val”...
汽车一键启动PKE无钥匙系统
移动管家汽车一键启动PKE舒适无钥匙遥控远程系统是一种集成了多项先进功能的汽车电子系统,主要目的是提高驾驶便利性和安全性。 以下是该系统的具体功能: 功能类别 功能描述 无钥匙进入 感应无钥匙进入(自动感应开关门) 一…...
Postman 新手入门指南:从零开始掌握 API 测试
Postman 新手入门指南:从零开始掌握 API 测试 一、Postman 是什么? Postman 是一款功能强大的 API 开发与测试工具,支持 HTTP 请求调试、自动化测试、团队协作等功能。无论是开发人员还是测试工程师,都可以用它快速验证接口的正确…...
猿大师中间件:如何在最新Chrome浏览器Web网页内嵌本地OCX控件?
OCX控件是ActiveX控件的一种,主要用于在网页中嵌入复杂的功能,如图形渲染、多媒体播放等,可是随着谷歌Chrome等主流浏览器升级,目前已经不支持微软调用ActiveX控件了,如果想调用OCX控件用IE浏览器或者国产双擎浏览器&a…...
[数据结构]排序之 归并排序(有详细的递归图解)
一、非递归 基本思想: 归并排序( MERGE-SORT )是建立在归并操作上的一种有效的排序算法 , 该算法是采用分治法( Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列&#x…...
构建第二个Django的应用程序
构建第二个应用程序 文章目录 构建第二个应用程序1.打开Visual Studio code 左上角 点击fike 点击open folder2.打开上次的Django项目 并按图示点击进入终端3.在下方终端输入创建app01项目的命令 接着在左上方会出现一个app01的项目4.接着在Hellodjango的项目里settings.py中定…...
axios 请求拦截器和 响应拦截器总结
请求拦截器 和 响应拦截器 是 axios 提供的强大功能,用于在请求发送前和响应返回后统一处理某些逻辑。它们的作用和具体用法如下: 1. 请求拦截器 作用 在请求发送之前,对请求配置进行统一处理。例如: 添加请求头(如…...
图像分割的mask有空洞怎么修补
分享一个对实例分割mask修补的方法,希望对大家有所帮助。 1. 这是我准备分割的图片 2 分割结果 可以看到衣服部分有一些没分割出来,二值化图片能清晰看到衣服部分有些黑色未分出的地方。 3 补全mask区域 import cv2 import numpy as npdef fill_mask_h…...
HarmonyOS NEXT 组件状态管理的对比
在HarmonyOS NEXT开发中,组件状态管理是构建动态用户界面的核心。本文将深入探讨State、Prop、Link和ObjectLink这四种常见的状态管理装饰器,并通过示例代码进行对比分析,以帮助同学们更好地理解和选择合适的状态管理方式。 一、装饰器概述 …...
C#通过API接口返回流式响应内容---SignalR方式
1、背景 在上两篇《C#通过API接口返回流式响应内容—分块编码方式》和《C#通过API接口返回流式响应内容—SSE方式》实现了流式响应的内容。 上面的这两个主要是通过HTTP的一些功能,除了这些之外,还有WebSocket的方式。C#中的WebSocket的有比较多的方案&…...
vulhub靶机----基于docker的初探索,环境搭建
环境搭建 首先就是搭建docker环境,这里暂且写一下 #在kali apt update apt install docker.io配置docker源,位置在/etc/docker/daemon.json {"registry-mirrors": ["https://5tqw56kt.mirror.aliyuncs.com","https://docker…...
P1659 [国家集训队] 拉拉队排练 (manacher 算法)
P1659 [国家集训队] 拉拉队排练 - 洛谷 这题需要求前k大的回文子串的长度的乘积。因为n的大小为1e6 ,所以我们只能使用manacher 线性的来找到所有的回文子串。 其中长度大的回文子串可以包含小的回文子串,所以其实我们只需要知道以每一个位置为回文中心…...
