Chinaunix首页 | 论坛 | 博客
  • 博客访问: 175831
  • 博文数量: 65
  • 博客积分: 1790
  • 博客等级: 上尉
  • 技术积分: 460
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-21 23:51
文章分类
文章存档

2012年(8)

2011年(38)

2010年(19)

分类: C/C++

2011-02-24 23:50:39

1,重载运算符参数和返回值选择的规则

a,对任何函数参数,如仅需要从参数中读取而不改变它,缺省按const引用传递它。

b,选择的返回值取决于运算符所期望的类型。如果运算符效果是产生一个新值,需要产生一个作为返回值的新对象。

c,所有赋值运算符改变左值。为支持链式表达式,如(A=B).foo(),所有赋值运算符的返回值对于左值应该是nonconst引用。

d,逻辑运算符,至少得到一个int返回值,最好是bool返回值。

2,按const通过传值方式返回

f(A+B)//A+B是临时对象,自动为const类型

(A+B).g()//A+B结果,规定只有const类型的g()函数才可以调用。防止在很可能丢失的对象中存储有价值的信息。

3,返回效率

return integer(left.i+right.i);//返回临时对象语法,效率高

integer tmp(left.i+right.i);

return tmp;//创建tmp对象,拷贝新对象返回,销毁tmp对象

4,重载赋值符

foo B;//定义foo对象,构造函数

foo A=B;//定义foo对象A,拷贝构造函数foo(&foo)

A=B;//赋值函数foo::operator=

处理“=”时,记住这个差别非常重要:如果对象还没有被创建,初始化时需要的,否则使用赋值运算符“=”。

自动寻找合适的构造造函数

fee f=1;//构造函数fee(int)

fi FI;//定义

fee fum=FI;//构造函数fee(const fi&)

5,类中指针

类对象包含指向别的对象的指针。简单地拷贝一个指针意味着以指向相同的存储单元的对象而结束。

有2个解决方法:

a,最简单技术,拷贝一个构造函数时,拷贝这个指针所涉及的一切。

b,如有要处理许多存储单元并对其初始化时,想避免这种拷贝。使用引用计数reference counting和写拷贝copy-on-write技术。

6,自动创建运算符=

对象如果没有创建type::operator=(type),编译器会自动创建一个,这个运算行为模仿自动创建的拷贝构造函数的行为。

7,自动类型转换

a, 构造函数转换 定义一个构造函数,能把另一类型对象或引用作为它的单个参数,那么这个构造函数允许编译器执行自动类型转换。

class one{public:one(){}};

class two{public: two(const one&){}};

void f(two){}

main(){

  one One;

  f(One);//wants a two,has a one

}

当编译器看到调用函数f(),two:two(one)会被悄悄调用,结果对象two被传递给f()

此时,自动类型转换避免了定义2个f()重载版本的麻烦。代价是隐藏了构造函数对two的调用。

b,阻止构造函数自动类型转换

构造函数使用关键字explict。

class one{public:one(){}};

class two{public: explicit two(const one&){}};

void f(two){}

main(){

  one One;

  !f(One);//no auto conversion allowed

  f(two(One));//OK,user performs conversion

}

8,运算符转换

关键字operator后跟随想要转换到的类型的方法,将当前类型转换为希望的类型。

class three{

  int i;

public:

  three(int I=0,int=0):i(I){

  }

}

class four{

  int x;

public:

  four(int X):x(X){}

  operator three() const {return three(x);}

};

void g(three){}

main(){

  four Four(1);

  g(Four);

  g(1);//calls three(1,0)

}

构造函数技术,目的类执行转换,运算符技术,源类执行转换。

使用构造函数技术无法实现从用户定义类型向内置类型转换,只有运算符重载可以。

:::自反性

全局重载运算符的自动类型转换可以针对左右任一操作数,而成员版本必须保证左操作数已处于正确的形式。

9,自动类型转换的缺陷

类X可以用operator Y()将它本身转换到类Y,如果类Y有一个单个参数为X的构造函数,表示同样的类型转换。现在编译器有2个从X到Y的转换方法,所以发生转换时,编译器会产生一个不明确指示的出错信息。

运算符原则:

运算符重载存在的原因是为了使编程容易。如果运算符重载对于类的设计者或类的使用者不能提供特别显著的益处,最好不要使用,因为增加运算符重载会使问题混淆。

关于memberwise和bitwise的文章:

1,Memberwise和Bitwise  http://blog.zol.com.cn/1033/article_1032545.html

阅读(886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~