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

Andy84920 2003-07-29 06:29:23
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的值就直接被改变了,为什么呢?
...全文
31 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
King_Dragon 2003-08-13
  • 打赏
  • 举报
回复
3、因为每个成员函数都包含一个隐含的this指针(编译器在编译程序代码时会自动生成),指向它所属的类实例的起始地址,通过this指针,成员函数就可以直接访问数据成员了。
例如:EG:
class base
{
private:
int a ;
double b;
public:
update (int x, double y);
}
伪代码可能是这样:
base::updata (int x, double y, base* this)
{
this->a = x;
this->b = y;
}
ZZH1983 2003-08-07
  • 打赏
  • 举报
回复
1.这要看你的=运算返回的值,返回*this是没有危险的。
2。以前的str如果是为了放数据的话一定是经过new的。如果没有的话,因该在初始化的过程中
str = NULL;
3.这我想应该是c++的好处。至于为什么会这样,这是一个c++的特性
liangshixing 2003-08-01
  • 打赏
  • 举报
回复
问题3:
类成员变量的作用域是类域,类内部可以直接访问
对于C++编译器而言,它对类生成的每一个对象的成员变量分配一份空间,而各对象共用相同的成员函数。为了区别不同函数对应的操作,编译器自动给每个函数加了一个this指针作参数。成员函数是靠这个参数来区分不同对象的
yjh1982 2003-07-31
  • 打赏
  • 举报
回复
3.编译器看见一个变量没定义,便会找类的成员
eric8231 2003-07-31
  • 打赏
  • 举报
回复
问题1:
如果你的StringBad类的 operater=操作符确实是定义成StringBad & StringBad :perator= (const StringBad & ); 那么只能说明,你在考虑StringBad类的实现时本身就希望返回引用。

我这样说的意思是,写出什么样的定义在于你想要达到什么样的实现方式。 比如在设计一些类的operator=操作符时,经常需要在各种利益之间衡量(比如是返回引用?还是值?)。

对于这里的这个operator= ,返回引用而减少的副本的拷贝,实现了共享(有时是需要的),有时也是一种可取的策略。 当然,共享所付出的代价也是不小的。
eric8231 2003-07-31
  • 打赏
  • 举报
回复
3:
base::updata (int x, double y)
{
a = x;
b = y;
}
编译器会将成员函数中所有对成员变量的访问转换成“this指针”的形式,并在参数列表中加入这个指针:

base::updata (base* this,int x, double y)
{
this->a = x;
this->b = y;
}

这样处理,便无需返回就可改变数据成员的值。

编译器总有办法得到这样的指向当前对象的this指针。
hustli 2003-07-30
  • 打赏
  • 举报
回复
成员函数(非静态)有一个this指针,自然知道对象的内存布局,也就可以直接存取了
luohualiushui 2003-07-29
  • 打赏
  • 举报
回复
3.这个问题可能有点难说清楚
你只要记住在类的成员函数中可以直接操作类成员变量就可以了
jyfcsdn 2003-07-29
  • 打赏
  • 举报
回复
关于问题1
(B中的数据与A中的数据是一个地址咯?那B这个对象与A对象不是共享了一些数据?这样不是很危险吗)
你所说的这种情况是否会发生完全看函数
StringBad & StringBad :perator= (const StringBad & );
的实现是否合理,正确
如果该函数的实现如下面不合理的情况
StringBad & StringBad :perator= (const StringBad & Obj)
{
str = Obj.str; //主要是这一句
len = Obj.str;
}
那么就如你所说的一样,会出现两个实例共享数据的情况。
但是如果实现如你问题2中那样,就不会出现这种情况。

关于问题2
作为良好的设计,在构造函数内,str 应该赋初值null, str 的赋值只能在
Copy Constructor, 以及operator =函数中,或者其它setStr(LPCTSTR)函数中,在这些函数中
肯定有str = new char[...];的语句。这样的话delete [ ] str;这句话,要么删除原来new[]出来的内存,要么delete[] null,这不会有任何影响。

问题三,
抱歉,我没看懂你的意思。


wwj886 2003-07-29
  • 打赏
  • 举报
回复
1,重载赋值运算符是将一个类对象的的值付给了另一个对象,返回了*this
2,delete[]str是删除了原有的str内存,如果原有的str没有分配内存,就不会调用重载的赋值运算符,而用的是拷贝构造函数
3,这是基本数据类型的赋值操作

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