免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2041 | 回复: 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
2 [报告]
发表于 2005-11-08 09:44 |只看该作者
我觉得引用的是指针呀,所以要用a->***,到于什么解引用,我听得很少,可能接触C++太少吧

论坛徽章:
0
3 [报告]
发表于 2005-11-08 10:09 |只看该作者
count_是个指针吧,都delete count_了,所以new int里面要用*来解引用,解的是a->count_里的count_

论坛徽章:
0
4 [报告]
发表于 2005-11-08 10:13 |只看该作者
還是不明白這個 解引用的含義~~~~能否説明白點哦。。這個詞好難懂哦。。謝ing ~~

论坛徽章:
0
5 [报告]
发表于 2005-11-08 10:56 |只看该作者
dereference,由地址找到内容,就是解引用,好像和C++没关系...

论坛徽章:
0
6 [报告]
发表于 2005-11-08 11:09 |只看该作者
count_这个应该是指针。
这个东西和拷贝构造函数没关系的。

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

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

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

原来是LZ乱写...我说怎么看不懂.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP