cpp学习笔记1--class

2年前学过cpp,但是一直没有用到,现在要读研了,终于要用到了,重新拿出来看一看,觉得很多东西都能在c和python上看到影子。

#include "iostream"
class Person {
private:std::string name;int age;public:// 默认构造函数Person() : name("Unknown"), age(0) { std::cout << "init 1" << std::endl; }// 带参数的构造函数Person(const std::string& n, int a) : name(n), age(a) { std::cout << "init 2" << std::endl; }// 拷贝构造函数Person(const Person& other) : name(other.name), age(other.age) { std::cout << "init 3" << std::endl; }// 析构函数~Person() {std::cout << name << "对象被销毁" << std::endl;}void introduce() {std::cout << "我叫" << name << ",今年" << age << "岁。" << std::endl;}void change(std::string new_name,int new_age) {name = new_name;age=new_age;std::cout << "changing is over" << std::endl;}
};

我来逐行解析一下。

首先私有变量是只有此类的此实例对象的公开区域的函数能调用的(后面还会有其他区域也能调用),也就是Person p1;Person p2;p2的pubilc函数不能调用p1的age,但是可以调用自己的,外部程序也无法直接访问age

Person p1;
Person p2;
p1.introduce();
p2.introduce();
p2.change("Trump", 72);//p2可以改变自己的age
p2.introduce();
p2.age=10;//错误用法

然后public的第一个构造函数。它相当于python里的self.init,是用来初始化私有变量的,name("unknown")就是给name赋值"unknown"。第一个初始化初始的是默认值,不需要传入参数,也不需要括号。而public的第二个带参数的构造函数就需要了,两者都只能初始化一次。

Person p1;
int x = 13;
std::string name = "Mike";
Person p2(name, x);
p2("x", 1);//常量、变量都可以,但不可重复初始化

我定义的这个name是string型,在构造函数里应该就是const std::string& n=name,这在c里是不合法的,因为n和name的类型不同,但在cpp里这表示拷贝,那n和name地址是否一样呢?验证一下

Person(const std::string& n, int a) : name(n), age(a) { std::cout << "init 2 "<<&n <<" " << &name << std::endl; }int x = 13;
std::string name = "Mike";
std::cout << &name << std::endl;
Person p1(name, x);

输出结果:

000000D8230FFA70
init 2 000000D8230FFA70 000000D8230FFA90

说明Person之前的name和Person里的n是同地址的,而Person里的n和name是不同的,这是因为第一个name是在main里定义的,第二个name是Person的一个private变量,改成std::string xname = "Mike";就好理解了。

接下来的拷贝构造函数是什么呢?如下图,很明显,它也是一个拷贝,那么&p3==&p4?当然不是。Person(const Person& other),&p3==&other是成立的,而p4是一个新创建的Person,所以地址不同,Person p4=p3,也是可以直接调用这个拷贝函数的。

int x = 13;
std::string name = "Mike";
Person p3(name, x);
Person p4(p3);
std::cout << "p3 address " << &p3 << std::endl;
std::cout << "p4 address " << &p4 << std::endl;

既然p3,p4地址都不同,那么拷贝之后再变化p3,p4也是不会跟着变化的。

同理我们可以直接如下使用拷贝,显然,p2=p1会调用之前构造的拷贝函数,但是&p3=p2不会,最后&p3==&p2,但不等于&p1

Person p1;
Person p2=p1;
Person &p3 = p2;
Person &p3 = &p2;//不符合拷贝用法,不能传入地址
std::cout << "p1 address " << &p1 << std::endl;
std::cout << "p2 address " << &p2 << std::endl;
std::cout << "p3 address " << &p3 << std::endl;

还有需要注意的是,初始化之后再改变x,p2的age也不会变。

int x = 13;
std::string name = "Mike";
Person p2(name, x);
p2.introduce();
x++;
p2.introduce();

最后是析构函数,是在Person的生命周期结束时自动调用的,也可以手动调用,会释放内存。它们是在栈区的,以p1,p2,p3创建 ,就会以p3,p2,p1自动释放。

Person p1;
Person p2=p1;
Person &p3 = p2;
std::cout << "p1 address " << &p1 << std::endl;
std::cout << "p2 address " << &p2 << std::endl;
std::cout << "p3 address " << &p3 << std::endl;
//p1.~Person();
p2.introduce();
p3.introduce();
p2.change("mike", 23);
p2.introduce();
p3.introduce();

