C++day3(类、this指针、类中的特殊成员函数)
一、Xmind整理:





二、上课笔记整理:
1.类的应用实例
#include <iostream>
using namespace std;class Person
{
private:string name;
public:int age;int high;void set_name(string n);    //在类内声明函数void show(){cout << "name = "<< name << " age = "<<age << " high = "<<high << endl;}
};int main()
{Person p1;       //实例化一个类对象p1p1.set_name("zhangsan");p1.age = 90;p1.high = 100;p1.show();return 0;
}//类外实现
void Person::set_name(string n)
{name = n;
} 
2.定义一个矩形类(Rectangle),包含私有成员长(length)、宽(width),定义成员函数:
设置长度: void set_len(int l);
设置宽度: void set_wid(int w);
获取长度: int get_len();
获取宽度: int get_wid();
显示周长和面积: void show();
#include <iostream>using namespace std;class Rectangle
{
private:int length;int width;
public:void set_len(int l);void set_wid(int w);int get_len();int get_wid();void show(){cout << "周长为:" << 2*(length+width) << endl;cout << "面积为:" << length*width << endl;}
};
void Rectangle:: set_len(int l)
{length = l;
}
void Rectangle:: set_wid(int w)
{width = w;
}
int Rectangle:: get_len()
{return length;
}
int Rectangle:: get_wid()
{return width;
}
int main()
{Rectangle c;c.set_len(3);c.set_wid(4);cout << "长为:" << c.get_len() << endl;cout << "宽为:" << c.get_wid() << endl;c.show();return 0;
}
 
3.必须使用this指针的场合
#include <iostream>
using namespace std;class Rec
{int length;int width;
public://所有函数的类内声明void set_len(int length);void set_wid(int width);int get_len();int get_wid();void show();
};void Rec::set_len(int length)
{this->length = length;
}void Rec::set_wid(int width)
{this->width = width;
}int Rec::get_len()
{return length;
}int Rec::get_wid()
{return width;
}void Rec::show()
{cout << "周长" << 2*(length+width) << endl;cout << "面积" << length*width << endl;
}
int main()
{Rec r1;    //实例化了一个Rec类的类对象r1Rec r2;r2.set_len(20);r1.set_len(10);r1.set_wid(3);cout << "长:" << r1.get_len() << endl;cout << "宽:" << r1.get_wid() << endl;r1.show();return 0;
} 
4.构造函数允许函数重载
#include <iostream>
using namespace std;class Stu
{string name;int age;
public://定义Stu类的无参构造Stu(){cout << "Stu的无参构造" << endl;}//函数重载Stu(string name,int age){this->name = name;this->age = age;cout << "Stu的有参构造" << endl;}Stu(string name){this->name = name;cout << "Stu的对name的有参构造" << endl;}
};int main()
{     Stu s1("zhangsan",18);  //栈区的类对象Stu *p;  //在栈区申请一个Stu*类型的指针p = new Stu("lisi");    //在堆区申请一个Stu的空间,会调用构造函数return 0;
} 
5.构造函数的初始化列表
//包含其他类的子对象
#include <iostream>
using namespace std;
class Per
{string name;
public://Per提供的有参构造Per(string name){this->name = name;cout << "Per的有参构造" << endl;}Per(){cout << "Per的无参构造" << endl;}//一个show函数,输出namevoid show(){cout << "Per中的name=" << name << endl;}
};class Stu
{int score;
public:Per p1;    //Stu类中,包含另一个类的子对象,且另一个类只有有参构造函数
public:Stu(string name):p1(name)    //必须使用初始化列表,并且在初始化列表显性调用另一个类的构造函数{cout << "Stu的有参构造" << endl;}Stu(){cout << "Stu的无参构造" << endl;}
};int main()
{Stu s1("zhangsan");//通过s1这个类对象,调用Per中的show函数s1.p1.show();Stu s2;return 0;
}//同名或者是包含引用成员/const修饰的成员
class Stu
{string name;//int &age;     //类中有引用成员const int score;
public://定义Stu类的无参构造
//    Stu()
//    {
//        cout << "Stu的无参构造" << endl;
//    }//函数重载,使用初始化列表的方式//初始化列表也可以解决形参和成员属性同名问题Stu(string name,int age):name(name),score(age)  //在函数体外给成员属性初始化{cout << "Stu的有参构造" << endl;}void show(){cout << name << " " << score << endl;}
};int main()
{     Stu s1("zhangsan",18);  //栈区的类对象s1.show();Stu *p;  //在栈区申请一个Stu*类型的指针p = new Stu("lisi",20);    //在堆区申请一个Stu的空间,会调用构造函数return 0;
} 
6.需要显性定义出析构函数的情况
#include <iostream>
using namespace std;class Stu
{int *p;
public:Stu():p(new int)    //在不传参的情况下,给指针成员p用堆区的空间初始化{cout << "Stu无参构造" << endl;}Stu(int a):p(new int(a))   //在参数为整形变量的情况下,让p指向堆区申请的空间//但是把这篇空间的内容,用传过来的整形变量初始化{cout << "Stu的有参构造" << endl;}Stu(int *p)   //要求传过来的指针的值,一定是指向堆区空间{this->p = p;cout << "Stu传指针的有参构造" << endl;}~Stu(){//在析构之前释放堆区的空间cout << "准备释放空间:" << p << endl;delete p;p = nullptr;cout << "Stu的析构函数" << endl;}
};int main()
{Stu s1(90);return 0;
} 
7.拷贝构造函数
#include <iostream>
using namespace std;
class Stu
{string name;
public:Stu(){cout << "Stu的无参构造" << endl;}Stu(string name){this->name = name;cout << "Stu的有参构造" << endl;}Stu(Stu &other)   //Stu的拷贝构造函数,和无参构造以及有参构造构成函数冲澡{this->name = other.name;cout << "Stu的拷贝构造函数" << endl;}void show(){cout << name << endl;}
};
Stu fun(Stu s1)  //定义了一个函数fun,形参是一个类对象
{cout << "调用成功" << endl;return s1;
}
int main()
{Stu s1("zhangsan");cout << "s1:";s1.show();Stu s2 = s1;   //拷贝构造函数cout << "s2:";s2.show();fun(s2);return 0;
} 

8.深浅拷贝问题
#include <iostream>
using namespace std;class Stu
{int *p;
public:Stu():p(new int)    //在不传参的情况下,给指针成员p用堆区的空间初始化{cout << "Stu无参构造" << endl;}Stu(int a):p(new int(a))   //在参数为整形变量的情况下,让p指向堆区申请的空间//但是把这篇空间的内容,用传过来的整形变量初始化{cout << "Stu的有参构造" << endl;}Stu(int *p)   //要求传过来的指针的值,一定是指向堆区空间{this->p = p;cout << "Stu传指针的有参构造" << endl;}~Stu(){//在析构之前释放堆区的空间cout << "准备释放空间:" << p << endl;delete p;p = nullptr;cout << "Stu的析构函数" << endl;}void show(){cout << "p=" << p << endl;}void set_p(int a){*p = a;    //通过指针变量p,修改内存中的值}void show_p(){cout << *p << endl;  //通过指针变量,输出p指向的内存中的值}//拷贝构造函数Stu(Stu &other){p = new int;  //手动让s2的指针p指向堆区的空间//实现深拷贝*p = *(other.p);cout << "Stu的拷贝构造函数" << endl;}
};
int main()
{Stu s1(90);    //会给s1的指针成员在堆区申请一片空间使用90初始化Stu s2 = s1;   //申请了一个Stu的类对象的空间,也实现了用s1的值初始化s2//左调右参//上面一行,调用了拷贝构造函数//使用了默认提供的拷贝构造,会造成指针成员,指向同一片空间的问题
//    cout << "s1:";
//    s1.show();
//    cout << "s2:";
//    s2.show();s1.show_p();s2.show_p();s1.set_p(101);s1.show_p();s2.show_p();return 0;
}相关文章:
C++day3(类、this指针、类中的特殊成员函数)
一、Xmind整理: 二、上课笔记整理: 1.类的应用实例 #include <iostream> using namespace std;class Person { private:string name; public:int age;int high;void set_name(string n); //在类内声明函数void show(){cout << "na…...
Qt中的配置文件:实现个性化应用程序配置与保存加载
一、前言 在现代软件开发中,用户对于应用程序的个性化配置和设置变得越来越重要。为了满足用户需求并提供更好的用户体验,开发人员常常需要实现一种机制,以便在每次启动应用程序时能够记住用户上次的配置。这样用户就可以方便地恢复到他们熟悉的环境,无需重新进行所有设置…...
Navicat激活时出现rsa public key not find错误
Navicat激活时出现rsa public key not find错误 在激活时,先不打开应用,先用管理员身份打开注册机Navicat_Keygen_Patch_v5.6_By_DFoX.exe,Navicat v15——>MySql——>Simplified Chinese——>Patch,执行完这些步骤之后…...
FFmpeg5.0源码阅读——URLContext和URLProtocol
摘要:本文描述FFmpeg中URLContext和URLProtocal的实现。 关键字:URLContext、URLProtocal FFmpeg中URLProtocol是具体的协议的抽象,其中定义了对应协议的抽象,其中包含了具体协议的操作函数指针。而URLContext是对协议操作的抽…...
Qt的输出
目录 基本分类 C风格输出 C风格 可以抑制输出 方法一 方法二 在Qt中进行log输出, 一般不使用c中的printf, 也不是使用C中的cout, Qt框架提供了专门用于日志输出的类, 头文件名为 QDebug。 基本分类 qDebug:调试信息提示 qInfo :输出信息 qWarnin…...
长胜证券:久违普涨再现 大盘回升有望加速
获得利好支撑后,大盘开始继续反弹。 沪指周二一路震动反弹,站上3100点整数关口后继续上攻并打破10日均线限制。深成指同样低开高走,全日体现明显强于沪指。 到收盘,沪指报收3135.89点,上涨1.2%;深成指报收…...
WPF .NET 7.0学习整理(一)
参照文档进行不系统的整理,看到那写到那O.o 依赖属性 DependencyProperty:使用专有字段支持属性的标准模式的替代方法。 DependencyObject:定义了可以注册和拥有依赖属性的基类。 public static readonly DependencyProperty IsSpinningPr…...
数据分析简介
判断采集数据的有效性和进行数据校准是数据处理中重要的步骤。以下是一些常见的方法和步骤可以帮助你进行数据有效性的判断和数据校准: 数据有效性判断: 数据范围:检查数据是否落在合理的范围内。根据具体情况,确定真实数据的上下限ÿ…...
解读未知:文本识别算法的突破与实际应用
解读未知:文本识别算法的突破与实际应用 1.文本识别算法理论 背景介绍 文本识别是OCR(Optical Character Recognition)的一个子任务,其任务为识别一个固定区域的的文本内容。在OCR的两阶段方法里,它接在文本检测后面…...
[第七届蓝帽杯全国大学生网络安全技能大赛 蓝帽杯 2023]——Web方向部分题 详细Writeup
Web LovePHP 你真的熟悉PHP吗? 源码如下 <?php class Saferman{public $check True;public function __destruct(){if($this->check True){file($_GET[secret]);}}public function __wakeup(){$this->checkFalse;} } if(isset($_GET[my_secret.flag]…...
el-backtop返回顶部的使用
2023.8.26今天我学习了如何使用el-backtop组件进行返回页面顶部的效果,效果如: <el-backtop class"el-backtop"style"right: 20px; bottom: 150px;"><i class"el-icon-caret-top"></i></el-backtop&…...
Go 官方标准编译器中所做的优化
本文是对#102 Go 官方标准编译器中实现的优化集锦汇总[1] 内容的记录与总结. 优化1-4: 字符串和字节切片之间的转化 1.紧跟range关键字的 从字符串到字节切片的转换; package mainimport ( "fmt" "strings" "testing")var cs10086 s…...
C语言程序设计——小学生计算机辅助教学系统
题目:小学生计算机辅助教学系统 编写一个程序,帮助小学生学习乘法。然后判断学生输入的答案对错与否,按下列任务要求以循序渐进的方式分别编写对应的程序并调试。 任务1 程序首先随机产生两个1—10之间的正整数,在屏幕上打印出问题…...
SQL自动递增的列恢复至从0开始
在许多数据库管理系统中,当你删除表格中的所有数据时,自动递增的列(也称为自增列、标识列或序列)的计数器通常不会重置为 0。这是出于性能和数据完整性方面的考虑,以避免因删除数据而导致的自增列值冲突。即使你删除了…...
介绍一下CDN
CDN(内容分发网络,Content Delivery Network)是一个由多个服务器组成的分布式网络,它的目的是将内容高效地传送到用户。下面是CDN的工作原理及其主要特点: 内容分发:当用户首次请求某一特定内容时ÿ…...
2023年最新 Github Pages 使用手册
参考:GitHub Pages 快速入门 1、什么是 Github Pages GitHub Pages 是一项静态站点托管服务,它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件,(可选)通过构建过程运行文件,然后发布网站。 可…...
docker 安装 Nginx
1、下载 docker pull nginx:latest 2、本地创建管理目录 mkdir -p /var/docker/nginx/conf mkdir -p /var/docker/nginx/log mkdir -p /var/docker/nginx/html 3、将容器中的相应文件复制到管理目录中 /usr/docker/nginx docker run --name nginx -p 80:80 -d nginxdocke…...
【NLP的python库(01/4) 】: NLTK
一、说明 NLTK是一个复杂的库。自 2009 年以来不断发展,它支持所有经典的 NLP 任务,从标记化、词干提取、词性标记,包括语义索引和依赖关系解析。它还具有一组丰富的附加功能,例如内置语料库,NLP任务的不同模型以及与S…...
Java IDEA Web 项目 1、创建
环境: IEDA 版本:2023.2 JDK:1.8 Tomcat:apache-tomcat-9.0.58 maven:尚未研究 自行完成 IDEA、JDK、Tomcat等安装配置。 创建项目: IDEA -> New Project 选择 Jakarta EE Template:选择…...
leetcode316. 去除重复字母(单调栈 - java)
去除重复字母 题目描述单调栈代码演示进阶优化 上期经典 题目描述 难度 - 中等 leetcode316. 去除重复字母 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
