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> 默认参数,简化函数调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【日志消息类的编写】

日志消息类编写 由于上篇的代码比较简单&#xff0c;今天就多写两段代码顺便把日志消息类编写完成。 这个类的实现就是&#xff1a;什么时间&#xff0c;哪个线程&#xff0c;哪个文件的哪一行&#xff0c;发生了什么等级的日志&#xff0c;日志机器名字是什么&#xff0c;日…

20240628 每日AI必读资讯

&#x1f4da; Hugging Face 推出新版开源大模型排行榜&#xff0c;中国模型 Qwen-72B 夺冠 - 阿里Qwen-2-72B指令微调版本问鼎全球开源大模型排行榜榜首 - Llama-3-70B 微调版本排名第二&#xff0c;而 Mixtral-8x22B 微调版本位居第四。 - 另外&#xff0c;微软的 Phi-3-M…

三种分布式锁实现方式

目录 1、数据库自增 2、Redis自增 3、Zookeeper 4、其他 4.1、雪花算法 4.2、Tinyid 4.3、Leaf 4.4、数据库号段 1、数据库自增 利用数据库表的自增特性&#xff0c;或主键唯一性&#xff0c;实现分布式ID REPLACE INTO id_table (stub) values (’a‘) ; SELECT LA…

社交App广告优化新篇章:Xinstall引领用户体验升级,助力买量效果提升

随着移动互联网的快速发展&#xff0c;社交App已经成为人们生活中不可或缺的一部分。然而&#xff0c;在竞争激烈的市场环境下&#xff0c;如何有效地进行广告投放&#xff0c;吸引并留住用户&#xff0c;成为了每个社交App运营者面临的重大挑战。今天&#xff0c;我们就来谈谈…

自费5K,测评安德迈、小米、希喂三款宠物空气净化器谁才是高性价比之王

最近&#xff0c;家里的猫咪掉毛严重&#xff0c;简直成了一个活生生的蒲公英&#xff0c;家中、空气中各处都弥漫着猫浮毛甚至所有衣物都覆盖着一层厚厚的猫毛。令人难以置信的是&#xff0c;有时我甚至在抠出的眼屎中都能发现夹杂着几根猫毛。真的超级困扰了。但其实最空气中…

Packer-Fuzzer一款好用的前端高效安全扫描工具

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、Packer Fuzzer介绍 Packer Fuzzer是一款针对Webpack…

4.if 条件判断

1.if-else语句 if #判断条件 :pass else:pass2.if - elif- else if #判断条件 :pass elif #判断条件:pass else:pass3.if语句可以嵌套 if #判断条件 :passif #判断条件 :pass 4.逻辑运算符 and 两个都为真,才是真 or 一个为真 即是真 not 取反 and从左到右,所有值为真,返回…

麒麟系统安装MySQL

搞了一整天&#xff0c;终于搞定了&#xff0c;记录一下。 一、背景 项目的原因&#xff0c;基于JeecgBoot开发的系统需要国产化支持&#xff0c;这就需要在电脑上安装MySQL等支撑软件。 国产化项目的操作系统多是麒麟系统&#xff0c;我的系统如下&#xff1a; arm64架构。…

C#快速开发OPCUA服务器

为方便演示&#xff0c;此时创建一个控制台应用程序。第三方dll(C编写的库opcsrv.dll&#xff0c;他人实现)。 拷贝dll到运行目录下&#xff1a; 拷贝二次封装后的文件到项目目录下&#xff1a; 第一步&#xff1a;创建OpcUa服务器 //第一步&#xff1a;创建OpcUa服务器 OPCSr…

java.util.Optional类介绍

java.util.Optional 是 Java 8 引入的一个容器类,用于表示可能包含或不包含非空值的对象。它的设计初衷是为了减少程序中的空指针异常(NullPointerException),并使代码更加简洁和易读。 Optional 类的介绍 1. 特点 避免显式的 null 检查:使用 Optional 可以避免显式的 n…

基于ssh框架的个人博客源码

基于ssh的个人博客源码&#xff0c;页面清爽简洁&#xff0c;原先有部分bug,运行不了&#xff0c;现已修复 1.博客首页 &#xff08;本地访问地址 :localhost:8080/Blog/index/index&#xff09; 2.关于我 3.慢生活 4.留言板 5.我的相册 微信扫码下载源码

商场配电新思维:智能网关驱动的自动化管理系统

在商场配电室监控系统中&#xff0c;主要是以无线网络为载体&#xff0c;目的就是便于对变电站等实时监测与控制。其中&#xff0c;4G配电网关非常关键&#xff0c;可以将配电室系统终端上的信息数据及时上传到服务器&#xff0c;再由服务器下达控制指令到各模块中&#xff0c;…

Oracle Database 23ai新特性之INTERVAL聚合函数增强

Oracle Database 23ai 开始 AVG 以及 SUM 函数支持 INTERVAL 数据类型&#xff0c;它们可以作为聚合函数或者分析函数使用。 示例表 本文将会使用以下示例表&#xff1a; create table t1 (id integer,start_time timestamp,end_time timestamp,duration in…

超越规模的冒险之旅:引导人工智能价值对齐

在茫茫技术之林中&#xff0c;人工智能凭借大模型占据了重要地位。人们已经不再局限于人机对弈和AI识图&#xff0c;开始探索那些能够模仿人类思考的机器。无论是日常聊天、文本写作&#xff0c;还是[在完美的提示词引导下创作出惊艳的诗歌]&#xff0c;我们不得不承认AI工具已…

双指针算法第二弹(查找总价格为目标值的两个商品-和为s的两个数字 三数之和 四数之和)

系列文章目录 《双指针算法第一弹&#xff08;移动零 复写零 快乐数&#xff09;》链接&#xff1a;http://t.csdnimg.cn/Nqdvn 目录 系列文章目录 前言 1. 查找总价格为目标值的两个商品 &#xff08;1&#xff09;题目及示例 &#xff08;2&#xff09;思路&#xff08…

纯css写一个动态圣诞老人

效果预览 在这篇文章中&#xff0c;我们将学习如何使用CSS来创建一个生动的圣诞老人动画。通过CSS的魔力&#xff0c;我们可以让圣诞老人在网页上摇摆&#xff0c;仿佛在向我们招手庆祝圣诞节和新年。 实现思路 实现这个效果的关键在于CSS的keyframes动画规则以及各种CSS属性…

想要打造高效活跃的私域社群,这些技巧要知道

对一些企业来说“做社群等于做私域”。 在腾讯提到的私域转化场景中&#xff0c;社群与小程序、官方导购三者并列。 社群连接着品牌和群内用户。品牌通过圈住更多用户&#xff0c;来持续免费触达用户实现变现&#xff0c;用户则是从品牌方手中直接获取更多服务和优惠。那么&a…

【绝对有用】yolo系列目标检测 核心技术点 汇总

YOLO (You Only Look Once) 是一种高效的目标检测算法&#xff0c;它以速度和精度著称。YOLO 的工作原理是将目标检测视为一个回归问题&#xff0c;直接从图像的像素空间预测目标的类别和位置。YOLO 目标检测头包括以下几个关键部分&#xff1a; 输入图像处理&#xff1a; YOLO…

云计算【第一阶段(19)】磁盘管理与文件系统 LVM与磁盘配额(二)

目录 一、LVM概述 1.1、LVM机制的基本概念 ​编辑 1.2、LVM的管理命令 1.3、lvm存储 两种机制 1.4、lvm应用实例 二、磁盘配额概述 2.1、设置磁盘配额 2.2.1、实现磁盘限额的条件 2.2.2、linux磁盘限额的特点 2.2.3、磁盘配额管理 一、LVM概述 1.1、LVM机制的基本概…

用Python制作一个简单的计算器(加减乘除)

简易计算器 写在前面 小编用python实现了一个简单的计算器&#xff0c;一起来看看吧~ 需要环境&#xff1a; pycharm python 一、需求分析 1.1 功能分析 使用Python的Tkinter界面设计实现一个简单的计算器&#xff0c;主要功能按钮包括数字键、四则运算符、等于号和清除…