而这个的p3和p2只会释放一次

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

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

相关文章

基于YOLOv的目标检测训练数据构建方法研究—图像采集、标注、划分与增强一体化流程设计

在目标检测任务中,高质量的训练数据是模型性能提升的关键。本文围绕 YOLOv 系列模型,系统性地研究了目标检测训练数据的构建方法,提出了一套从图像采集、标注、数据集划分到数据增强的一体化流程设计 。通过多源图像采集策略确保样本多样性,结合 LabelImg 工具完成 VOC 格式…

SQL数据库操作大全:从基础到高级查询技巧

大家好&#xff0c;欢迎来到程序视点&#xff01;我是你们的老朋友.小二&#xff01; SQL数据库操作核心语法精要 数据库基础操作 创建/删除数据库&#xff1a;CREATE DATABASE / DROP DATABASE 备份SQL Server&#xff1a;使用sp_addumpdevice和BACKUP DATABASE命令 数据库…

[2025]MySQL的事务机制是什么样的?redolog,undolog、binog三种日志的区别?二阶段提交是什么?ACID怎么保证的?主从复制的过程?

MySQL事务机制与日志系统详解 一、MySQL事务机制 1. 事务特性&#xff08;ACID&#xff09; 特性实现机制原子性(Atomicity)undo log回滚,(事务作为一个整体被执行&#xff0c;包含在其中的对数据库的操作要么全部被执行&#xff0c;要么都不执行)。一致性(Consistency)约束…

LLama-v2 权重下载

地址&#xff1a;llama模型 官方github仓库&#xff1a;llama仓库 注意点 网络代理位置&#xff1a;美国下面的国家选择 United States 克隆仓库后 运行bash download.sh输入邮箱收到的URL选择要下载的权重等待下载完成即可 有问题留言&#xff01;&#xff01;&#xff01…

zephyr OS架构下构建Nordic MCU boot

目录 概述 1. 软硬件环境 1.1 软件开发环境 1.2 硬件环境 2 MCU boot 2.1 核心功能 2.2 关键术语 2.3 重要字段介绍 3 VS-Code下创建MCU-BOOT项目 3.1 软件框架结构 3.2 创建测试项目 3.3 编译项目 3.3 固件在Flash中的分布 4 验证 4.1 烧写固件 ​ 4.2 代码…

【Mytais系列】介绍、核心概念

MyBatis 是一款优秀的 持久层框架&#xff0c;它通过简化 JDBC 操作、提供灵活的 SQL 映射能力&#xff0c;成为 Java 开发中处理数据库交互的核心工具之一。以下是 MyBatis 的核心框架和概念解析&#xff1a; 一、MyBatis 框架概述 1. 核心定位 作用&#xff1a;将 Java 对象…

IO模型和多路复用

一、IO模型的基础理解 什么是IO? IO全称是 Input/Output(输入/输出),在计算机科学里主要指程序与外部设备(硬盘、网络、用户终端等)进行数据交换的操作。首要特点是: IO通常很慢(从CPU和内存的视角看)经常需要等待外部设备响应1. 为什么要谈IO模型? 当一个程序需要…

深入理解 Bash 中的 $‘...‘ 字符串语法糖

在 Bash 脚本编程中&#xff0c;字符串处理是不可或缺的一部分。为了让开发者更高效地处理特殊字符和控制字符&#xff0c;Bash 引入了一种独特的字符串语法糖&#xff1a;$&#xff08;带单引号的 ANSI-C 风格字符串&#xff09;。这种语法来源于 C 语言的 ANSI-C 标准&#x…

用Python打造自己的专属命令行工具

在日常的开发和使用过程中&#xff0c;我们常常会编写一些实用的Python脚本&#xff0c;比如用来批量处理文件、获取系统信息等。然而&#xff0c;每次都要输入python script_name.py来运行脚本&#xff0c;时间一长难免觉得繁琐。要是能像使用系统自带的命令&#xff08;如ls、…

【KWDB 创作者计划】KWDB 2.2.0多模融合架构与分布式时序引擎

