LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1666|回复: 9

学习过程碰到的几个C++的概念问题!

[复制链接]
发表于 2003-7-29 18:21:11 | 显示全部楼层 |阅读模式
1>
class StringBad
{
     private:
           char *str;
            int len;
            static int num_strings;
     public:
            StringBad (const char *s);
            StringBad();
            ~StringBad();
}
StringBad A ("clear up");
StringBad B;
B = A;
现有:"赋值操作符"原型: StringBad & StringBad :perator= (const StringBad & );
问题:当然我把A赋值给A,(B=A),根据原型它返回的是StringBad的引用,那么就是讲B中的数据与
A中的数据是一个地址咯?那B这个对象与A对象不是共享了一些数据?这样不是很危险吗?

2>
StringBad & StringBad :: operator = ( const StringBad &)
{
   if (this == & st)
         return *this;
   delete [ ] str;
   len = st.len;
   str = new char [len+1];
   strcpy (str,st.str);
   return *this;
}
这是一个赋值过程.其中:delete [] str;目的是释放由于目标对象可能引用了以前分配的数据.
我想问如果目标对象没有引用什么数据这一句将如何作用呢?delete不是只用于用new分配的
内存吗?这个str不一定是由new分配的呀!

3>
对类数据成员的操作问题?
比如一个成员函数对三个数据成员进行操作然后就直接改变了它们的值.
我想不通为什么它这样对成员数据进行操作没有用返回,指针,引用,就可以直接更改了它们的值呢?

EG:
class base
{
    private:
     int a ;
     double b;
    public:
       update (int x, double y);
}
base::updata (int x, double y)
{
    a = x;
    b = y;
}

这样a,b的值就直接被改变了,为什么呢?
发表于 2003-7-29 22:12:30 | 显示全部楼层
没有缩进,太难看了。
发表于 2003-7-29 22:17:08 | 显示全部楼层
1.注意一个问题:const。它不会把参数的ownership(所有权)转移给被赋值的变量。因此,修改B时,不会修改A。另外,这样做只是为了在传递参数时不必创建复本,提高效率。说共享数据,不恰当。
2.呵呵,那就要看这个class的构造函数里面是不是用了new啦,应该是用new啦。
3.这个问题涉及到C++编译的问题了吧。每一个class member在等号左边的时候提供地址值(左值、l值),在等号右边的时候提供变量值(右值、r值)。因此,就算不是引用,也可修改。
发表于 2003-7-30 01:06:12 | 显示全部楼层
1) For B=A, that operator should return a reference to A only if B and A are exactly same object, or your code has a bug.
2) you should check the constructor.
3) sure, member function(method) can use member variables as much as they want.
 楼主| 发表于 2003-8-8 21:04:16 | 显示全部楼层
TO:fingster
1>这样的话,那我不是连修改B的权限也没有?如果我修改B(其实是不可能的吗)肯定会修改A呀,因为它们指向一样的东西.既然A是不能改的,那B就不能改了咯?不是吗?
发表于 2003-8-8 21:44:35 | 显示全部楼层

To Andy84920

你没有弄清变量的值,跟表达式的值的问题。
在A=B中,其实是相当于这样一个函数调用A.operator=(B),所以(A=B)这个表达式的值变成了const StringBad了,而A,B类型都还没有变,他们都还有自己的地址空间,并没有使用想通的地址空间,所以,你还是可以改变他们的值的,如果B不是const型的话。
发表于 2003-8-9 00:25:57 | 显示全部楼层
1、operator=返回的是左侧的引用,也就是*this,对于B=A来说是返回B的引用。对于B中的数据是否跟A的数据指向同一地址,这要视函数的实现,就2的实现的话,B跟A的数据并不是指向同一内存,B的数据指向的是new分配的地址。但如果应用引用记数技术的话,就可能指向同一地址。
2、这个要你在设计class时保证。
3、你已经在成员函数中进行了a、b的赋值行为,a、b的值当然会改变。
发表于 2003-9-18 15:10:50 | 显示全部楼层
C++ 编程不用 char * 表示字符串 而是 std::string
纠缠于一些语法细节,不如花些时间看一看OO编程思想。
学OO编程,还是先学 Java 或 Pathon 好,这样就不会
纠缠于 delele 和 new 之间了。
发表于 2003-9-18 15:40:50 | 显示全部楼层
楼上的理解有错

一般来说使用string vector等保存不知道元素个数的东西

如果元素个数知道了
还是使用普通的char 方便
因为string内部要进行内存申请与释放(使用new delete)
操作的也是堆

所以性能不会像char那样高效 并且他们有一定的保留长度 这个在再次增加少量字符时不用再次分配内存 但是也占用了一定的内存空间
发表于 2003-9-18 15:42:55 | 显示全部楼层
1
在类内部有指针的情况你要自己定义operator = 和 复制构造函数
不然就像你理解的那样
后面的问题根据1的回答就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表