一文详解C++运算符重载【自己动手封装一个xxx,2024年最新12个View绘制流程高频面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
img

正文

五、赋值运算符与成员函数的密不可分

===================================================================================

在这里插入图片描述

代码实现


代码如下:

#include

#include

using namespace std;

class qwe123 {

private:

int lenth;

char* Fhao;

public:

qwe123() {

cout << “我是构造函数,但我不会初始化” << endl;

}

qwe123(char a[]) {//赋值操作重载实际上是深拷贝

this->lenth = strlen(a)+1;

// this->Fhao = a;//错误写法在此没有给this->指向的空间开辟内存不能在下面delete;

this->Fhao = new char[this->lenth];//在堆区给this-》申请一块空间

strcpy_s(Fhao, lenth, a);//将a数组中的东西拷贝到Fhao数组内

}

void print() {

cout << this->Fhao << endl;

}

qwe123& operator=(qwe123 &a);

~qwe123() {//析构函数无论对象有无初始化,无论对象怎样初始化,创建了对象就一定会析构

//所以析构函数判断如何析构对象的标准应是每一个对象的特征;

if (this->Fhao != NULL) {//有初始化的对象析构方式;因为创建对象时手动申请了内存

delete[] this->Fhao;//所以就在析构时手动关闭;

this->lenth = 0;

cout << “这里是析构函数,over” << endl;

}

else {//没有初始化对象的析构方式

cout << “这里是没有被初始化的对象被析构了” << endl;

}

}

};

qwe123& qwe123::operator=(qwe123 &a) {//赋值操作符的重载与深拷贝原理相同

if (this->Fhao != NULL) {

delete [] Fhao;//delete之前要有空间,如果是系统自己分配的空间就不能用delete

this->lenth = 0;

}

this->lenth = strlen(a.Fhao) + 1;

this->Fhao = new char[this->lenth];

strcpy_s(Fhao,this->lenth,a.Fhao);

return *this;

}

int main() {

char pp[] = “I am big man”;

char dd[] = “I am very kkl”;

qwe123 a1(pp),a2(dd),a3;

a1.print();

a1 = a2;

a2.print();

return 0;

}

六、索引运算符与等号不等号运算符

==================================================================================

在这里插入图片描述

代码实现


代码如下:

//流运算符,赋值运算符,下标运算符,等号不等号运算符的重载

#include

using namespace std;

class MyClass

{

public:

MyClass(int a,int b);

MyClass(char a[]);

~MyClass();

friend ostream& operator<<(ostream &out, MyClass& a);

bool operator==(MyClass& a);

bool operator!=(MyClass& a);

char& operator[](int i);

MyClass& operator=(MyClass& a);

void print() {

cout << (*this)[4] << endl;//运行成功实例,这里的(*this)等效于一个对象;

cout << "哟西 " << this->p<<endl ;

}

void printp(MyClass& a) {

int i = 0;

i = strlen(a.p) + 1;

for (int j = 0;j < i;j++) {

cout << a[j] << " ";

}

}

private:

int a;

int b;

int len;

char* p;

};

MyClass::MyClass(char a[]) {

this->len = strlen(a)+1;

this->p = new char[this->len];

strcpy_s(this->p, this->len, a);

}

MyClass::MyClass(int a=0,int b=0)

{

this->a = a;

this->b = b;

}

MyClass::~MyClass()

{

if (this->p != NULL) {

delete[] p;

}

cout << “这里是析构函数,over,over” << endl;

}

ostream& operator<<(ostream &out,MyClass &a) {//重载了输出流操作符

out << a.a << “” << a.b << endl;

return out;

}

MyClass& MyClass::operator=(MyClass &a) {

if (this->p != NULL) {

delete[] p;

this->len = 0;

}

this->len = strlen(a.p) + 1;

this->p = new char[this->len];

strcpy_s(this->p, this->len, a.p);

return *this;

}

//等号与不等号均只拿类里面一个成员变量(len)展开来说;

bool MyClass::operator==(MyClass& a) {//等号操作符重载;

if (this->len == a.len) {

return true;

}

else return false;

}

bool MyClass::operator!=(MyClass& a) {//不等号操作符重载;

if (this->len != a.len) {

return true;

}

else return false;

}

char& MyClass::operator[](int i) {//调用方式:对象名[]//得到的东西可以经过操作设置,

//在这里得到的是字符数组里面的某个字符

//cout << “this ok”<<endl;这句话用于测试该函数有没有被调用;

return (this->p)[i];//this->p代表this对象里面的一个成员变量,在这里是一个字符数组

//并且在这里return 时调用了默认的[]操作函数

}