KWDB介绍 KWDB数据库是由开放原子开源基金会孵化的分布式多模数据库&#xff0c;专为AIoT场景设计&#xff0c;支持时序数据、关系数据和非结构化数据的统一管理。其核心架构采用多模融合引擎&#xff0c;集成列式时序存储、行式关系存储及自适应查询优化器&#xff0c;实现跨模…

学习Linux的第二天

如何在Linux环境下做开发 Linux的一些基操 Tips&#xff1a;平常最表层的是命令行模式&#xff0c;最多见这个默认叫做命令行模式 Vi操作是什么意思呢 就是在提示符输入vi a.c 是可以创建一个a.c这个文件并进入这个输入模式 按i可以输入代码 要退出的时候按esc 再按:(冒号…

链表操作练习

要求 现在有一个双向链表&#xff0c;里面要保存歌曲的名字&#xff1b;例如 蔡琴/渡口.mp3 我们把它定义在一个link.h文件中。 #ifndef LINK_H #define LINK_H #include <stdlib.h> #include <stdio.h> #include <string.h>typedef struct Node {//保存歌…

MATLAB制作散点图:从基础到进阶的三种类型讲解

一、什么是散点图 散点图是一种用来展示两个或多个变量之间关系的图表形式。它可以帮助我们直观地观察变量之间是否存在相关性、趋势或异常值&#xff0c;常用于数据分析的初步探索阶段。 二、三种类型散点图 1. 基本二维散点图&#xff1a;最简单、最常用 基本二维散点图的…

模块方法模式(Module Method Pattern)

&#x1f9e0; 模块方法模式&#xff08;Module Method Pattern&#xff09; 模块方法模式是一种结构型设计模式&#xff0c;它将复杂的操作分解成一系列相对简单、独立且单一职责的模块。每个模块负责完成一种具体的操作&#xff0c;其他模块或系统可以通过调用这些模块的公开…

Python中的JSON库,详细介绍与代码示例

目录 1. 前言 2. json 库基本概念 3. json 的适应场景 4. json 库的基本用法 4.1 导 json入 模块 4.2 将 Python 对象转换为 JSON 字符串 4.3 将 JSON 字符串转换为 Python 对象 4.4 将 Python 对象写入 JSON 文件 4.5 从 JSON 文件读取数据 4.6 json 的其他方法 5.…

网狐旗舰大联盟组件源码私测笔记:结构分层、UI重构与本地实操全流程

作为一套衍生于传统网狐架构的源码版本&#xff0c;大联盟这套源码组件可谓是在经典基础上进行了深度重塑。与老版死板的框架风格不同&#xff0c;它不仅对界面做了大刀阔斧的重构&#xff0c;还在组件层级的组织上做了优化。本文将基于一整套源码进行深度解析&#xff0c;强调…

STM32 PulseSensor心跳传感器驱动代码

STM32CubeMX中准备工作&#xff1a; 1、设置AD 通道 2、设置一个定时器中断&#xff0c;间隔时间2ms&#xff0c;我这里采用的是定时器7 3、代码优化01 PulseSensor.c文件 #include "main.h" #include "PulseSensor/PulseSensor.h"/******************…

C++项目容易犯错的点

1. 矩阵q要先定义大小&#xff0c;再赋值。不可以直接赋值。下面这种方式是错误的Eigen::MatrixXd q&#xff1b;q<<1,2&#xff1b;正确的这样的&#xff1a; Eigen::MatrixXd q(2,1); q<<1.4, 1.5; 2. 不要重复加载variables.h头文件&#xff0c;这样变量会被…

在阿里云 Ubuntu 24.04 上部署 RabbitMQ:一篇实战指南

前言 RabbitMQ 是业界常用的开源消息中间件,支持 AMQP 协议,易于部署、高可用、插件丰富。本文以阿里云 ECS 上运行的 Ubuntu 24.04 LTS 为例,手把手带你完成 RabbitMQ 从仓库配置到运行的全流程,并分享在国内环境下常见的坑与对应解决方案。 环境概况 操作系统:Ubuntu …

【论文笔记】SOTR: Segmenting Objects with Transformers

【题目】&#xff1a;SOTR: Segmenting Objects with Transformers 【引用格式】&#xff1a;Guo R, Niu D, Qu L, et al. Sotr: Segmenting objects with transformers[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 7157-7166. 【网…