c++知识点总结--友元&运算符重载
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h> using namespace std;
class mystring
{
public:
char *s;
public:
mystring()
{
s = new char[];
cout << "mystring" << endl;
}
mystring(const mystring &it)//深拷贝
{
cout << "copy mystring" << endl;
s = new char[];
memset(s, , );
strcpy(s, it.s);
} ~mystring()
{
cout << "~mystring" << endl;
delete []s;
}
//mystring=mystring
mystring &operator =(const mystring &it)//重载了一个=号操作符
{
cout << "= operator" << endl;
memset(s, , );
strcpy(s, it.s);
return *this;
}
//mystring=char*
mystring &operator =(const char *str)//重载了一个=号操作符
{
cout << "char = operator" << endl;
memset(s, , );
strcpy(s, str);
return *this;
}
//mystring=int
mystring &operator =(int i)//重载了一个=号操作符
{
memset(s, , );
sprintf(s, "%d", i);
return *this;
}
//mystring+mystring
mystring &operator + (const mystring &it)//重载了一个+号操作符
{
strcat(s, it.s);
return *this;
}
//mystring+char*
mystring &operator + (const char *str)//重载了一个+号操作符
{
strcat(s, str);
return *this;
} void operator +=(const char *str)//
{
strcat(this->s, str);
}
//mystring+int
mystring &operator + (int i)//重载了一个+号操作符,一元操作符重载
{
char temp[] = {};
sprintf(temp, "%d", i);
strcat(s, temp);
return *this;
}
void operator <<(const char *str)//把<<操作符定义为赋值
{
strcpy(s, str);
} void operator >>(char *str)//把<<操作符定义为赋值
{
strcpy(str, s);
} mystring operator ++(int)//重载++操作符的函数int参数是固定
{
int len = strlen(s);
for(int i = ;i < len; i++)
{
s[i]++;//让s的第一个成员char + 1,就是将s[0]对应字符的ASCII码 + 1
}
return *this;
} void * operator new(size_t size)//如果重载的new,那么必须重载delete
{
//参数size就是sizeof(mystring)的大小.
cout << "size = " << size << endl;
mystring *p = (mystring *)malloc(size);
return p;
} void * operator new[](size_t size)//如果重载的new,那么必须重载delete
{
//参数size就是sizeof(mystring)的大小 * new[x] + 4个字节.
cout << "size = " << size << endl;
//mystring *p = (mystring *)malloc(size);
return NULL;
} void operator delete[](void *obj)
{
free((mystring *)obj);
obj = NULL;
} void operator delete(void *obj)
{
free((mystring *)obj);//不能直接free一个void *;
obj = NULL;//防止野指针
} bool operator ==(const mystring &it)
{
if (strcmp(s, it.s) == )//如果this->s和it的s相同,就返回true
{
return true;
}else
return false;
} bool operator ==(const char *str)
{
if (strcmp(s, str) == )//如果this->s和it的s相同,就返回true
{
return true;
}else
return false;
} //如果返回的是char,代表的是一个右值,右值是不能直接赋值的,
//如果返回的是char的引用,那么[]就可以当左值使用了
char &operator[](int index)
{
return s[index];
} void operator ()(const char *str)//重载函数调用操作符
{
strcpy(s, str);
} void operator ()(int i)
{
sprintf(s, "%d", i);
} operator int()
{
return atoi(s);
} friend mystring operator +(const char *str, const mystring &it); }; bool operator ==(const char *str, const mystring &it)
{
if (strcmp(str, it.s) == )
{
return true;
}else
return false;
} //操作符重载,有一个最基本条件,就是一定有一个一元是一个自定义的C++类
//如果两个都是基本数据类型操作符重载是非法的 mystring operator +(const char *str, const mystring &it)
{
mystring str1;
char buf[] = {};
sprintf(buf, "%s%s", str, it.s);
strcpy(str1.s, buf);
return str1;
} mystring operator ++(mystring &it)
{
int len = strlen(it.s);
for(int i = ;i < len; i++)
{
it.s[i]++;//让s的第一个成员char + 1,就是将s[0]对应字符的ASCII码 + 1
}
return it;
}
//char*+mystring
mystring &operator +(int i, const mystring &it)
{
mystring str1;
char buf[] = {};
sprintf(buf, "%d%s", i, it.s);
strcpy(str1.s, buf);
return str1;
}
int main(int argc, char *argv[])
{
/* mystring str1;
strcpy(str1.s, "hello world");
mystring str2;
str2 = str1;//这个过程不是拷贝构造的过程,只是=号操作
cout<<str2.s<<endl;
//str2.operator =(str1);//和直接写=号是一摸一样的 str2 = "test";//C++编译器不能理解把一个字符串赋给一个类是什么含义
cout<<str2.s<<endl; mystring str3;
str3 = str2 = 100;
//str3 = str2.operator =(100);//上一条语句的等效语法
*/ mystring str1;
str1 = "hello";
mystring str2;
str2 = " world";
mystring str3;
//str3 = str1 + str2;//对C++编译器来讲,不能识别两个类+是什么含义
//str3 = str1 + "aaaaaaaaaaaa";
//str3 = str1 + 100;
str3 = "AAAAA" + str1;
// str3 = 100 + str1;
// str3 += "BBBBBB";
// str3 << "CCCCC";
// char buf[1024] = {0};
// str3 >> buf;
// str2 = str3++;
// str2 = ++str3; // mystring *pstr = new mystring;
// delete pstr; cout << str3.s << endl;
return ;
}
c++知识点总结--友元&运算符重载的更多相关文章
- C++:成员运算符重载函数和友元运算符重载函数的比较
5.2.4 成员运算符重载函数和友元运算符重载函数的比较 (1)对双目运算符而言,成员运算符重载函数参数表中含有一个参数,而友元运算符重载函数参数表中有两个参数:对于单目运算符而言,成员运算符重载函数 ...
- C++:运算符重载函数之友元运算符重载
5.2.2 友元运算符重载函数 运算符重载函数一般采用两种形式定义: 一是定义为它将要操作的类的成员函数(简称运算符重载函数): 二是定义为类的友元函数(简称为友元运算符重载函数). 1.定义友元运算 ...
- C++:友元运算符重载函数
运算符重载函数:实现对象之间进行算数运算,(实际上是对象的属性之间做运算),包括+(加号).-(减号).*./.=.++.--.-(负号).+(正号) 运算符重载函数分为:普通友元运算符重载函数.成员 ...
- C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对运算符重载的函数有两种处理方式:(1)把运算符 ...
- C++:运算符重载函数之"++"、"--"、"[ ]"、"=="的应用
5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++ ...
- C++之运算符重载(1)
在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有 ...
- 04737_C++程序设计_第9章_运算符重载及流类库
例9.1 完整实现str类的例子. #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> ...
- [转]C++之运算符重载(1)
在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有 ...
- C++之运算符重载
C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
随机推荐
- centos7 kvm安装使用
kvm简介 KVM 全称是 Kernel-Based Virtual Machine.也就是说 KVM 是基于 Linux 内核实现的. KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU ...
- svn更改地址怎么办
开发过程中有时会遇到服务器更换地址的情况,比如之前地址是 svn://www.aaa.com 后来换成了 svn://www.bbb.com 这时候怎么办呢?分客户端和服务器端2种情况处理 客户端: ...
- phpmyadmin高级功能尚未完全设置部分功能未激活
1.登录phpmyadmin,点击导入,选择/var/ww/html/phpmyadmin/examples/create_tables.sql并执行 完成后可以看到多出了一个库phpmyadmin. ...
- (转)ActionContext和ServletActionContext
前面已经了解到ActionContext是Action执行时的上下文,里面存放着Action在执行时需要用到的对象,我们也称之为广义值栈. Struts2在每次执行Action之前都会创建新的Acti ...
- inline-block问题
1.两个相邻的inline-block元素,给inline-block元素设置max-width并且overflow:hidden;之后,相邻行内元素回向下偏移问题 给inline-block元素添加 ...
- MacBookPro 存储空间优化
首先,打开电脑内的"终端"; 其次,逐条录入下面的命令行,执行完成后,再次查看您的储存空间,多少会有一些优化,具体会优化出多少储存空间因您日常使用而定(本人清出了5G 空间,还不错 ...
- JS-输入数字输出大写中文
function(n) { var fraction = ['角', '分']; var digit = [ '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', ...
- html和node.js实现websocket
websocket websocket是HTML5开始提供的一种单个TCP连接上进行全双工通讯的协议.它让客户端和服务端之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.浏览器和服务器只需要 ...
- Thinkphp 取消Url默认模块的现实
例子http://www.tp.com/home/index/index 想要现实的效果是:http://www.tp.com/index/index 1是通过配置路由来达到目的 2通过配置首页的入口 ...
- Webpack + Vue 多页面项目升级 Webpack 4 以及打包优化
0. 前言 早在 2016 年我就发布过一篇关于在多页面下使用 Webpack + Vue 的配置的文章,当时也是我在做自己一个个人项目时遇到的配置问题,想到别人也可能遇到跟我同样的问题,就把配置的思 ...