选择特殊符号
选择搜索类型
请输入搜索
运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
1.若﹣2amb4与5an+2b2m+n可以合并成一项,求mn的值____________ 2.已知实数a,b,c满足a2+b2=1,b2+c2=2,c2+a2=2,求ab+bc+ca的最小值____...
有效数字运算规则 由于与误差传递有关,计算时加减法和乘除法的运算规则不太相同。1.加减法先按小数点后位数最少的数据保留其它各数的位数,再进行加减计算,计算结果也使小数点后保留相同的位数。2.乘除法先按...
选中提示内容 把构建删掉重新画
电气符
序号 图 形 符 号 说 明 1 开关 (机械式 ) 2 多级开关一般符号多 线表示 3 (在非动作位置触点断 开) 4 接触器 (在非动作位置 触点闭合 ) 5 负荷开关 (负荷 ) 6 具有自动释放功能的 负荷开关 7 熔断器式断路器 8 断路器 9 隔离开关 10 熔断器一般符号 11 跌落式熔断器 12 熔断器式开关 13 熔断器式隔离开关 14 熔断器式负荷开关 15 熔断器式负荷开关 16 当操作器件被吸合时 延时闭合的动合触点 17 当操作器件被释放时 延时闭合的动合触点 18 当操作器件被释放时 延时闭合的动断触点 19 当操作器件被吸合时 延时闭合的动断触点 20 当操作器件被吸合时 延时闭合和释放时延 时断开的动合触点 21 按钮开关 (不闭锁 ) 22 旋钮开关、旋转开关 (闭锁 ) 23 位置开关 ,动合触点 限制开关 ,动合触点 24 位置开关 ,动断触点 限制开
暖通图例符
通 风 空 调 设 计 统 一 图 例 电动对开式多叶调节阀: (电讯号比例调节风阀) 电动多叶送风(排烟)口:电讯号瞬间开启或就地手动开启,电动或手动复位。 定风量调节阀: 70℃防火阀: 70°C熔断关闭,手动复位。 150℃防火阀: 150°C熔断关闭,手动复位。 280℃防火阀: 280°C熔断关闭,手动复位。 70℃防火调节阀: 70°C熔断关闭,手动复位;手动调节风量。 280℃防火调节阀:电讯号瞬间自动开启 (或关闭 ), 并输出电信号 ,280℃熔断关闭 ,电动或手 动复位。 70℃电动防火阀:电讯号瞬间自动关闭 , 并输出电信号 ;电讯号再次自动开启 ,70℃熔断关闭 , 电动或手动复位。 280℃电动防火阀:电讯号瞬间自动关闭 ,并输出电信号 ;电讯号再次自动开启 ,280℃熔断关 闭 ,电动或手动复位。 电动密闭阀: 风管止回阀: 加压阀:常闭,电讯号自动开启。 单层
1)非参数化多态(Ad-hoc polymorphism):
a)函数重载(Function Overloading)
b)运算符重载(Operator Overloading)
2)参数化多态(Parametric polymorphism)
c)模板(Template)
其实非参数化多态和参数化多态并不冲突,而且相辅相成,它们混合使用能够带来更大的灵活性,函数模板重载就是很好的例子:
template
T max(const T& lhs, const T& rhs)
{
return lhs > rhs "para" label-module="para">
}
template
T max(const T& fst, const T& sec, const T& thd)
{
return max(max(fst, sec), thd);
}
使用:
max(1, 3, 5);
max(2.4, 4.2);
两个重载函数必须在下列一个或两个方面有所区别:
1、函数有不同参数。
2、函数有不同参数类型,
C++的这种编程机制给编程者极大的方便,不需要为功能相似、参数不同的函数选用不同的函数名,也增强了程序的可读性。
C++运算符重载的相关规定如下:
(1)不能改变运算符的优先级;
(2)不能改变运算符的结合型;
(3)默认参数不能和重载的运算符一起使用;
(4)不能改变运算符的操作数的个数;
(5)不能创建新的运算符,只有已有运算符可以被重载;
(6)运算符作用于C++内部提供的数据类型时,原来含义保持不变。
不同编程范例中的表现形式
注:由于C 同时支持下面要提到的三种编程范例(Programming Paradigm) ,所以就用C 语言为例来说明
C 中对静多态的支持方式有:全局函数重载和运算符重载。
全局函数重载代码:
一下代码中均不考虑函数的返回类型,因为C 中不允许只有函数类型不同的重载。
1)参数个数不同而参数类型相同(对应位置):
void defParamNum(int paramFst);
void defParamNum(int paramFst, double paramSec);
2)参数个数相同而参数类型不同:
void defParamType (int paramFst, double paramSec);
void defParamType (double paramFst, int paramSec);
3)参数个数和参数类型都不相同:
void defBoth(int paramFst);
void defBoth(double paramFst, int paramSec);
运算符重载代码:
其实运算符重载也是一种函数重载。其中多了一些限制,比如一元运算符、二元运算符所要求的参数个数,还有运算符重载的元型(Prototype)都有明确的规定,再就是一些像C语言等不支持运算符重载,所以这里单独列出来。
一元运算符重载:(负值运算符 operator -)
Complex operator – (const Complex& elem)
{
// 复数temp的值为0 0i
Complex temp;
// 将temp的实部设为elem实部负数
temp.setReal(-elem.getReal());
// 将temp的虚部设为elem虚部的负数
temp.setImage(-elem.getImage());
// 返回temp复数,此时temp就是elem对应的负数了
return temp;
}
二元运算符重载:(加法运算符 operator )
Complex operator (const Complex& lhs, const Complex& rhs)
{
// 复数temp的值为0 0i
Complex temp;
// 将temp的实部设为lhs和rhs实部的和
temp.setReal(lsh.getReal() rhs.getReal());
// 将temp的虚部设为lhs和rhs虚部的和
temp.setImage(lsh.getImage() rhs.getImage());
// 返回temp复数,此时的temp就是lhs和rhs的和
return temp;
}
其实面向对象编程(Object-Oriented Programming)中也表现为函数重载和运算符重载。
函数重载:成员函数重载,静态成员函数(static)重载,虚函数重载,友元函数重载。
class Complex {
public:
// 构造函数重载:
Complex() : m_real(0), m_image(0) { };
Complex(double real, double image) : m_real(real), m_image(image) { };
// 静态成员函数重载:不恰当的例子
staticvoid staticFunc()
{
std::cout << "staticFunc()" << std::endl;
}
staticvoid staticFunc(int oneParam)
{
std::cout << "staticFunc(int oneParam)" << std::endl;
}
// 虚函数重载:不恰当的例子
virtualvoid virtualFunc()
{
std::cout << "virtualFunc()" << std::endl;
}
virtualvoid virtualFunc(int oneParam)
{
std::cout << "virtualFunc(int oneParam)" << std::endl;
}
// 虚函数重载:不恰当的例子。其友元函数就是一般的全局函数
friendvoid friendFunc();
friendvoid friendFunc(int oneParam);
// 运算符重载:Comple Comple
// Complex Complex成员版本:允许一个complex对象和另一个Complex对象相加
Complex operator (const Complex& elem)
{
return Complex(m_real elem.m_real, m_image elem.m_image);
}
// Complex double成员版本:允许一个complex对象和另一个double对象相加
// 只能是Complex double,不能是double Complex
Complex operator (double elem)
{
return Complex(m_real elem, m_image);
}
// Complex Complex友元版本:允许一个complex对象和另一个Complex对象相加
friend Complex operator (const Complex& lsh, const Complex& rhs)
{
return Complex(lsh.m_real rhs.m_real, lsh.m_image rhs.m_image);
}
// Complex double友元版本:允许一个complex对象和另一个double对象相加
// 只能是Complex double,不能是double Complex
friend Complex operator (const Complex& lsh, double rhs)
{
return Complex(lsh.m_real rhs, lsh.m_image);
}
// double Complex友元版本:允许一个double对象和另一个Complex对象相加
//只能是double Complex,不能是Complex double
//和上面的Complex double友元版本相辅相成
friend Complex operator (double lhs, const Complex& rhs)
{
return Complex(lhs rhs.m_real, rhs.m_image);
}
private:
double m_real;
double m_image;
};
void friendFunc()
{
std::cout << "virtualFunc()" << std::endl;
}
void friendFunc(int oneParam)
{
std::cout << "virtualFunc(int oneParam)" << std::endl;
}
运算符重载:运算符成员式重载,运算符友元式重载。
注:见Complex类定义中的运算符重载部分!
在C 中,泛型编程(Generic Programming) 是通关过模板来实现的,然而模板不是与上述两种编程范例有所不同,它必须依附于上述的某种范例,在某范例的基础上来实现,就像面向对象和过程化编程的关系一样。下面就是模板分类:
按泛化对象可分为:
1)类型泛化(Type):
template
class List {
// ...
};
List iList; // iList是能够存储int类型的链表对象
2)数值泛化(Value):
template
class Bit {
// ...
};
Bit<3> bit3; // bit3是长度为3位的位对象
3)数值和类型泛化(Type & Value):
template
class Array {
// ...
};
Array iArray3; // iArray3是能够存储3个int类型的数组对象
按泛化的载体可分为:
函数模板:
template
void functionGeneric()
{
// ...
}
类模板:
template
class classGeneric {
// ...
};