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 ...
随机推荐
- js将数字转换成中文
var _change = { ary0:["零", "一", "二", "三", ...
- 第一个AngularJS表达式实例
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- How good are detection proposals, really?
How good are detection proposals, really? J. Hosang, R. Benenson, B. Schiele Oral at BMVC 2014 http: ...
- Unexpected token o in JSON at position 1
ajax返回的数据已经是object格式,无需再使用“var newjsonObj = JSON.parse(jsonObj)” 进行转换.
- mycat特点及用途
Mycat关键特性 关键特性 支持SQL92标准 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理. 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera clu ...
- RestKit ,一个用于更好支持RESTful风格服务器接口的iOS库
简介 RestKit 是一个用于更好支持RESTful风格服务器接口的iOS库,可直接将联网获取的json/xml数据转换为iOS对象. 项目主页: RestKit 最新示例: 点击下载 注意: 如果 ...
- ES6初识- Class
{ //基本定义和生成实例 class Parent{ //构造函数 constructor(name='lisi'){ this.name=name; } //属性get,set get longN ...
- mysql5.6 配置 文件
mysql 3306 主库配置文件 [client] port = 3306 default-character-set=utf8mb4 socket = /ssd/mysql/3306/tmp/my ...
- Linux(CentOS6.5 x64)下版本安装及升级kangle+EasyPanel
说明:(easypanel集成了kangle web 服务器和mysql,仅支持centos 5和centos 6) .执行下面的命令即可,安装程序将自动安装或者升级: yum -y install ...
- Python全栈day 04
Python全栈day 04 一.解释器/编译器 补充:编译型语言和解释型语言? # 编译型:代码写完后,编译器将其变成成另外一个文件,然后交给计算机执行. c c++,c# ,java # 解释型: ...