[源码下载]

不可或缺 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. xamarin误删vEthernet(internal Ethernet Port Windows Phone Emulator) 网络设备的处理。

    昨天一不小心误删了xamarin 开发环境下的虚拟设备网络设备.名称为:vEthernet(internal Ethernet Port Windows Phone Emulator).导致原来能正确 ...

  2. Java对象序列化---转载

    1.概念 序列化:把Java对象转换为字节序列的过程. 反序列化:把字节序列恢复为Java对象的过程. 2.用途 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个 ...

  3. Android 在View中更新View

    直接用Invalidate()方法会导致错误:只有主线程才能更新UI 取而代之的是可以使用postInvalidate(); 原因: 最终会调用ViewRootImpl类的dispatchInvali ...

  4. Atitit 图像处理 灰度图片 灰度化的原理与实现

    Atitit 图像处理 灰度图片 灰度化的原理与实现 24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB.通常,许多24位彩色图 ...

  5. Piwik 扩展获取客户端IP地址

    piwik 数据库浏览记录存放在piwik_log_visit表中 piwik_log_visit 表有个location_ip字段,该字段存储为Byte[]字节 解析出来后的IP地址为 XXX.XX ...

  6. java.util.Arrays.sort两种方式的排序(及文件读写练习)

    import java.io.*; import java.util.*; public class SortTest{ public static void main(String args[]) ...

  7. angular项目总结——angular + browserify + gulp + bower + less 架构分享

    一眨眼,快三个月没有写博客了.一直在为自己没有写博客而懊恼,忙过这段时间,好好总结一下. 新项目主要是自己一个人在写,先搭建了一个初步的架构,用了我并不熟悉的angular,这个过程中,慢慢也熟悉了a ...

  8. [转载]—— Android JNI知识点

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...

  9. Java学习笔记之使用反射+泛型构建通用DAO

    PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...

  10. 详解css中的position属性

    这一次直接进入主题. css中最常用的布局类属性,一个是float,另一个就是定位属性position. 对于position来讲,有以下属性值: static : 无特殊定位,对象处于正常文档流.其 ...