免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2042 | 回复: 14
打印 上一主题 下一主题

關於copy constructor 疑問~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-08 09:22 |只看该作者 |正序浏览
A::A(const A& a)
{
if (this !=&a)
{
delete count_;
count_ = new int [*a->count_];
}
else
count = 0;
return *this;

}

這個我記不清怎麽寫了。。
1、copy constructor 有沒有什麽規範?
2、其中的*a 解引用爲什麽要用解引用呢?   a.count_   不可以麽? 解引用 應該怎樣用?

謝謝

论坛徽章:
0
15 [报告]
发表于 2005-11-08 14:43 |只看该作者
原帖由 renstone921 于 2005-11-8 12:44 发表


const A& a这定义了一个A引用类型的变量,它具有指针变量的语意,但有着普通变量的语法。

所以*a->count_这样的用法应当是错误的。

从你的问题可以得出,你没搞清楚构造函数和赋值运算符重载函数 ...

收藏此贴

论坛徽章:
0
14 [报告]
发表于 2005-11-08 14:15 |只看该作者
BinStrTreeNode &BinStrTreeNode:perator = (const BinStrTreeNode &rhs)
{
if(this != &rhs)
{
_value = rhs._value;
_count = rhs._count;
delete _leftchild;
if(rhs._leftchild)
   _leftchild = new BinStrTreeNode(*rhs._leftchild);
else
   _leftchild = 0;
delete _rightchild;
if(rhs._rightchild)
   _rightchild= new BinStrTreeNode(*rhs._rightchild);
else
   _rightchild= 0;
}
return *this;
}

再次道歉。。学业不精 。。哎 ~~~

论坛徽章:
0
13 [报告]
发表于 2005-11-08 14:10 |只看该作者
原帖由 yarco1 于 2005-11-8 13:12 发表
谢了. 楼上的. 学习了.

原来是LZ乱写...我说怎么看不懂.



是我错了:

class BinStrTreeNode
BinStrTreeNode::BinStrTreeNode():
                                   _count(0),_leftchild(0),_rightchild(0)
{}

BinStrTreeNode::BinStrTreeNode(const BinStrTreeNode& rhs):_value(rhs._value)
{
_count = rhs._count;
if(rhs._leftchild)
   _leftchild = new BinStrTreeNode(*rhs._leftchild);
else
   _leftchild = 0;
if(rhs._rightchild)
   _rightchild= new BinStrTreeNode(*rhs._rightchild);
else
   _rightchild= 0;
}

论坛徽章:
0
12 [报告]
发表于 2005-11-08 14:07 |只看该作者
原帖由 gooderfeng 于 2005-11-8 13:24 发表

lz写的程序是没有问题的,看不明白是因为程序不全

A::A(const A& a)
{
if (this !=&a)
{
delete count_;
count_ = new int [*a->count_];
}
else
count = 0;
return *this;

}

有没搞错a...a是A的一个shili的引用
居然用a->count_指针, 好歹也要a.count_

论坛徽章:
0
11 [报告]
发表于 2005-11-08 13:24 |只看该作者
原帖由 yarco1 于 2005-11-8 13:12 发表
谢了. 楼上的. 学习了.

原来是LZ乱写...我说怎么看不懂.


lz写的程序是没有问题的,看不明白是因为程序不全

论坛徽章:
0
10 [报告]
发表于 2005-11-08 13:12 |只看该作者
谢了. 楼上的. 学习了.

原来是LZ乱写...我说怎么看不懂.

论坛徽章:
0
9 [报告]
发表于 2005-11-08 12:44 |只看该作者
原帖由 yjqyml 于 2005-11-8 09:22 发表
A::A(const A& a)
{
if (this !=&a)
{
delete count_;
count_ = new int [*a->count_];
}
else
count = 0;
return *this;

}

這個我記不清怎麽寫了。。
1、copy constructor 有沒有什麽 ...


const A& a这定义了一个A引用类型的变量,它具有指针变量的语意,但有着普通变量的语法。

所以*a->count_这样的用法应当是错误的。

从你的问题可以得出,你没搞清楚构造函数和赋值运算符重载函数的区别。

在拷贝构造函数调用之前,对象根本是不存在的。
拷贝函数调用成功之后,对香才存在。
你把拷贝构造函数的功能和赋值运算符重载搞混了。

构造函数是没有返回值得,赋值运算符重载才会有返回值。

赋值运算符重载的语意就是把一个对象的数据复制到另一个同类的对象里去,这个前提就是对象已经存在了。

一句话说,就是构造是一个从无到有的创建的过程,而赋值运算符重载是一个修改的过程。
所以,如果是拷贝构造函数的话,应当如下写:
假定了定义如下

  1. class A
  2. {
  3. public:
  4.     A();
  5.     A(const A& a);
  6.     A& operator=(const A& );


  7. private:
  8.     int* datas;
  9.     int count_;
复制代码


[code]
A::A(const A& a)
{
    if (a.count_ <= 0)
    {
       cerr << "Invalid argument" << endl;
       return;
    }
    count_ = a.count_;         //这是个由无到有的过程,需要重新分配数据。
    datas = new int[count_];
    if (NULL == datas)
    {
        cerr << "No memory" << endl;
        return;
    }
    for (int i = 0; i < count_; ++i)
        datas = a.datas;
}

如果是赋值运算符重载函数的话,
A& operator=(const A& a)
{
    if (this != &a)
    {
        delete[] datas;                             //只有进行赋值运算符重载时,才有必要进行销毁旧数据。这是个送旧迎新的过程。
        count_ = a.count_;                       //数据复制
        datas = new int[count_];
        if (NULL != datas)
        {
            for (int i = 0; i < count_; ++i)
            {
                 datas = a.datas;
            }
        }
        else
        {
            cerr << "No sufficient memory" << endl;
         }
    }
    return (*this);      
}
[code]

论坛徽章:
0
8 [报告]
发表于 2005-11-08 11:34 |只看该作者
豁然开朗阿。。。谢ing ~~~

论坛徽章:
0
7 [报告]
发表于 2005-11-08 11:21 |只看该作者
->的优先级高于*
所以解的士count_
所以count_是一个指针
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP