C++基础语法:类构造函数
前言
"打牢基础,万事不愁" .C++的基础语法的学习
引入
类是实现面向对象思想的主要方法.前面提到:类是函数的变种,类可以通过调用静态方法或者成员函数来实现逻辑.多数情况下使用成员函数.构造函数是生成类对象成员的必须条件,对此做一些构造函数的归纳
构造函数的目的
接续:做每件事之前都想想目标是什么.学习也是一样,想想设计者的思路是什么.
通常情况下类有成员属性和成员函数.构造函数的目的是为了初始化属性(给属性赋初值)
构造函数的形式
1>直接赋值:最直观的形式,也是用得最多的一种,传入的 形参等于属性值
举例:
class PersonDirect {std::string name;int age;
public:PersonDirect(const std::string& str,int ag):name(str),age(ag){}
};
调用构造函数生成对象,将名称和年龄传入
PersonDirect zs_d("张三",40); //创建一个对象,姓名"张三",年龄40
2>部分赋值,不给属性赋初值也可以.
举例:
class PersonDirectSome {string name;int age;
public:PersonDirectSome(const string& str) :name(str) {} //没有给属性age赋初值void setAge(int ag) { age = ag; } //设置属性age的值int getAge() const { return age; } //读取属性age的值
};
调用构造函数时,传入名称
PersonDirectSome zs_ds("张三");zs_ds.setAge(45);cout << zs_ds.getAge() << endl;
生成对象时age没有初始化,不报错.相当于属性age被"悬挂"起来.唯一注意的是在getAge()之前如果不调用setAge()设置值,则会出现意料之外的结果---相当于随机访问了一块内存地址,地址内值未初始化.
给属性默认赋值,所有对象的属性用同一个值,比如将上面的构造函数改成
PersonDirectSome(const string& str) :name(str),age(20){} //所有对象age默认为20
则所有对象的年龄不需要传入,都被默认设成20.
3>间接赋值
构造函数也表达了形参和属性之间的一种"因果"联系.他们不一定是赋值关系.
举例:构造函数中有表示"姓"的字符串fname,用一个字符lname表示"名"的字符串首字母.
class PersonIndirect {string fname;char lname;int age;
public:PersonIndirect(const string& strf, const string& strl ,int ag) :fname(strf), age(ag) {lname = strl.at(0); //获得传入字符串的首字母,交给属性}char getLname() { //获得字符return lname;}
};
调用构造函数,输入表示"姓"和"名"的字符串,生成对象.
PersonIndirect zs_i("zhang", "san",44);cout << "对象名的首字母是:" << zs_i.getLname() << endl;
默认构造函数
C++提供了默认构造函数. 举例:
class Default { //默认构造函数
private:int age;
public:int getAge() const{ return age; }
};
调用默认构造函数生成对象,什么都不用输入
Default df; //什么都不用输入,调用默认构造函数生成对象cout << df.getAge() << endl; //警告"使用未初始化内存",因为没有给age赋值
如果定义了其他构造函数,默认构造函数将失效,上述代码中Default df;将报错
默认构造函数还是比较有用的,特别在类继承中,派生对象的生成必须先生成基类对象,派生类的构造函数必须要给基类构造函数传入参数.如果给基类定义默认构造函数,则可以简化派生类构造函数.例如:
class Base { //基类定义int age;
public:Base(int ag):age(ag){} //基类普通构造函数Base() { //基类提供默认构造函数 age = 20;}int getAge() const { return age; }
};
class BasePlus : public Base { //派生类定义string name;
public:BasePlus(const string& na,int ag):Base(ag),name(na){} //派生类普通构造函数,参数传给基类构造函数BasePlus(const string&na) :name(na) {}//派生类普通构造函数,忽略传给基类参数,使用了基类默认构造函数
};
调用派生类构造函数,生成派生类对象
BasePlus lisi("lisi", 30); //BasePlus普通构造函数,传入年龄30给基类构造函数cout << "李四的年龄是:" << lisi.getAge() << endl;;BasePlus zs("zs"); //由于基类中定义默认构造函数,简化了派生类对象生成时的编码cout << "张三的年龄是:" << zs.getAge() << endl;
所以一般需要自己定义默认构造函数,即类的构造函数两个以上,含自定义的默认构造函数
定义方法也比较简单,默认给属性赋值就可以.
Base() { //基类提供默认构造函数 age = 20;}
============================================================BasePlus() { //派生类默认构造函数Base(20);name = "nobody";}
还有一种更为简单的方法,给构造函数提供默认参数. 但是试了下如果多个函数使用默认参数的情况似乎不行,所以这是一种选项.
Base(int ag=20):age(ag){} //基类普通构造函数,提供默认参数//Base() { //替换部分 // age = 20;//}
========================================================
小结
有时候觉得C++的语法已经够复杂的了,像构造函数这些相对简单的内容要不要搞得那么复杂.学会后总结一些常规用法,以后就是"复制"和"粘贴".
小结构造函数的写法:
1>直接赋值,形参和属性一一对应.这也是用得最多的写法
2>建议自定义默认构造函数,不写形参,直接给属性赋值.
3> 默认参数,简化函数调用
相关文章:
C++基础语法:类构造函数
前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 类是实现面向对象思想的主要方法.前面提到:类是函数的变种,类可以通过调用静态方法或者成员函数来实现逻辑.多数情况下使用成员函数.构造函数是生成类对象成员的必须条件,对此做一些构造函数的归纳 构造函数的目…...
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单
文章目录 一、SSO介绍1、使用SSO的好处 二、中间件介绍1、Express安装导入使用 2、cors安装导入配置 3、express-session安装导入配置使用 4、jsonwebtoken安装导入使用 5、jwt和session对比 三、SSO实现方案1、安装依赖2、结构3、实现原理 三、示例代码1、nodejs端 server/ind…...
提高Java应用稳定性的部署实践
提高Java应用稳定性的部署实践 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在实际的Java开发过程中,应用的稳定性是一个至关重要的问题。无论是…...
简过网:考公务员报班和不报班的区别大吗?
备考公务员,究竟是报班还是不报班呢?一篇文章让你看看两者之间的区别! 报不报班,其实这是很多考生都会纠结的地方,其实小编还是建议报个班的,这不仅仅是因为我是做这个行业的,更是因为这么长时…...
文化财经盘立方通达信期货通支撑压力自动画线多空转折指标公式源码
文化财经盘立方通达信期货通支撑压力自动画线多空转折指标公式源码: N:26; M:2; D:5; TR1:MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW)); ATR:MA(TR1,N); MEDIANN:(HIGH LOW)/2; UP:MEDIANNATR*M; DN:MEDIANN-ATR*M; A:BARSLAST(C…...
重生之我要学后端11--数据库基础概念(持续更新)
数据库 前言一、关系型数据库二、非关系型数据库三、应用场景关系型数据库(RDBMS)非关系型数据库(NoSQL)综合因素 前言 后端开发者应该熟悉数据库管理系统(DBMS),包括关系型数据库(…...
配置 Cmder 到鼠标右键
win Q 快捷键搜索 cmd,以管理员身份运行 在命令行输入 cmder.exe /REGISTER ALL...
kali下安装使用蚁剑(AntSword)
目录 0x00 介绍0x01 安装0x02 使用1. 设置代理2. 请求头配置3. 编码器 0x00 介绍 蚁剑(AntSword)是一个webshell管理工具。 官方文档:https://www.yuque.com/antswordproject/antsword 0x01 安装 在kali中安装蚁剑,分为两部分&am…...
GIT-LFS使用
0.前言 目前git仓库有很多很大的文件需要管理,但是直接上传,每次clone的文件太大,所有准备使用git-lfs解决。 1、下载和安装 Git LFS 1.1、直接下载二进制包: Releases git-lfs/git-lfs GitHub 安装 Git LFS sudo rpm -ivh…...
免费分享一套SpringBoot+Vue在线水果(销售)商城管理系统【论文+源码+SQL脚本】,帅呆了~~
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue在线水果(销售)商城管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue在线水果(销售)商城管理系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue在线水果(销售)商…...
推荐两款电脑文件处理工具,强大到你不舍得卸载
EasyFileCount EasyFileCount是一款基于Java开发的多功能文件管理工具,旨在帮助用户更轻松地管理和优化他们的文件存储。以下是EasyFileCount的主要功能和特点: 查看文件夹大小:用户可以快速统计和查看文件夹的总大小,实时显示各…...
Python 高级实战:基于自然语言处理的情感分析系统
前言 在大数据和人工智能迅猛发展的今天,自然语言处理(NLP)作为人工智能的重要分支,已经深入到我们的日常生活和工作中。情感分析作为NLP中的一个重要应用,广泛应用于市场分析、舆情监控和客户反馈等领域。本文将讲述…...
ruby面试题
ruby 基础 1、each、map、collect的区别 each: 仅遍历数组,并做相应操作,数组本身不发生改变。 map:遍历数组,并做相应操作后,返回新数组(处理),原数组不变。 collect: 跟map作用一样。 collect! map!: 多了一个作…...
Android U Settings 应用中 APN 菜单实现的代码逻辑
功能简介 MobileNetwork移动网络设置页面下有【接入点设置】(APN)。 问题:为什么Controller初始化找不到pref,然后报错。 Note:什么时候切换成Controller的呢?在Android T&U 上还没有更新成kt实现 ,但是已经有Controller的方案。 流程逻辑 1、界面“telephony_a…...
java时间处理工具类
效果 最近7天:2024年6月21日-2024年6月27日过去一周、最近一周:2024年6月16日-2024年6月22日过去三个月:2024年3月-2024年6月近半年、过去半年:2023年12月-2024年6月去年:2023年1月-2023年12月过去3年:202…...
Android高级面试_2_IPC相关
Android 高级面试-3:语言相关 1、Java 相关 1.1 缓存相关 问题:LruCache 的原理? 问题:DiskLruCache 的原理? LruCache 用来实现基于内存的缓存,LRU 就是最近最少使用的意思,LruCache 基于L…...
docker封禁对外端口映射
docker比linux防火墙规则优先级要高,一旦在docker里面配置了对外服务端口的话在iptable里面封不掉,需要通过下面的方法进行封禁: 这里我的宿主机IP地址是10.5.1.244,docker 内部网络ip段是默认的172.17段的,以下为命令࿱…...
【leetcode系列】567.字符串的排列(滑动窗口)
题目 给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。 换句话说,s1 的排列之一是 s2 的 子串 。 示例 示例 1: 输入:s1 “ab” s2…...
情感分析方法与实践
第1关:情感分析的基本方法 情感分析简介 情感分析,又称意见挖掘、倾向性分析等。简单而言,是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。在日常生活中,情感分析的应用非常普遍,下面列举几种常见的…...
迁移学习——CycleGAN
CycleGAN 1.导入需要的包2.数据加载(1)to_img 函数(2)数据加载(3)图像转换 3.随机读取图像进行预处理(1)函数参数(2)数据路径(3)读取文…...
OpenClaw对话增强:nanobot镜像的聊天历史持久化方案
OpenClaw对话增强:nanobot镜像的聊天历史持久化方案 1. 为什么需要对话持久化 作为一个长期使用OpenClaw进行自动化任务的开发者,我经常遇到这样的困扰:当需要执行一个跨越数小时甚至数天的长周期任务时,传统的短对话模式会导致…...
CasRel开源镜像部署教程:适配低显存(12GB)GPU的轻量级方案
CasRel开源镜像部署教程:适配低显存(12GB)GPU的轻量级方案 1. 前言:为什么选择这个方案 如果你正在处理文本数据,想要自动提取人物、地点、事件之间的关系,那么关系抽取技术就是你需要的工具。CasRel作为…...
基于 Kinova Gen3 机械臂的家庭人机交互安全算法研究
随着服务机器人逐步进入家庭场景,人机交互(HRI)的安全性成为影响机器人普及的关键因素。相较于工业环境,家庭空间布局多变、人员活动随机,对机械臂的感知、规划与控制提出了更高要求。本文以7自由度Kinova Gen3机械臂为…...
SCI期刊AI率要求越来越严:一二区5%以下该怎么降
SCI一二区期刊AI率卡到5%以下,我的论文差点废了——后来这么救回来的 2026年开年,身边三个同学的SCI投稿被拒,理由都一样:AI-generated content detected。不是内容不行,是AI率没过关。 我的判断很直接:S…...
EmbeddingGemma-300m在Mathtype公式的语义理解中的应用
EmbeddingGemma-300m在Mathtype公式的语义理解中的应用 1. 引言 数学公式的语义理解一直是自然语言处理领域的挑战性任务。传统的文本嵌入模型在处理复杂的数学表达式时往往力不从心,无法准确捕捉公式背后的数学含义和逻辑关系。EmbeddingGemma-300m作为Google最新…...
【Frida Android】实战篇:Frida-Trace 进阶追踪——JNI 函数参数捕获与修改
1. 为什么需要捕获JNI函数参数? 在Android安全分析和逆向工程中,JNI函数往往是关键突破口。很多应用会把核心逻辑放在native层实现,比如加密算法、授权验证、敏感数据处理等。单纯Hook Java层方法可能无法触及这些关键逻辑,这时候…...
WordPress主题开发实战:从零开始搭建你的第一个自定义主题(2024最新版)
WordPress主题开发实战:从零开始搭建你的第一个自定义主题(2024最新版) 如果你正准备踏入WordPress主题开发的世界,这篇文章将带你从零开始构建一个完整的自定义主题。不同于简单的仿制或修改现有主题,我们将深入探讨如…...
科研党福音!爱毕业aibye力荐6大AI论文平台,智能改写+降重功能全解析。
工具名称 核心功能 特色优势 Aibiye 论文生成降AI率 全学科覆盖、仿写优化、自动图表生成 Aicheck AI检测文献综述辅助 精准查新、3分钟高效成文 GPT学术版 润色/翻译/代码解释 多模型协同、PDF深度解析 摆平论文 大纲生成降重改写 三步出稿、本硕博通用 QuillB…...
【AI工程化硬核考点】:FastAPI 2.0 + async/await + StreamingResponse三重协程调度机制精讲
第一章:FastAPI 2.0 异步 AI 流式响应 面试题汇总FastAPI 2.0 原生强化了对异步流式响应(StreamingResponse)的支持,尤其适用于大语言模型(LLM)推理、实时日志推送、AI 生成内容分块返回等场景。面试官常聚…...
模拟IC工程师必备:用Cadence Virtuoso仿真电流镜的7个关键步骤
模拟IC工程师必备:用Cadence Virtuoso仿真电流镜的7个关键步骤 在模拟集成电路设计中,电流镜堪称"细胞级"的基础模块,其性能直接影响整个系统的精度与稳定性。对于刚接触Cadence Virtuoso的工程师而言,如何高效完成从电…...
