9.15日常记录

news/2024/9/18 21:51:59 标签: c++, 算法, 开发语言

1.今日复习

104.二叉树最大深度,100.相同的树(判断条件有误),226.翻转二叉树,101.对称二叉树(满足的四个条件1.左右不为空且值不相等2.左右为空3.左不为空,右为空4.左为空。右不为空)

2.简单实现string类的一部分功能

string的构造函数实现了用于初始化string的对象,并且重载了<<操作符,目的是为了让它能够直接打印string类型的字符串,这里要注意,在os输出流当中,我的string类型对象是无法直接访问到string类中的私有成员的,需要将这个重载函数置为string类的友元类,才可以访问到string类的私有成员。

class String {
private:
	char* m_buffer;
	unsigned int m_size;//无符号整形代表大于零的整数
public:
	String(const char* string) {// 实现字符串拷贝
		m_buffer = new char[m_size + 1];
		m_size = strlen(string);
		memcpy(m_buffer,string,m_size+1);
	}
	friend std::ostream& operator<<(std::ostream& os, const String string);
};
std::ostream& operator<<(std::ostream& os,const String string) {
	os << string.m_buffer;
	return os;
}

int main() {
	String string = "Cherno";
	String second = string;
	//string[2] = 'a';
	std::cout << string << std::endl;
	std::cout << second << std::endl;
	//std::cin.get();
}

 此时的代码是有潜在问题的,如果说我设置了析构函数,在执行析构函数的时候会造成二次析构(报错如上所示),(浅拷贝),所以我们应该调整一下,因为默认的拷贝构造函数是浅拷贝,所以我们应该显示的定义一下拷贝构造函数,

String(const String& other) :m_size(other.m_size) {//实现深拷贝的代码
	m_buffer = new char[m_size + 1];
	memcpy(m_buffer,other.m_buffer,m_size+1);
}

 在运行的过程中,我一直崩溃,最后发现原来是因为构造函数中我是这么写的

	String(const char* string) {// 实现字符串拷贝
        m_buffer = new char[m_size + 1];
		m_size = strlen(string);
		memcpy(m_buffer,string,m_size+1);
		m_buffer[m_size] = 0;
	}

 而实际上在m_buffer执行时,m_size还没有被初始化,所以要注意执行的顺序,当我调换完位置之后就可以正常运行了。

 最后整体代码如下:

class String {
private:
	char* m_buffer;
	unsigned int m_size;//无符号整形代表大于零的整数
public:
	
	String(const char* string) {// 实现字符串拷贝
		m_size = strlen(string);
		m_buffer = new char[m_size + 1];
		memcpy(m_buffer,string,m_size+1);
		m_buffer[m_size] = 0;
	}
	//String(const String& other) :m_buffer(other.m_buffer), m_size(other.m_size) {//默认拷贝构造

	//}
	char&  operator[](unsigned int index) {
		return m_buffer[index];
	}
	~String() {
		delete[] m_buffer;
	}
	String(const String& other) :m_size(other.m_size) {//实现深拷贝的代码
		m_buffer = new char[m_size + 1];
		memcpy(m_buffer,other.m_buffer,m_size+1);
	}
	friend std::ostream& operator<<(std::ostream& os, const String& string);
};
std::ostream& operator<<(std::ostream& os,const String& string) {
	os << string.m_buffer;
	return os;
}

int main() {
	String string = "Cherno";
	String second = string;

	string[2] = 'a';

	std::cout << string << std::endl;
	std::cout << second << std::endl;
	std::cin.get();
}

 简单介绍一下易错点:

