C++基础11-类和对象之操作符重载2

总结:

1、等号操作符重载和拷贝构造函数重载一般用在数据成员中需要单独在堆区开辟内存时(指针)
2、new,delete重载内部还是使用malloc和free
3、逗号表达式(,)、或者(||),且(&&),条件表达式(?:)具有短路功能。
      但重载后失去此功能,故不建议重载这两个运算符
4、自定义智能指针auto_ptr(在c++11新特性中已经被移除)是一个模板类。
      可以自动被回收,自动释放

等号操作符重载:
 

#if 1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>using namespace std;class Student {
public:Student() {this->id = 0;this->name = NULL;}Student(int id, char *name) {this->id = id;//this->name = name; 浅拷贝 错误this->name = new char[strlen(name) + 1];//this->name = name;  赋值错误strcpy(this->name, name);}Student(const Student& another) {this->id = another.id;//深拷贝this->name = new char[strlen(another.name) + 1];strcpy(this->name, another.name);}Student& operator=(const Student& another) {if (this == &another)  //防止自身赋值return *this;//先将自身的额外开辟的空间回收掉if (this->name != NULL) {delete this->name;this->name = NULL;this->id = 0;}//执行深拷贝this->id = another.id;this->name = new char[strlen(another.name) + 1]; strcpy(this->name, another.name);return *this;}void printS() {cout << "id:"<<this->id << " name:" << this->name << endl;}~Student() {if (this->name != NULL) {delete this->name;this->name = NULL;this->id = 0;}}
private:int id;char *name;
};void test01() {Student s1(1, "zhangdan");Student s2 = s1; //调用拷贝构造s2.printS();Student s3(2,"lisi");s2 = s1;  //赋值操作符 默认的赋值操作符为浅拷贝 只是简单的指针指向 //两次析构 其中一次为空s2.printS();
}
/*
id:1 name:zhangdan
id:1 name:zhangdan
*/
int main()
{test01();return 0;
}
#endif

 new和delete操作符重载:

#if 1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>using namespace std;class A
{
public:A(){cout << "A()..." << endl;}A(int a) {cout << "A(int)..." << endl;this->a = a;}//重载的new操作符 依然会触发对象的构造函数void* operator new(size_t size) {cout << "重载new操作符" << endl;return malloc(size);}void* operator new[](size_t size) {cout << "重载new[]操作符" << endl;return malloc(size);}void operator delete(void *p) {cout << "重载了delete操作符" << endl;if (p != NULL) {free(p);p = NULL;}}void operator delete[](void *p) {cout << "重载了delete[]操作符" << endl;if (p != NULL) {free(p);p = NULL;}}~A() {cout << "~A().... " << endl;}private:int a;
};
void test01() {int *value_p = new int;A *ap = new A(10);//等价于//ap->operator new(sizeof(A));delete ap;
}
/*
重载new操作符
A(int)...
~A()....
重载了delete操作符
*/
void test02() {int *array = (int *)malloc(sizeof(int) * 80);A *array_p = new A[5];//等价于//array_p->operator new[](sizeof(A[5]));delete[] array_p;
}
/*
重载new[]操作符
A()...
A()...
A()...
A()...
A()...
~A()....
~A()....
~A()....
~A()....
~A()....
重载了delete[]操作符*/
int main(void)
{test01();cout << "test02" << endl;test02();return 0;
}
#endif

&&和||操作符重载(不建议使用,使用了短路功能):

