LinuxSir.cn,穿越时空的Linuxsir!

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

一个操作符重载问题!

[复制链接]
发表于 2003-8-13 00:16:01 | 显示全部楼层 |阅读模式
EG:

class A
{
   private:
            char *str;
    ...
   public:
            ostream & operator<< ( ostream & os, const A & dbl);
}


ostream & operator<< ( ostream & os, const A & dbl)
{
    os << dbl.str;
    return os;
}

如果把const A & dbl  改成  A & dbl
编译器出错.说str 为private.
为什么一定要加上 cosnt 呢?
发表于 2003-8-13 01:24:34 | 显示全部楼层
const是不可修改的意思

这个地方因为是成员函数
我想不用const也可以吧

再想想原因先
发表于 2003-8-13 03:16:46 | 显示全部楼层
ostream & operator<< ( ostream & os, const A & dbl)
{
os << dbl.str;
return os;
}
你的这个函数是个全局函数,当然不可以访问A的private变量。
注意这里的ostream &A:perator<< ( ostream & os, const A & dbl);是你声明的另外一个类成员函数。
 楼主| 发表于 2003-8-13 23:04:51 | 显示全部楼层
是这样的:
class A
{
private:
char *str;
...
public:
friend ostream & operator<< ( ostream & os, const A & dbl);
}


ostream & A:perator<< ( ostream & os, const A & dbl)
{
os << dbl.str;
return os;
}

db1也必需是const吗?
我是这个类的友元函数,为什么不可以不用const 来访问private成员呢?
发表于 2003-8-13 23:12:22 | 显示全部楼层
private成员就是只能由成员函数访问。如定义一个且有私有成员的类:
class A {
private:
int i;
}
然后定义一个对象:
A a;
用a来访问成员i,如a.i之类的,就是不允许的。
在你的例子中,既然str是private,那么用A的实例对象dbl去直接访问str就不对,所以不能写dbl.str。要通过成员函数来访问。
 楼主| 发表于 2003-8-13 23:16:55 | 显示全部楼层
private 成员可以通过友元函数访问的呀!为什么说只有成员函数才可以访问???
你的意思是说:
ostream & A:perator<< ( ostream & os, const A & dbl)
{
os << dbl.str;
return os;
}
dbl.str是个错误???不管是const A & dbl,还是 A & dbl  ???
跟我要问的const 没有关系?
发表于 2003-8-13 23:34:36 | 显示全部楼层
你用的什么编译器亚?
我用dev-c++中的gcc编译没有问题,两种情况都通过
发表于 2003-8-14 08:29:19 | 显示全部楼层
最初由 Andy84920 发表
private 成员可以通过友元函数访问的呀!为什么说只有成员函数才可以访问???
你的意思是说:
ostream & A:perator<< ( ostream & os, const A & dbl)
{
os << dbl.str;
return os;
}
dbl.str是个错误???不管是const A & dbl,还是 A & dbl  ???
跟我要问的const 没有关系?

不好意思,说错了。你应该把你的编译时的错误提示贴出来,让我们看看到底是什么问题。
我把下面这个程序编译通过了,在g++下没有问题。

  1. #include<iostream>
  2. using namespace std;

  3. class A
  4. {
  5. private:
  6.         char *str;
  7. public:
  8. friend ostream & operator<< ( ostream & os, const A & dbl);
  9. };


  10. ostream & operator<< ( ostream & os, const A & dbl)
  11. {
  12.         os << dbl.str;
  13.         return os;
  14. }

  15. int main()
  16. {
  17.         A x;
  18.         cout<<x<<endl;
  19. }
复制代码
 楼主| 发表于 2003-8-14 23:31:43 | 显示全部楼层
TO:kj501

这样当然能通过编译。
我是说这样:
#include<iostream>
using namespace std;

class A
{
private:
        char *str;
public:
friend ostream & operator<< ( ostream & os,  A & dbl);
};


ostream & operator<< ( ostream & os, A & dbl)
{
        os << dbl.str;
        return os;
}

int main()
{
        A x;
        cout<<x<<endl;
}

注意 A前面不要const的情况!
发表于 2003-8-15 01:04:22 | 显示全部楼层
你这个也可以通过
>gcc -v
Reading specs from /usr/lib/gcc-lib/i386-linux/3.3.1/specs
Configured with: ../src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --with-system-zlib --enable-nls --without-included-gettext --enable-__cxa_atexit --enable-clocale=gnu --enable-debug --enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc i386-linux
Thread model: posix
gcc version 3.3.1 (Debian)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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