不可或缺 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++: 运算符重载, 自定义类型转换的更多相关文章
- 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板
[源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...
- 不可或缺 Windows Native 系列文章索引
[源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...
- 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等
[源码下载] 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等 作者:webabcd 介绍不可或缺 Windows Native ...
- 不可或缺 Windows Native (11) - C++: hello c++, C++ 与 C语言的区别小介
[源码下载] 不可或缺 Windows Native (11) - C++: hello c++, C++ 与 C语言的区别小介 作者:webabcd 介绍不可或缺 Windows Native 之 ...
- 不可或缺 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 ...
- 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流
[源码下载] 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 标准输 ...
- 不可或缺 Windows Native (1) - C 语言: hello c
[源码下载] 不可或缺 Windows Native (1) - C 语言: hello c 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 在 Windows Sto ...
- 不可或缺 Windows Native (7) - C 语言: 指针
[源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...
- 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符
[源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...
随机推荐
- Http基础
Http基础 这篇文章是讲Android网络请求的先导文章,主要讲Http工作流程,请求报文和响应报文的格式,以及GET和POST方法的具体含义. Http工作流程 HTTP是一个客户端和服务器端请求 ...
- CSS的样式表基本概念
一.样式表分类 1.内联样式表 <p style="fint-size:24px;">直接在标签内部进行样式设置</style> 2.内嵌样式表 <h ...
- 2013 duilib入门简明教程 -- 总结 (20)
duilib的入门系列就到尾声了,再次提醒下,Alberl用的duilib版本是SVN上第个版本,时间是2013.08.15~ 这里给出Alberl最后汇总的一个工程,戳我下载,效 ...
- 用Chrome插件对自动化测试TestWriter进行录制
1.打开Chrome浏览器,在浏览地址中输入: chrome://extensions/,并勾选开发者模式.如图: 2.点击按钮[加载已解压的扩展程序-].如图: 3.选择Testwriter客户端下 ...
- unity生成WP工程后ExtendedSplashImage显示不正确的问题
这个bug我已经彻底无语了,居然这么久都没有fix. 解决方法如下: <SwapChainPanel x:Name="DXSwapChainPanel"> <Gr ...
- 3D touch在Unity3D中的使用
0.开篇: 3D touch随着iOS9发布,它并不是一个单独的技术,而是可以分为pressure sensitivity.quick action以及peek&pop.在官方的介绍中提到可以 ...
- JavaScript 对象的基本知识
js对象和属性的基本定义 (function(){ $(document).ready(function(){ return "object define"; //创建对象实例 v ...
- Git使用命令
git init 初始化仓库 git init --bare 初始化一个裸仓库 git branch 查看本地分支 git branch -a 查看全部分支 git remote 远程仓库管理 add ...
- JavaScript的陷阱
这本来是翻译Estelle Weyl的<15 JavaScript Gotchas>,里面介绍的都是在JavaScript编程实践中平时容易出错或需要注意的地方,并提供避开这些陷阱的方法, ...
- CSS颜色模式转换器的实现
前面的话 在CSS中,颜色的表示方式主要包括关键字.16进制.RGB模式.RGBA模式.HSL模式.HSLA模式.关于颜色模式的详细信息移步至此.本文就16进制.RGB模式及HSL模式的互相转换进行实 ...