#if 1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>using namespace std;class Test
{
public:Test(int value) {this->value = value;}Test operator+(Test &another){cout << "执行了+操作符重载" << endl;Test temp(this->value + another.value);return temp;}bool operator&&(Test &another){cout << "执行了&&操作符重载" << endl;if (this->value && another.value) {return true;}else {return false;}}bool operator||(Test &another){cout << "重载了||操作符" << endl;if (this->value || another.value) {return true;}else {return false;}}~Test() {cout << "~Test()..." << endl;}
private:int value;
};
void test01() {Test t1(0);Test t2(20);//重载&&操作符,并不会发生短路现象。if (t1 &&  t2) {	//t1.operator&&(t2)cout << "为真" << endl;}else {cout << "为假" << endl;}
}
/*
执行了&&操作符重载
为假
~Test()...
~Test()...
*/
void test02() {int a = 0;int b = 20;if (a && (a = 10)) {  //a为0的话,a+b 就不会执行  短路cout << "true" << endl;}cout << "a:" << a << endl;Test t1(0);Test t2(20);//重载&&操作符,并不会发生短路现象。if (t1 && (t1 + t2)) {	//t1.operator&&(t1.operator+(t2))cout << "为真" << endl;}else {cout << "为假" << endl;}
}
/*
a:0
执行了+操作符重载
~Test()...
执行了&&操作符重载
~Test()...
为假
~Test()...
~Test()...
*/
void test03() {Test t1(0);Test t2(20);//重载||操作符,并不会发生短路现象if (t1 || (t1 + t2)) {//t1.operator||(  t1.operator+(t2) )cout << "为真" << endl;}else {cout << "为假" << endl;}
}
/*
执行了+操作符重载
~Test()...
重载了||操作符
~Test()...
为真
~Test()...
~Test()...
*/
int main(void)
{int a = 1;int b = 20;test01();cout << "test02" << endl;test02();cout << "test03" << endl;test03();return 0;
}
#endif

自定义智能指针(stl中模板类,指针用完自动回收,不需要手动delete):

#if 1
#include<iostream>
using namespace std;
#include<memory>
//智能指针是自动被回收,自动释放
//只能指针是一个模板类
class A
{
public:A(int a){cout << "A()..." << endl;this->a = a;}void func() {cout << "a = " << this->a << endl;}~A() {cout << "~A()..." << endl;}
private:int a;
};void test01() {int *p = new int;*p = 20;delete p;
}
void test02() {//int *p = new int;//等价于auto_ptr<int> ptr(new int);*ptr = 100;
}
void test03() {
#if 0A* ap = new A(10);ap->func();(*ap).func();delete ap;
#endif//等价于auto_ptr<A> ap(new A(10));ap->func();(*ap).func();  //智能指针用完后 自动回收 调用析构函数
}
/*
A()...
a = 10
a = 10
~A()...
*/
class MyAutoPtr {
public:MyAutoPtr(A* ptr) {this->ptr = ptr; //ptr=new A(10)}~MyAutoPtr() {if (this->ptr != NULL) {cout << "delete ptr" << endl;delete ptr;ptr = NULL;}}A* operator->() {return this->ptr;}A& operator*(){return *ptr;  //*ptr表示返回对象本身}
private:A *ptr;  //内部指针
};
void test04() {MyAutoPtr myp(new A(10));myp->func();  //myp.ptr->func()(*myp).func();//*ptr.func()
}
/*
A()...
delete ptr
~A()...
*/
int main(void) {//test02();//test03();test04();return 0;
}
#endif

 

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

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

相关文章

linux照片备份软件,Linux、Unix上5个惊艳开源备份软件

Linux和类Unix系统上5个惊艳的开源备份软件&#xff1a;Bacula、Amanda、Backupninja、Backuppc和UrBackup&#xff0c;这些都是既可以使用在Linux上也可以使用在Unix上面&#xff0c;他们的优点就是性能稳定&#xff0c;使用灵活。一个好的备份计划是非常必要的&#xff0c;这…

C/C++混淆点-运算符短路

主要内容如下&#xff1a; 按照C/C标准 1.9.18 节的说明&#xff0c;||,&&,?:三目运算符和逗号运算符采用短路运算&#xff0c;第一个表达式之后作为一个运算顺序点。 1 a && b; 2 a || b; 3 a ? b : c; 4 a, b; 短路运算仅对内置的行为有效&#xff0c;如…

C++基础12-类和对象之操作符重载-string练习

总结&#xff1a; 1、等号操作符重载注意事项&#xff1a; &#xff08;1&#xff09;防止自身赋值 &#xff08;2&#xff09;先将自身的额外开辟的空间回收掉 &#xff08;3&#xff09;执行深拷贝 2、注意函数的返回引用或者元素&#xff1a;如果需要连续使用 …

linux中类似findfirst的函数,findfirst函数的用法

函数名称: findfirst函数原型: int findfirst(char *fname,struct ffblk *ptr,int attrib)函数功能: 寻找与fname相匹配的第一个文件名称函数返回:参数说明: ptr-保存查找到的文件信息所属文件: #include #include int main(){struct ffblk ffblk;int d…

C/C++混淆点-逗号运算符

在C中&#xff0c;逗号是很常用的。作为一个运算符它虽然不常用&#xff0c;但我们也应该学会它的用法。 1.如&#xff1a;a3*4,4*5,5*6; 由于“”的优先级高于“&#xff0c;”&#xff0c;所以程序从左向右运行&#xff0c;即先运行a3*4。之后的4*5&#xff0c;5*6仅仅运行&a…

linux 添加重定向域名,Linux系统中Nginx的安装并进行域名认证和重定向

Linux系统中Nginx的安装并进行域名认证和重定向本文主要介绍Linux系统中Nginx的安装并进行域名认证和重定向&#xff0c;希望通过本知识点的讲解对大家今后的学习和工作有所帮助&#xff0c;下面进行具体介绍&#xff1a;12.6 Nginx安装cd /usr/local/srcwget http://nginx.org…

C/C++混淆点-转义字符

从表中可以看出&#xff0c;在C语言中有三种转义字符&#xff0c;它们是&#xff1a;一般转义字符、八进制转义字符和十六进制转义字符。 所有的转义字符只代表一个字符 1. 一般转义字符 这种转义字符&#xff0c;虽然在形式上由两个字符组成&#xff0c;但只代表一个字符。…

linux如何安装python环境变量中,Windows和linux环境下python安装及环境变量的配置

安装包的安装无需双版本存在情况下安装1)下载源码包2)解压源码包并进入文件夹./configure ; make && make install3)使用python -V查看是否安装成功&#xff0c;安装成功会显示python版本信息需要双版本安装python版本1)同上&#xff0c;需要下载3.6源码包2)解压源码包…