String string=“cherno”
这里的=并不是赋值运算符,是初始化,表明String类对象string隐式调用以“cherno”为唯一参数的构造函数,这种隐式调用特性可通过explicit(在对应构造函数前)关键字关闭
String string;string=“cherno”
这里的=才是赋值运算符,一是重载赋值运算符,接受字符串类型赋值给类。二是如果存在以“cherno”为唯一参数的构造函数,并且没有explicit(即允许隐式调用),编译器将隐式调用该构造函数生成一个临时String类对象,并用这个临时对象给string赋值,此时调用的是以String类为参数重载,可以自定义,如果没有自定义,编译器会自动生成,不过是浅拷贝

3.explicit关键字的作用

1.在修饰构造函数时,可以防止隐式转换和复制初始化

2.在修饰转换函数时,可以防止隐式转换。


http://www.niftyadmin.cn/n/5664582.html

相关文章

深度学习的笔记

1. 从huggingface上仅下载pytorch模型权重和配置文件到服务器 import os import shutil from huggingface_hub import snapshot_download# 直接指定模型和下载路径 model_name openai/clip-vit-base-patch32 download_path /home/xxx/.cache/huggingface/hub/models--anas-a…

构建自己的文生图工具:Python + Stable Diffusion + CUDA

构建自己的文生图工具&#xff1a;Python Stable Diffusion CUDA 前言概述环境搭建安装PyTorch安装Stable Diffusion编写Python代码结论结语 前言 在这个数字化和人工智能飞速发展的时代&#xff0c;图像生成技术正逐渐成为现实。想象一下&#xff0c;只需输入几个关键词&…

VCC与GND之间电容起到什么作用?

一、VDD与GND之间并联多个电容 VDD与GND之间并联多个电容在电子电路中主要用于滤波、去耦和旁路等作用&#xff0c;以提高电路的稳定性和可靠性。 电源滤波 平滑电压&#xff1a;并联电容可以滤除电源中的杂波和交流成分&#xff0c;使直流电压更加平滑。这对于稳定电源输出非…

多旅行商问题:鹈鹕优化算法(Pelican Optimization Algorithm,POA)求解多仓库多旅行商问题MD-MTSP(提供Matlab代码)

一、鹈鹕优化算法 鹈鹕优化算法(Pelican Optimization Algorithm,POA)由Pavel Trojovsk和Mohammad Dehghani 于2022年提出&#xff0c;该算法模拟了鹈鹕在狩猎过程中的自然行为。 鹈鹕很大&#xff0c;喙很长&#xff0c;喉咙里有一个大袋子&#xff0c;用来捕捉和吞咽猎物。…

力扣之181.超过经理收入的员工

文章目录 1. 181.超过经理收入的员工1.1 题干1.2 准备数据1.3 题解1.4 结果截图 1. 181.超过经理收入的员工 1.1 题干 表&#xff1a;Employee -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | | salary | int | | mana…

实战讲稿:Spring Boot整合MyBatis

文章目录 实战讲稿&#xff1a;Spring Boot整合MyBatis课程目标课程内容1. 创建员工映射器接口1.1 创建子包1.2 创建接口 2. 测试员工映射器接口2.1 自动装配员工映射器2.2 测试按标识符查询员工方法2.3 测试查询全部员工方法2.4 测试插入员工方法2.5 测试更新员工方法2.6 测试…

2022年十九届中国研究生数学建模竞赛C题——优秀论文分析

● 引言&#xff1a;因为最近要参加研究生数学建模竞赛了&#xff08;第二十一届&#xff09;&#xff0c;学习和分析一下优秀的数模论文的&#xff1a;思路、写作。 虽然我说是 “优秀论文分析”&#xff0c;但其实更多是 “搬运” 哈哈哈… ✅ NLP 研 1 选手的学习笔记 笔者…

mysql把某一个字段的值中的aa,替换成bb

UPDATE my_table SET my_column REPLACE(my_column, aa, bb); 例 假设my_table表在替换前的数据如下&#xff1a; idmy_column1hello aa2world aa aa3no aa here 执行上述UPDATE语句后&#xff0c;my_table表的数据将变为&#xff1a; idmy_column1hello bb2world bb b…