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 ...
随机推荐
- c#右键窗体弹出菜单
在工具箱(快捷键ctrl+w+x)——菜单和工具栏中找到 在属性中用这个绑定 然后写后台代码
- 第44章 MPU6050传感器—姿态检测—零死角玩转STM32-F429系列
第44章 MPU6050传感器—姿态检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...
- fcn
上几周把fcn跑了几个模型,唉,因此测试程序,整了很久,浪费时间啊. fcn做分割,其实我是想用来做检测的,但是总是觉得这个框架是以后的趋势,所以一直想要去在这个基础上做个东西,目前训练的模型还没有测 ...
- 大白话讲解BP算法(转载)
最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...
- 【复杂度分析】loj#6043. 「雅礼集训 2017 Day7」蛐蛐国的修墙方案
感觉有点假 题目大意 数据范围:$n<=100$ 题目分析 由于题目给出的是 置换,所以相当于只需枚举每个环的两个状态. 主要是复杂度分析这里: 一元环:不存在 二元环:特判保平安 三元环:不存 ...
- 课时16.HTML-XHTML-HTML5区别(了解)
简而言之 HTML语法非常宽松容错性强: XHTML更为严格,它要求标签必须小写,必须严格闭合,标签中的属性必须使用引号引起等等. HTML5是HTML的下一个版本所以除了非常宽松容错性强以外,还增加 ...
- TP5 行为Behavior用法说明
TP5 行为Behavior用法说明 无论是tp3还是在tp5中,行为都是一个非常重要的概念,关于太多的理论知识,就不多说了,不了解的请查看开发文档:TP5 行为概述 以下,就由代码来一步一步实现行为 ...
- laravels -- Swoole加速php
LaravelS是一个胶水项目,用于快速集成Swoole到Laravel,然后赋予它们更好的性能.更多可能性. 环境 : ubuntu16 + nginx + php7.1 + LaravelS搭建高 ...
- POJ-3126 BFS,埃式筛选及黑科技
题目大意:给定两个四位素数a b,要求把a变换到b,变换的过程要保证 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位不同,而且每步得到的 ...
- 20145202 《Java程序设计》第四周学习总结
继承:打破了封装性 extends 1.提高了代码的复用性. 2.让类与类之间产生了关系,有了这个关系,才有了多态的特性. 3.必须是类与类之间有所属类关系才可以继承. 4.java只支持单继承不支持 ...