[源码下载]

不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

作者:webabcd

介绍
不可或缺 Windows Native 之 C++

  • 运算符重载
  • 自定义类型转换

示例
CppOperator.h

#pragma once 

#include <string>

using namespace std;

namespace NativeDll
{
class CppOperator
{
public:
string Demo();
};
}

CppOperator.cpp

/*
* 运算符重载, 自定义类型转换
*/ #include "pch.h"
#include "CppOperator.h"
#include "cppHelper.h"
#include <iostream> using namespace NativeDll; void cppoperator_demo1();
void cppoperator_demo2();
void cppoperator_demo3();
void cppoperator_demo4();
void cppoperator_demo5();
void cppoperator_demo6();
void cppoperator_demo7();
void cppoperator_demo8(); string CppOperator::Demo()
{
// 通过成员函数重载“+”运算符
cppoperator_demo1(); // 通过友元函数重载“*”运算符
cppoperator_demo2(); // 通过友元函数重载“==”运算符
cppoperator_demo3(); // 通过成员函数重载“前置++”运算符
cppoperator_demo4(); // 通过成员函数重载“后置++”运算符
cppoperator_demo5(); // 通过友元函数重载 ostream 的 <<
cppoperator_demo6(); // 类型转换函数(type conversion function),可以隐式转换或显式转换
cppoperator_demo7(); // 通过构造函数实现隐式转换
cppoperator_demo8(); // 运算符重载时,如果第一个操作数不是本类对象,则只能用 friend 的方式重载(此时不能用成员函数的方式重载)
// 习惯来说:通过成员函数重载单目运算符;通过友元函数重载双目运算符
// 不可以自定义新的运算符,只能重载已有运算符,其中不可重载的运算符有:“.”, “.*”, “sizeof()”, “::”, “?:” return "看代码及注释吧";
} class CppOperatorComplex
{
private:
string Name;
public:
CppOperatorComplex() : Name("")
{ }
CppOperatorComplex(string name) : Name(name)
{ }
string ToString()
{
return Name;
} // 通过成员函数重载“+”运算符(左边是本类对象,右边是指定的 CppOperatorComplex 对象)
CppOperatorComplex operator+(CppOperatorComplex &coc); // 通过友元函数重载“*”运算符(左边是指定的 CppOperatorComplex 对象,右边是指定的 CppOperatorComplex 对象)
friend CppOperatorComplex operator*(CppOperatorComplex &coc1, CppOperatorComplex &coc2);
// 通过友元函数重载“==”运算符(左边是指定的 string 对象,右边是指定的 CppOperatorComplex 对象)
friend bool operator==(string &name, CppOperatorComplex &coc); // 通过成员函数重载“前置++”运算符
CppOperatorComplex operator++();
// 通过成员函数重载“后置++”运算符(这里需要加一个 int 类型的参数,这是 c++ 的约定,用以区分“前置++”)
CppOperatorComplex operator++(int); // 通过友元函数重载 ostream 的 <<
friend ostream& operator<<(ostream &, CppOperatorComplex &); // 类型转换函数,用以支持将 CppOperatorComplex 转换(隐式或显式)为 int
operator int();
}; CppOperatorComplex CppOperatorComplex::operator+(CppOperatorComplex &coc)
{
CppOperatorComplex result;
result.Name = this->Name + "+" + coc.Name;
return result;
} CppOperatorComplex operator*(CppOperatorComplex &coc1, CppOperatorComplex &coc2)
{
CppOperatorComplex result;
result.Name = coc1.Name + "*" + coc2.Name;
return result;
} bool operator==(string &name, CppOperatorComplex &coc)
{
CppOperatorComplex result;
return name == coc.Name;
} CppOperatorComplex CppOperatorComplex::operator++() // 前置++
{
this->Name = "++" + this->Name;
return *this;// 返回自加后的当前对象
}
CppOperatorComplex CppOperatorComplex::operator++(int) // // 后置++
{
CppOperatorComplex temp(*this);
this->Name += "++";
return temp; // 返回的是自加前的对象
} ostream& operator<<(ostream &output, CppOperatorComplex &coc)
{
output << "name: " << coc.Name;
return output;
} CppOperatorComplex::operator int() //定义重载运算符的函数
{
if (this->Name == "webabcd")
return ;
return ;
} // 通过成员函数重载“+”运算符
void cppoperator_demo1()
{
CppOperatorComplex coc1("webabcd");
CppOperatorComplex coc2("wanglei"); CppOperatorComplex coc = coc1 + coc2;
string result = coc.ToString(); // webabcd+wanglei
} // 通过友元函数重载“*”运算符
void cppoperator_demo2()
{
CppOperatorComplex coc1("webabcd");
CppOperatorComplex coc2("wanglei"); CppOperatorComplex coc = coc1 * coc2;
string result = coc.ToString(); // webabcd*wanglei
} // 通过友元函数重载“==”运算符
void cppoperator_demo3()
{
string name = "wanglei";
CppOperatorComplex coc2("wanglei"); bool result = (name == coc2); // true
} // 通过成员函数重载“前置++”运算符
void cppoperator_demo4()
{
CppOperatorComplex coc("wanglei"); string s1 = (++coc).ToString(); // ++wanglei
string s2 = coc.ToString(); // ++wanglei
} // 通过成员函数重载“后置++”运算符
void cppoperator_demo5()
{
CppOperatorComplex coc("wanglei"); string s1 = (coc++).ToString(); // wanglei
string s2 = coc.ToString(); // wanglei++
} // 通过友元函数重载 ostream 的 <<
void cppoperator_demo6()
{
CppOperatorComplex coc("wanglei"); cout << coc << endl; // name: wanglei
} // 类型转换函数的演示,隐式转换和显式转换
void cppoperator_demo7()
{
CppOperatorComplex coc1("webabcd");
CppOperatorComplex coc2("wanglei"); // 由于结果是 int 类型,所以 coc1 和 coc2 会被隐式地转换为 int(通过“operator int()”来实现)
int result = coc1 - coc2; // 90 // 显式转换(通过“operator int()”来实现)
result = int(coc1) - int(coc2); //
} class CppOperatorA
{
private:
string Name;
int Age;
public:
CppOperatorA(string name) : Name(name), Age()
{ }
CppOperatorA(int age) : Age(age), Name("")
{ }
string ToString()
{
return Name + int2string(Age);
}
}; class CppOperatorB
{
private:
string Name;
int Age;
public:
explicit CppOperatorB(string name) : Name(name), Age()
{ }
explicit CppOperatorB(int age) : Age(age), Name("")
{ }
string ToString()
{
return Name + int2string(Age);
}
}; // 演示如何通过构造函数实现隐式转换
void cppoperator_demo8()
{
CppOperatorA a1 = "webabcd"; // 编译器会调用 CppOperatorA(string name); 构造函数
CppOperatorA a2 = ; // 编译器会调用 CppOperatorA(int age); 构造函数 string result1 = a1.ToString(); // webabcd0
string result2 = a2.ToString(); // 100 // CppOperatorB b1 = "webabcd"; // 由于构造函数 CppOperatorB(string name); 被修饰为 explicit,所以不能隐式调用此构造函数
// CppOperatorB b2 = 100; // 由于构造函数 CppOperatorB(int age); 被修饰为 explicit,所以不能隐式调用此构造函数
}

