Chinaunix首页 | 论坛 | 博客
  • 博客访问: 177196
  • 博文数量: 36
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-04 12:39
文章分类

全部博文(36)

文章存档

2010年(1)

2009年(35)

我的朋友

分类: LINUX

2009-08-12 22:10:20

对string类型,一定要注意
size() and length()
返回的数值未必相等,如果我们使用了reserve()函数为string预留了一些空间,则length()返回的是预留的大小,而size()永远返回string内部真正的内容的长度,所以,我们要尽可能的使用size(),我看到有些文章上说length()是size()的同义词,他们总是返回同样的结果,经验证,在GCC3.x平台并不是如此,不过也许其他平台是这样的。也就是我们一定要注意这个问题。



类的友缘函数是有命名空间的,只有在同一个命名空间的友元函数才能访问同一个命名空间的类的内部似有变量。

比如
namespace test
{
class A
{
    public:

    private:
        int m;
        friend void print(A& a);
}
}
如果我这时候实现print函数为
vodi print(A& a)
{
    cout << a.m << endl;
}

这是不对的,因为print的命名空间和A不在一个,所以无法访问的,上面的代码编译会错误,提示就是
m is private, cann't access 等等,

error: `std::string ***' is private
****.cpp:284: error: within this context

这时候我们必须提供命名空间的支持才行,比如

void test::print(A& a)
{
    cout << a.m << endl;
}
这样就可以了,因为在同一个命名空间内部,当然,如果我们不将print的实现放在cpp文件中,而是直接放在h文件中的test命名空间内部,当然没有问题,但是这和我们手动添加命名空间的背后的道理是一样的,就是只有在同一个命名空间内部的友元函数才能该命名空间内部的类的内部私有变量。这个问题一定要记住。


阅读(1113) | 评论(6) | 转发(0) |
0

上一篇:C++的enum类型

下一篇:SED 非常有用

给主人留下些什么吧!~~

raymond19842009-08-27 23:41:56

istream 的Read是不会添加结束符号的,所以一定要记得自己添加,或者控制好使用的长度

raymond19842009-08-24 14:26:33

上面这条大致的错误就是,BASE CLASS is an inaccessible base of SUB CLASS[

raymond19842009-08-24 14:25:53

如果你看到某个子类不可访问基类的方法,数据之类的 注意: 你的继承关键字是不是写错了,比如你写成了private或者protected继承,这样sub class是无法访问parent的,还有,如果你没有些,那么默认是private,也很恐怖。

raymond19842009-08-18 22:30:38

在读取或者写入只有一个buffer的情况下(网络程序很多都会这样),在读取下一个记录之前,一定要restate原来的记录的初始状态,否则就会一篇混乱。从另一个角度来说,如果作deserialize,则所有的数据都是必须被清空的。

raymond19842009-08-14 21:01:43

如果使用递归遍历的话,注意参数一定要传node的指针,而不是传入某个node的孩子的列表,如果你传了列表,node的其他信息就无法传递,也就是说你在这个递归函数里面使用的只是root node的信息,这是非常恐怖的,会让你觉得莫名其妙。我原来一直觉得传node和传孩子不同,现在终于明白了,任何时候都传node是没有错的。