前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++-入门语法(四)

C++-入门语法(四)

作者头像
cwl_java
发布2019-10-28 10:27:51
2780
发布2019-10-28 10:27:51
举报
文章被收录于专栏:cwl_Javacwl_Java

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_42528266/article/details/102756552

运算符重载(operator overload)
  • 运算符重载(操作符重载):可以为运算符增加一些新的功能
代码语言:javascript
复制
#include <iostream>
#include "Point.h"
using namespace std;

// operator overload

//class Point {
//	friend Point operator+(const Point &, const Point &);
//	int m_x;
//	int m_y;
//public:
//	Point(int x, int y) :m_x(x), m_y(y) { }
//	void display() {
//		cout << "(" << this->m_x << ", " << this->m_y << ")" << endl;
//	}
//};
//
//// 运算符(操作符)重载
//Point operator+(const Point &p1, const Point &p2) {
//	return Point(p1.m_x + p2.m_x, p1.m_y + p2.m_y);
//}


int main() {
	Point p0(5, 10);
	Point p1(30, 70);
	Point p2(10, 40);
	Point p3 = p1++ - p2;

	// Java.toString   OC.description
	cout << p0 << p1 << p2 << p3 << endl;

	// p0 << 1 << 2 << 3;

	// 运算符重载:最好保留运算符以前的语义

	// p1.display();
	// p3.display();

	/*int a = 10;
	int b = 0;
	b = a++ + 8;
	b = ++a + 8;
	cout << a << endl;*/

	// (a++) = 40;
	// (++a) = 50;

	/*
	int a = 10;
	a++;
	++a;
	(a++) = 30;
	(++a) = 40;
	*/

	// int a = 10;
	// int c = a++ + ++a + a++ + ++a;

	/*p1++;
	++p1;
	p1--;
	--p1;*/

	(-(-p1));

	// cout << (p1 != p2) << endl;

	/*Point p3 = p0 + p1 + p2;
	p3.display();

	Point p4 = p1 - p2;
	p4.display();

	(p1 += p2) = Point(100, 200);
	p1.display();*/


	/*int a = 10;
	int b = 20;
	(a += b) = 50;
	cout << a << endl;*/

	// Point p3 = p1.operator+(p2);
	// Point p3 = operator+(p1, p2);

	getchar();
	return 0;
}
代码语言:javascript
复制
#include "Point.h"

Point::Point(int x, int y) :m_x(x), m_y(y) { }

// 运算符(操作符)重载
Point Point::operator+(const Point &point) const {
	return Point(this->m_x + point.m_x, this->m_y + point.m_y);
}

Point Point::operator-(const Point &point) const {
	return Point(this->m_x - point.m_x, this->m_y - point.m_y);
}

const Point Point::operator-() const {
	return Point(-this->m_x, -this->m_y);
}

Point &Point::operator+=(const Point &point) {
	this->m_x += point.m_x;
	this->m_y += point.m_y;
	return *this;
}

Point &Point::operator-=(const Point &point) {
	this->m_x -= point.m_x;
	this->m_y -= point.m_y;
	return *this;
}

bool Point::operator==(const Point &point) {
	// 1 YES true
	// 0 NO false
	/*if (this->m_x == point.m_x && this->m_y == point.m_y) {
		return 1;
	}
	else {
		return 0;
	}*/
	return (this->m_x == point.m_x) && (this->m_y == point.m_y);
}

bool Point::operator!=(const Point &point) {
	return (this->m_x != point.m_x) || (this->m_y != point.m_y);
}

// 前++
Point &Point::operator++() {
	this->m_x++;
	this->m_y++;
	return *this;
}

// 后++
const Point Point::operator++(int) {
	Point point(this->m_x, this->m_y);
	this->m_x++;
	this->m_y++;
	return point;
}

ostream &operator<<(ostream &cout, const Point &point) {
	return cout << "(" << point.m_x << ", " << point.m_y << ")";
}
代码语言:javascript
复制
#pragma once
#include <iostream>
using namespace std;

class Point {
	friend ostream &operator<<(ostream &, const Point &);
	int m_x;
	int m_y;
public:
	Point(int x, int y);
	// 运算符(操作符)重载
	Point operator+(const Point &point) const;
	Point operator-(const Point &point) const;
	const Point operator-() const;
	Point &operator+=(const Point &point);
	Point &operator-=(const Point &point);
	bool operator==(const Point &point);
	bool operator!=(const Point &point);
	// 前++
	Point &operator++();
	// 后++
	const Point operator++(int);
};
运算符重载(String)
代码语言:javascript
复制
#include <iostream>
#include "String.h"
using namespace std;

int main() {

	{
		String str1 = "1111";
		String str2 = "2222";

		// ASCIIֵ
		// strcmp

		/*if (str2 > str1) {

		}
		if (str2 == str1) {

		}
		strcat
		String str3 = str1 + str2;
		str1 += str2;*/

		/*String str2 = "2222";

		str1 = "324234";
		cout << str1 << endl;

		str1 = str1;
		cout << str1 << endl;

		str1 = str2;
		cout << str1 << endl; */
	}

	getchar();
	return 0;
}
代码语言:javascript
复制
#include "String.h"

String::String(const char *cstring) {
	/*if (!cstring) return;
	cout << "String(const char *) - new[] - " << cstring << endl;

	this->m_cstring = new char[strlen(cstring) + 1] {};
	strcpy(this->m_cstring, cstring);*/
	assign(cstring);
} 

String::String(const String &string) {
	// *this = string.m_cstring;
	// (*this).operator=(string.m_cstring);
	assign(string.m_cstring);
}

String::~String() {
	// if (!this->m_cstring) return;
	// cout << "~String() - delete[] - " << this->m_cstring << endl;
	//delete[] this->m_cstring;
	//this->m_cstring = NULL;

	// operator=(NULL);
	// *this = NULL;
	/*(*this).operator=(NULL);
	this->operator=(NULL);
	operator=(NULL);*/
	assign(NULL);
}

String &String::operator=(const char *cstring) {
	return assign(cstring);
}

String &String::operator=(const String &string) {
	// return operator=(string.m_cstring);
	// return *this = string.m_cstring;
	return assign(string.m_cstring);
}

String &String::assign(const char *cstring) {
	// 指向一样的堆空间
	if (this->m_cstring == cstring) return *this;

	// 释放旧的字符串
	if (this->m_cstring) {
		cout << "delete[] - " << this->m_cstring << endl;

		delete[] this->m_cstring;
		this->m_cstring = NULL;
	}

	// 指向新的字符串
	if (cstring) {
		cout << "new[] - " << cstring << endl;

		this->m_cstring = new char[strlen(cstring) + 1]{};
		strcpy(this->m_cstring, cstring);
	}

	return *this;
}

ostream &operator<<(ostream &cout, const String &string) {
	if (!string.m_cstring) return cout;
	return cout << string.m_cstring;
}
代码语言:javascript
复制
#pragma once
#include <iostream>
using namespace std;

class String {
	friend ostream &operator<<(ostream &, const String &);
public:
	String(const char *cstring);
	String(const String &string);
	~String();
	String &operator=(const char *cstring);
	String &operator=(const String &string);
private:
	char *m_cstring;
	String &assign(const char *cstring);
};
代码语言:javascript
复制
#include <iostream>
#include "String.h"
using namespace std;

int main() {
	{
		String str1 = "abc";
		cout << (str1 > "aac") << endl;
	}

	// str1 = 12234

	getchar();
	return 0;
}
代码语言:javascript
复制
#include "String.h"

String::String(const char *cstring) {
	assign(cstring);
}

String::String(const String &string) {
	assign(string.m_cstring);
}

String::~String() {
	assign(NULL);
}