OK
[源码下载]

不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换的更多相关文章

  1. 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板

    [源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...

  2. 不可或缺 Windows Native 系列文章索引

    [源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...

  3. 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等

    [源码下载] 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等 作者:webabcd 介绍不可或缺 Windows Native  ...

  4. 不可或缺 Windows Native (11) - C++: hello c++, C++ 与 C语言的区别小介

    [源码下载] 不可或缺 Windows Native (11) - C++: hello c++, C++ 与 C语言的区别小介 作者:webabcd 介绍不可或缺 Windows Native 之 ...

  5. 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native

    [源码下载] 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native 作者:web ...

  6. 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流

    [源码下载] 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 标准输 ...

  7. 不可或缺 Windows Native (1) - C 语言: hello c

    [源码下载] 不可或缺 Windows Native (1) - C 语言: hello c 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 在 Windows Sto ...

  8. 不可或缺 Windows Native (7) - C 语言: 指针

    [源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...

  9. 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

    [源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...

随机推荐

  1. CSS折行小记

    最近项目中遇到字段内容过长的显示问题. 后来在网上找了资料,http://www.php100.com/html/webkaifa/DIV_CSS/2009/0416/2453.html  用了td( ...

  2. [Reomting Debug] 巧用VS 的remote debug 功能远程调试程序 经验分享.

    前言: 有时候我们Dev(开发人员)需要debug tester(测试人员)或者customer(客户)的环境,可tester的机器上没有Code,是不是有点着急? 而且是多版本应用且tester 发 ...

  3. Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别

    Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别 1.1. 色彩的三要素 -- 色相.明度.纯度1 1.2. YUV三个字母中,其中"Y&quo ...

  4. Liferay7 BPM门户开发之45: 集成Activiti文件上传部署流程BPMN模型

    开发文件上传,部署流程模板. 首先,开发jsp页面,deploy.jsp <%@ include file="/init.jsp" %> <h3>${RET ...

  5. win环境安装python爬虫框架scrapy

    #官网下载python for windows #https://www.python.org/downloads/ #安装后在“计算机->属性->高级系统设置->环境变量-> ...

  6. TSql CTE 递归原理探究

    CTE是如何进行递归的?产生递归的条件有三个,分别是 初始值 自身调用自身 结束递归的条件 1,示例代码 ;with cte as ( as jd union all as jd from cte ) ...

  7. 那些年我们一起过的JS闭包,作用域,this,让我们一起划上完美的句号。

    之前有写过闭包,作用域,this方面的文章,但现在想想当时写的真是废话太多了,以至于绕来绕去的,让新手反而更难理解了,所以就有了此篇文章,也好和闭包,作用域,this告一段落. 第一个问题:什么是闭包 ...

  8. WPF自定义控件与样式(13)-自定义窗体Window & 自适应内容大小消息框MessageBox

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 自定义 ...

  9. 【转载】经典SQL语句大全

    [原文地址]http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html 一.基础 1.说明:创建数据库CREATE DATABAS ...

  10. 轻松搭建Unity3D 安卓Android开发环境

    1,下载安装Java的JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html (JDK中,包含JRE) 如果是6 ...