int main_HH() {

char aa[] = “I am big shuai” ;

char bb[] = “I am zhu zhi chong”;

char dd[] = “Shuai bi”;

MyClass a1(1, 2), a2(3, 4);

MyClass b1(aa), b2(bb),b3(dd);

cout << a1 << a2;

b1 = b2=b3;//经过这里赋值函数之后,b1,b2,b3的len均相等;

// b1.print();

// b1.printp(b1);

cout << b1[4] << endl;//成功将对象里面的字符拿出来,并调用了重载的[]函数

if (b1 == b2) {//b1b2相等调用了这里

cout << “等号函数,重载成功over” << endl;

}

if (b1 != a1) {//b1,.a1的len不相等所以这里也进行了输出

cout << “这里是不等号,over” << endl;

}

return 0;

}

七、小括号与逻辑运算符

=============================================================================

在这里插入图片描述

代码实现


代码如下:

#include

using namespace std;

class XLJ {

private:

int a;

int b;

public:

XLJ(int a=0, int b=0) {

this->a = a;

this->b = b;

cout << “这里是,构造” << endl;

}

void print() {

cout << “a:” << a << “b:” << b<<endl;

}

int operator()(int a, int b);

bool operator&&(XLJ& a) {//两个对象重的a都为0

if (this->a == 0 && a.a == 0) {

return true;

}

else {

return false;

}

}

bool operator||(XLJ& a) {//逻辑或只要两个对象里面有一个a是0就为真;

if (this->a == 0 || a.a == 0) {

return true;

}

else return false;

}

};

int XLJ::operator()(int a=0, int b=0) {

cout << “这里调用了,小括号运算符” << endl;

return a + b;

}

int main() {

XLJ a1(1, 2),a2,a3;//构造时调用的是构造函数;

a1.print();//构造出来对象后再用()就调用括号运算符

cout << a2(3,4) << endl;

cout << a1(1, 2) << endl;

if (a1 && a2) {

cout << “this cure &&” << endl;

}

if (a1 || a2) {

cout << “this || 运算” << endl;

}

if (a3 && a2) {

cout << “this && victor” << endl;

}

return 0;

}

八、不等号运算符重载

============================================================================

可以根据需求对大于小于运算符进行重载;

这样可以很直观的对比出来两个对象的某一特征,找出哪个更胜一筹;

成员函数语法 bool operator(类名 &对象名){函数体进行对象的某一特征进行比较};

友元函数语法 bool operator(类名 &对象名,类名 &对象名){函数体同上};

代码实现


代码如下:

//大于小于运算符重载

//判断条件运算符返回值一般就0,1两种;

//并且符合返回1,也就是真,因为调用的场景一般就是if语句:

//if语句中只有判断条件为真才会执行代码块里面的语句;

//如果if语句为真那么下面附属的else 语句将不再执行;

#define _CRT_SECURE_NO_WARNINGS

#include

using namespace std;

class MyClass1

{

public:

MyClass1(char* b);

~MyClass1();

bool operator<(MyClass1& a);

bool operator>(MyClass1& a);

bool operator<=(MyClass1& a);

bool operator>=(MyClass1& a);

private:

int a;

char* m_p;

};

MyClass1::MyClass1(char *b)

{

a = strlen(b) + 1;

m_p = new char[a];

strcpy(m_p, b);

}

MyClass1::~MyClass1()

{

if (this->m_p != NULL) {

delete[] m_p;

a = 0;

cout << “这里是析构函数,over” << endl;

}

}

bool MyClass1::operator<(MyClass1& a) {//bool类型非零即1,strcmp()函数有三种返回值正,零,负数;

//也就是说,如果直接返回strcmp得到的结果肯定不正确:

//return strcmp(this->m_p, a.m_p);//(错误写法);

int k;

k = strcmp(this->m_p, a.m_p);

if (k > 0) {

return false;

}

else if (k < 0) {

return true;

}

}

bool MyClass1::operator<=(MyClass1& a) {

int k = 0;

k = strcmp(this->m_p, a.m_p);

if (k <= 0) {

return true;

}

else {

return false;

}

}

bool MyClass1::operator>(MyClass1& a) {

return !(this < a);//用<号,对>运算符重载进行简化;如果this<a那么两者就不满足>直接返回与

}//小于操作符的返回值也就是 !(*this<a);

bool MyClass1::operator>=(MyClass1& a) {

return !(*this <= a);

}

