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 ...
随机推荐
- django模板层(templates)
1.基础部分 通过使用模板,就可以在URL中直接调用HTML,它还是松耦合的,灵活性强,而且更容易维护 而且可以将变量通过一定的方式嵌入到HTML中,最终渲染到页面,总的来说基于模板完成了数据与用户之 ...
- 前端jQuery之动画操作及相关演示
1.显示动画 1.1无参数,直接让指定的元素显示出来 $("div").show(); 1.2通过控制宽高,透明度,display属性逐渐显示,指定时间现实完毕 $('div'). ...
- base64位 解码图片
jar包是commons-codec.jar. pnuts //base64解码成图片 function gldBase64ToImage(imgStr,imgFilePath) { // 对字节数组 ...
- Informatica 简单使用
1. Informatica简介 ① Repository manager 主要用来维护资料库的目录,对象,建完对象可以创建demo的folder. ② Administration Console是 ...
- Python 创建项目、应用
1.创建项目 django-admin startproject TestPython 2.创建应用 python3 manage.py startapp books 3.目录讲解 ├── TestP ...
- UVa中国麻将(Chinese Mahjong,Uva 11210)
简单的回溯题 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm ...
- Shell脚本使用汇总整理
Shell脚本使用汇总整理 一.Shell脚本常用的头部格式: 头部的作用就是告知linux此脚本的类型: 常用的头部格式如下:(/bin/bash,是bash的路径,如果不知道路径可以通过which ...
- [Ljava.lang.String; cannot be cast to java.lang.String报错的原因
完整错误信息: java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String 报这个错的原因 ...
- Java执行存储过程
1.JDBC调用存储过程: CallableStatement /** *p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替 *其余地方写法固定 */ CallableStateme ...
- java @override 全部报错
问.java @override 全部报错 答: 错误:在 eclipse 的新工作空间开发项目时,出现大面积方法编译错误.鼠标放在方法名上后显示让我们去掉 @override 注解 原因: @Ove ...