String &String::operator=(const char *cstring) {
	return assign(cstring);
}

String &String::operator=(const String &string) {
	return assign(string.m_cstring);
}

String String::operator+(const char *cstring) {
	String str;
	char *newCString = join(this->m_cstring, cstring);
	if (newCString) {
		// 释放旧的堆空间
		str.assign(NULL);
		// 直接指向新开辟的堆空间
		str.m_cstring = newCString;
	}
	return str;
}

String String::operator+(const String &string) {
	return operator+(string.m_cstring);
}

String &String::operator+=(const char *cstring) {
	char *newCString = join(this->m_cstring, cstring);
	if (newCString) {
		this->assign(NULL);
		this->m_cstring = newCString;
	}
	return *this;
}

String &String::operator+=(const String &string) {
	return operator+=(string.m_cstring);
}

bool String::operator>(const char *cstring) {
	if (!this->m_cstring || !cstring) return 0;
	return strcmp(this->m_cstring, cstring) > 0;
}

bool String::operator>(const String &string) {
	return operator>(string.m_cstring);
}

char String::operator[](int index) {
	if (!this->m_cstring || index < 0) return '\0';
	if (index >= strlen(this->m_cstring)) return '\0';
	return this->m_cstring[index];
}

char *String::join(const char *cstring1, const char *cstring2) {
	if (!cstring1 || !cstring2) return NULL;

	char *newCString = new char[strlen(cstring1) + strlen(cstring2) + 1] {};
	strcat(newCString, cstring1);
	strcat(newCString, cstring2);

	cout << "new[] - " << newCString << endl;
	return newCString;
}

String &String::assign(const char *cstring) {
	// 指向一样的堆空间
	if (this->m_cstring == cstring) return *this;

	// 释放旧的字符串
	if (this->m_cstring) {
		cout << "delete[] - " << this->m_cstring << endl;

		delete[] this->m_cstring;
		this->m_cstring = NULL;
	}

	// 指向新的字符串
	if (cstring) {
		cout << "new[] - " << cstring << endl;

		this->m_cstring = new char[strlen(cstring) + 1]{};
		strcpy(this->m_cstring, cstring);
	}

	return *this;
}

ostream &operator<<(ostream &cout, const String &string) {
	if (!string.m_cstring) return cout;
	return cout << string.m_cstring;
}
代码语言:javascript
复制
#pragma once
#include <iostream>
using namespace std;

class String {
	friend ostream &operator<<(ostream &, const String &);
public:
	String(const char *cstring = "");
	String(const String &string);
	~String();
	String &operator=(const char *cstring);
	String &operator=(const String &string);
	String operator+(const char *cstring);
	String operator+(const String &string);
	String &operator+=(const char *cstring);
	String &operator+=(const String &string);
	bool operator>(const char *cstring);
	bool operator>(const String &string);
	char operator[](int index);
private:
	char *m_cstring = NULL;
	String &assign(const char *cstring);
	char *join(const char *cstring1, const char *cstring2);
};
单例模式的补充
代码语言:javascript
复制
#include <iostream>
using namespace std;
class Rocket {
public:
	static Rocket * sharedRocket() {
		if (ms_rocket) return ms_rocket;
		return ms_rocket = new Rocket();
	}
	static void deleteRocket() {
		if (!ms_rocket) return;

		delete ms_rocket;
		ms_rocket = NULL;
	}
private:
	static Rocket *ms_rocket;
	Rocket() { }
	Rocket(const Rocket &rocket) { }
	void operator=(const Rocket &rocket) { }
};

Rocket *Rocket::ms_rocket = NULL;

/*
单例需要禁止掉:拷贝行为、赋值行为
*/

int main() {

	Rocket *p1 = Rocket::sharedRocket();
	Rocket *p2 = Rocket::sharedRocket();

	getchar();
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 运算符重载(operator overload)
  • 运算符重载(String)
  • 单例模式的补充
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档