1) 对象向基本数据类型转换:
#include"stdafx.h" #include <iostream> #include<string> using namespace std; class D { public: D(double d) : d_(d) {} /* “(int)D”类型转换:将类型D转换成int */ operator int() const { std::cout << "(int)d called!" << std::endl; return static_cast<int>(d_); } private: double d_; }; int add(int a, int b) { return a + b; } int main() { D d1 = 1.1; D d2 = 2.2; std::cout << add(d1, d2) << std::endl; system("pause"); return 0; }
在26行执行add(d1,d2)函数时“(int)D”类型转换函数将被自动调用,程序运行的输出为:
(int)d called!
(int)d called!
3
#include <iostream> class A { public: A(int num = 0) : dat(num) {} /* "(int)a"类型转换 */ operator int() { return dat; } private: int dat; }; class X { public: X(int num = 0) : dat(num) {} /* "(int)a"类型转换 */ operator int() { return dat; } /* "(A)a"类型转换 */ operator A() { A temp = dat; return temp; } private: int dat; }; int main() { X stuff = 37; A more = 0; int hold; hold = stuff; // convert X::stuff to int std::cout << hold << std::endl; more = stuff; // convert X::stuff to A::more std::cout << more << std::endl; // convert A::more to int return 0; }
A(const X& rhs) : dat(rhs) {}
同时,请注意上面程序的第45行more的类型在调用std::cout时被隐式地转成了int!2. operator 用于操作符重载:
操作符重载的概念:
将现有操作符与一个成员函数相关联,并将该操作符与其成员对象(操作数)一起使用。
注意事项:
1) 重载不能改变操作符的基本功能,以及该操作符的优先级顺序。
2) 重载不应改变操作符的本来含义。
3) 只能对已有的操作符进行重载,而不能重载新符号。
4) 操作符重载只对类可用。
5) 以下运算符不能被重载:
. 原点操作符(成员访问符)
* 指向成员的指针
:: 作用域解析符
? : 问号条件运算符
sizeof 操作数的字节数
操作符函数的一般格式:
return_type operator op(argument list);
return_type:返回类型(要得到什么)
op:要重载的操作符
argument list:参数列表(操作数有哪些)
#include <iostream> using namespace std; class employee { int salary; public: void setSalary(int s) { salary=s; } void getSalary() { cout<<salary<<endl; } bool operator >(const employee & e)//重载大于号操作符 { if(salary > e.salary) return true; else return false; } }; void main() { employee emp1,emp2; emp1.setSalary(1000); emp2.setSalary(2000); if (emp1 > emp2) { cout<<"emp1比emp2工资高"<<endl; } else { cout<<"emlp1没有emp2工资高"<<endl; } }