TC++PL阅读笔记4

二元运算符可以定义为取一个参数的非静态成员函数,也可以定义为取两个参数的非成员函数。对于任何二元运算符@,aa@bb   可以解释为aa.operator@(bb),  或者解释为operator@(aa,bb)。

对于一元运算符,无论它是前缀还是后缀的,都可以定义为无参数的非静态成员函数,或者定义为取一个参数的非成员函数,@aa == aa.operator@() == operator@(aa)。aa@ == aa.operator@(int) == operator@(aa,int)。

不能定义只对指针进行操作的运算符函数。具有内部类型为参数的成员函数自定义运算符不具备交换性。

+=和*=这样的组合赋值运算符,比他们“貌似简单”的对应物+和*,定义起来更加简单,并且效率上也更好,运算上比后者减少了一个临时对象。

在类本身之中定义那些本质上就需要修改其第一个参数值的运算符,如+=,*=。而像+这样给予参数的值简单产生新值的运算符,则可以在类之外利用前者类实现中的基本运算符来定义。如:
class complex{ complex& operator+=(complex a);}
complex operator + (complex a, complex b)
{ complex r = a; return r += b;//通过+=成员运算符函数 }

如果某个类显示地申明了构造函数,那么就不能用初始式列表作为变量的初始式了。(struct类型的变量经常会用初始式列表来初始化)

注意一些隐式调用构造函数的情形,初始化、赋值、copy、类型转化。隐式转换不会被用于非const的引用参数。

复制构造函数采用引用参数的原因,如果是值参数类型,参数会有复制操作,这样就会造成无穷的递归。标准的类型是const T&。

转换运算符,X::operator T(),定义从一个X到T的转换,如Tiny::operator int() const{}//作为转换目标的类型int是运算符名字的一部分,不能作为转换函数的返回值类型而重复写出。尽量少定义转换运算符。

一个常规的成员函数申明描述了三件在逻辑上相互不同的事情:1、该函数能访问类申明的私有部分;2、该函数位于类的作用域中;3、该函数必须经由一个对象去激活(需要一个this指针)。通过将函数申明为static,可以让函数只具有1和2性质,通过将一个函数申明为friend,可以让函数只具有1性质。

一个友元函数需要在某个外围作用域里显示申明,或者以它的类或由该类派生的类作为一个参数,否则就无法调用这个友元了。友元函数基本上是尽量少使用,最多的地方是不需要左值的运算符重载。

减少复制的一个缓冲技术,最简单的一个,采用一个静态对象的缓冲区,如:
const int max_matrix_temp = 8;
Matrix& get_matrix_temp()
{  static int nbuf = 0;
   static Matrix buf[max_matrix_temp];
   if (nbuf == max_matrix_temp) nbuf = 0;
   return buf[nbuf++];
}// 非常简单的方法,有很多不足的。

只有一个参数的构造函数也定义了一个隐式转换。通过将构造函数申明为explicit可以抑制隐式转换,explicit表示必须显示调用。

通过重载operator()(称为应用运算符),可以使对象具有函数的行为,在for_earch()中很有重要的重要。operator()()的参数列表将被求值,并按普通的参数传递规则检查。如:
class ADD{
        complex val;
public:
        ADD(complex c){val = c;}
        ADD(double r, double i){val = complex(r,i);}

        void operator()(complex & c) const {c += val;}
}
void h(vector & aa, list & ll, complex z){
        for_earch(aa.begin(), aa.end(), ADD(2,3));  //将complex(2,3)加到向量的每个元素上。
        for_earch(ll.begin(), ll.end(), ADD(z));//将z加到表里的每个元素上。
}
operator[]和operator()都必须作为成员函数,它们是需要左值的运算符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值