C/C++混淆点-strcat和strcpy区别

一、原因分析 假设&#xff1a; char * strNULL; strnew char[11];你想为字符串str开辟一个存储十个字符的内存空间&#xff0c;然后你现在有两个字符串&#xff1a;char * c1"abc"和char * c2"123";你想将这两个字符串都拼接在str字符串中&#xff0c;你…

linux有读EC RAM的工具吗,Step to UEFI (179)Shell下 EC Ram 读取工具

最近工作需要在 UEFI Shell 下Check EC Ram 的设定&#xff0c;发现手上只有 Windows 下的读取工具(RW Everything)。于是研究了一下如何在Shell 读取 EC Ram。根据【参考1】读取的流程如下&#xff1a;Port 66 CommandsThere are also some EC commands that use ports 0x66 …

C++基础13-类和对象之继承1

在 C中可重用性(software reusability)是通过继承(inheritance)这一机制来实现的。 如果没有掌握继承性,就没有掌握类与对象的精华。 总结&#xff1a; 1、只要是父类中的private成员&#xff0c;不管是什么继承方式&#xff0c;儿子都访问不了&#xff0c;但它是存在在儿子之…

线程锁定CPU linux,linux 线程与CPU绑定

看到很多程序都是根据CPU个数来创建线程个数&#xff0c;当时很不理解他们之间的关系&#xff0c;请教了项目组的同事后才有了大致了解。1. 相关系统函数下面的函数可以通过man命令查询到。SYNOPSIS#define _GNU_SOURCE#include int pthread_setaffinity_np(pthread_t thread, …

C++基础13-类和对象之继承2

总结&#xff1a; 1、子类对象可以当做父类对象使用 2、子类对象可以直接赋值给父类对象 3、子类对象能够直接初始化父类对象 4、父类指针可以直接指向子类对象 5、凡是继承过来的属性和函数都可以在子类中用this-> 进行访问 6、默认构造函数并不会初始化数据成员 7、如果…

linux内核 块驱动程序,linux – 为什么内核使用默认的块驱动程序而不是我的驱动程序代码?...

我写了一个块驱动程序,它创建了一个虚拟块设备(sbd0).我为该块设备注册了所有设备操作:(请参阅2.6.32内核源代码中的include /linux / blkdev.h)static struct block_device_operations sbd_ops {.owner THIS_MODULE,.open sbd_open,.release sbd_close,.ioctl sbd_ioctl,…

C++基础14-类和对象之多继承与虚继承

多继承&#xff1a;一个类有多个直接基类的继承关系称为多继承 总结&#xff1a; 1、一般将具有菱形样式继承方式的某些类声明为虚继承 3、虚继承的主要目的是为了防止二义性 2、虚继承就是在继承方式前加virtual 如果一个派生类从多个基类派生&#xff0c;而这些基类又有一…

linux系统安装ntp,CentOS下NTP安装配置

安装yum install ntp配置文件 /etc/ntp.confrestrict default kod nomodifynotrap nopeer noqueryrestrict -6 default kod nomodify notrap nopeer noqueryrestrict 127.0.0.1restrict -6 ::1# 用restrict控管权限# nomodify - 用户端不能更改ntp服务器的时间参数# noquery - …

C++基础15-类和对象之多态

总结&#xff1a; 1、在父类中申明虚函数时&#xff0c;一般情况下在子类中也申明&#xff08;便于读代码&#xff09; 一、赋值兼容 赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。 赋值兼容是一种默认行为,不需要任何的显示的转化步骤。 …

傲云浏览器linux,Centos7安装部署zabbix监控软件

目录部署监控服务器部署监控服务器Zabbix ServerWeb页面验证设置部署监控服务器一、安装LNMP环境Zabbix监控管理控制台需要通过Web页面展示出来&#xff0c;并且还需要使用MySQL来存储数据&#xff0c;因此需要先为Zabbix准备基础LNMP环境。1. wget下载官网Nginxwget http://ng…

C++基础16-类和对象之联编,重写,虚析构

1、静态联编和动态联编 1、联编是指一个程序模块、代码之间互相关联的过程。 2、静态联编&#xff08;sta5c binding&#xff09;&#xff0c;是程序的匹配、连接在编译阶段实现&#xff0c;也称为早期匹配。重载函数使用静态联编。 3、动态联编是指程序联编推迟到运行时…

c语言环境变量的作用,C语言获取系统环境变量

C语言获取系统环境变量可以通过如下代码实现.#include #include char *platform(){//获取系统变量信息char *ret;extern char **environ;char **env environ;//打印系统变量信息/*while(*env){//puts(*env);env;}*/ret getenv("OS"); //for windows_ntif(NULL ! re…