随笔 - 4  文章 - 2  trackbacks - 0
<2005年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用链接

留言簿(2)

随笔分类

随笔档案

文章档案

相册

收藏夹

搜索

  •  

最新评论

  • 1. re: 开始
  • @socketref
    我也是今天才开始学的,和你一起努力啊
  • --AJ
  • 2. re: 开始
  • 没有大量的e实战开发经验,2个月是不能体验和领悟c++的精髓
  • --socketref

阅读排行榜

评论排行榜

        在Primer 的第27页发现其的源代码使用了一个 Explicit 关键字 ,以前从未用到。不解其意。得到资料如下:
        主旨就是申明在使用单一操作符时,避免隐式转换。强行要求使用显示转换





----------------------------------------------------------------------------------------------------------

带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:

class C {
int i;
//...
public:
      C(int i);//constructor and implicit conversion operator
//as well
};

void f() {

C c(0);

c = 5; //将 5 隐式转换为 C 对象,然后赋值

}

编译器重新编辑上述例子代码,如下:

//////////////////////////////////////////////////////////////////////////////////////////
//"c=5;" 被编译器转换成下面这个样子:
/////////////////////////////////////////////////////////////////////////////////////////

C temp(5);// 实例化一个临时对象,
c = temp; // 用 = 赋值
temp.C::~C(); // temp 的析构函数被激活

在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:

class String {
int size;
char *p;
//..
public:
       String (int sz); //这里不希望进行隐式转换操作
};
void f ()
{
    String s(10);

    // 下面是一个程序员的编码;发生一个意想不到的转换:

    s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
}

为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:

class String {
int size;
char *p;
//..
public:
       // 不要隐式转换
       explicit String (int sz);
       String (const char *s, int size n = 0); // 隐式转换
};

void f ()
{
    String s(10);

    s = 100; // 现在编译时出错;需要显式转换:

    s = String(100); // 好;显式转换
    s = "st";        // 好;此时允许隐式转换
}
posted on 2005-11-28 12:08 郭汉 阅读(769) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理