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 ...
随机推荐
- 文本编辑器Vim技巧
1. 导入文件内容 :r 文件名 2. 插入当前日期 :r !date 3. :!which ls 4. :r !命令
- P2065 [TJOI2011]卡片
真·会了网络流,忘了匈牙利 一共两种颜色,很容易想到二分图劈配 虽然这题数据水 但是,数据强的话肯定会卡掉的. 为什么? 我暴力质因数都过了 我们可以在两边的数与质因数相连.然后跑网络流. #incl ...
- PHP中的生成XML文件的4种方法分享
生成如下XML串 Xml代码 <?xml version="1.0" encoding="utf-8"?> <article> < ...
- css英文长文字会自动换行的解决办法
iPhone5中显示的效果如下图: 代码修改: 修改后效果如图:
- jQuery性能优化和技巧
jQuery性能优化 ①使用最新版本的jQuery类库 ②使用合适的选择器 ③缓存对象 ④循环时的DOM操作 ⑤数组方式使用jQuery对象 ⑥事件代理 ⑦将你的代码转化成jQuery插件 ⑧使用jo ...
- Junit 测试 @Test 红名问题
准备测试,如上图,都是红名 Ctrl+1 或者鼠标放在@Test上 鼠标放在@Test上出现上面这种就可直接点击安装了 如果是下边这种 Test is not an annotation type,一 ...
- 简单的for循环实现九九乘法表
PHP for 循环 语法 for (init counter; test counter; increment counter) { code to be executed; } 参数: init ...
- Linux两种方式rd.break和init重置root管理员密码
centos7/rhel7进入单用户方式和重置密码方式发生了较大变化,GRUB由b引导变成了ctrl+x引导. 重置密码主要有rd.break和init两种方法. rd.break方法: 1.启动的时 ...
- Gold Balanced Lineup POJ - 3274
Description Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been abl ...
- 5,pandas高级数据处理
1.删除重复元素 使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True - keep参数:指定保留哪一重复的行 ...