int main_DX() {

char aa[] = “aaaaa”;

char dd[] = “bb2222”;

MyClass1 a1(aa), a2(dd);

if (a1 > a2) {

cout << “这里是大于号” << endl;

}

if (a1 < a2) {

cout << “这里是小于号” << endl;

}

if (a1 <= a2) {

cout << “这里是小于等于号” << endl;

}

if ( a2>=a1 ) {

cout << “这里是大于等于号” << endl;

}

return 0;

}

九、综合小练习与类的分文件管理

=================================================================================

对含有字符串的对象进行赋值,下标不等号等号以及输入输出流运算符进行重载;

⚠️类定义的头文件 mystring.h


只有类的属性与方法的声明

#pragma once

#include

using namespace std;

class mystring

{

private:

int lenth;

char* p;

public:

mystring();

mystring(char *q);//构造

mystring(mystring &q);//拷贝构造

~mystring();//析构函数

mystring& operator=(mystring& q);//赋值操作符的重载;

char& operator[](int i);//下标运算符重载

bool operator==(mystring &q);//等号运算符重载

bool operator!=(mystring &q);//不等号运算符重载

bool operator<(mystring& q);//小于运算符重载

bool operator <= (mystring & q);//小于等于

bool operator>(mystring& q);//大于

bool operator>=(mystring& q);//大于等于

friend ostream& operator<<(ostream& out,mystring &q);//输出流

friend istream& operator>>(istream& in, mystring& q);//输入流

};

⚠️类实现的文件 mystring.cpp


对前面类的声明中的方法进行了实现。

#define _CRT_SECURE_NO_WARNINGS

#include “mystring.h”

#include

using namespace std;

ostream& operator<<(ostream& out, mystring& q) {//输出流

out << q.p << endl;

return out;

}

istream& operator>>(istream& in, mystring& q) {//输入流

cin >> q.p;

q.lenth = strlen(q.p) + 1;

return in;

}

char& mystring::operator[](int i) {//下标运算符重载

return this->p[i];

}

bool mystring::operator==(mystring & q) {//等号运算符重载(字符串里面的内容是否相同为判断标准)

if (this->lenth != q.lenth) {

return false;

}

else {

return !strcmp(this->p, q.p);//相同为为零,但相同时返回值应为1所以是!strcmp(this->p,q.p);

}

}

bool mystring::operator!=(mystring & q) {//不等号运算符重载----利用==重载函数;

return !(*this == q);

}

bool mystring::operator<(mystring & q) {//小于运算符重载以P(字符串里面的ASCLL值)为判断标准

int k = 0;

k = strcmp(this->p, q.p);

if (k < 0) {

return true;

}

else if (k > 0) {

return false;

}

}

bool mystring::operator <= (mystring & q) {//小于等于

int k = 0;

k = strcmp(this->p, q.p);

if (k <= 0) {

return true;

}

else if (k > 0) {

return false;

}

}

bool mystring::operator>(mystring & q) {//大于

return !(*this<q);

}

bool mystring::operator>=(mystring & q) {//大于等于

return !(*this<=q);

}

mystring &mystring::operator=(mystring& q){//赋值运算符重载;

if (this->p != NULL) {

delete[] this->p;

this->lenth = q.lenth;

this->p = new char[this->lenth];

strcpy(this->p, q.p);

}

else {

this->lenth = 0;

p = new char[this->lenth + 1];

strcpy(p, “”);

}

return *this;

}

mystring::mystring() {

}

mystring::mystring(char *q) {//传进来字符数组的构造函数

if (q == NULL) {

this->lenth = 0;

p = new char[this->lenth + 1];

strcpy(p, “”);

}

else {

this->lenth = strlen(q) + 1;

p = new char[this->lenth];

strcpy(p, q);

}

}

mystring::mystring(mystring& q) {//拷贝构造函数

this->lenth = strlen(q.p) + 1;

p = new char[this->lenth];

strcpy(p, q.p);

}

mystring::~mystring() {

if (this->p != NULL) {

delete[] this->p;

this->lenth = 0;

}

}

⚠️使用类的文件 testmain.cpp


测试分文件后实现类的效果【引入自己封装好的.h文件】

#include

#include"mystring.h"

using namespace std;

int main() {//测试区;

char aa[] = “I am a boy”;

char dd[] = “I am ZSC”;

mystring a1(aa),a2(dd),a3(aa);

if (a1 > a2) {

cout << “大于号” << endl;

最后

Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

👉Python所有方向的学习路线👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉Python必备开发工具👈

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

👉Python全套学习视频👈

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

👉实战案例👈

学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。

因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。

👉大厂面试真题👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

👉Python必备开发工具👈

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

👉Python全套学习视频👈

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

👉实战案例👈

学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。

因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。

👉大厂面试真题👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
[外链图片转存中…(img-3v6tCWjT-1713442284216)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值