C++ 一些小的TIPS
时间:2009-08-12 来源:raymond1984
对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命名空间内部,当然没有问题,但是这和我们手动添加命名空间的背后的道理是一样的,就是只有在同一个命名空间内部的友元函数才能该命名空间内部的类的内部私有变量。这个问题一定要记住。
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命名空间内部,当然没有问题,但是这和我们手动添加命名空间的背后的道理是一样的,就是只有在同一个命名空间内部的友元函数才能该命名空间内部的类的内部私有变量。这个问题一定要记住。
相关阅读 更多 +