杰 & C++ & Python & DM

C++中关于构造函数的几个问题

首先我们给出一个类的例子

class CStack
{
public:
       CStack();  
       CStack(
int  size=100); 
       CStack(
const CStack& st);   //复制构造函数,注意使用引用
private:    
       
int _size;
       
int _count;
       
int* _s;           
}
;
CStack::CStack(
const CStack& st)
{
      _size
=st._size;
      
if(_size > 0)
      
{
               _s 
= new int[_size];
               _count 
= st._count;         
               
for(int i=0; i<_count; ++i)
                       _s[i] 
= st._s[i];             
      }
         
      
else
      
{
          _s 
=  0;
          _count 
= 0;           
      }
                                            
}


int main()
{
    CStack st;
    
return 0;    
}



一. 在main()中,对象st不知道该调用哪一个构造函数,因为CStack()和CStack(int  size=100)都满足条件,此时正确的编译器会立即标示这种冲突,强迫实现者解决这个问题。

二. 假设我们已经有了一个CStack对象s1
CSatck s2=s1;      //这个句子将会调用复制构造函数
CStack s3 = CStack(200);   //这个句子将会做什么呢?

首先,产生一个临时CStack对象,不妨命名为sss,并调用构造函数CStack::CStack(200),随后执行复制构造函数。也就是说,它相当于

CStack sss(200);
CStack s3(sss);

这很浪费时间,不过,大多数编译器还是能优化这种语句。但是我们为什么不养成一个好的习惯,直接写成
CStack s3(200)呢?

posted on 2009-04-29 17:45 jaysoon 阅读(314) 评论(0)  编辑 收藏 引用 所属分类: C++


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


<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

收藏夹

C++

搜索

最新评论

阅读排行榜

评论排行榜