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)读取文…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
