BlueDog 关于标准C++有关问题的解答
Author : BlueDog E-mail : [email protected]
///////////////////////////////////////////////////////////////////////////////////
// // 原创作品,欢迎转载,务必注明版权及出处。请在你转载时加上以下一行 // // // // BlueDog 原创 出处: www.csdn.net E-mail: [email protected] // // // /////////////////////////////////////////////////////////////////////////////////
需要申明的是我是一个C++的菜鸟,这篇文章只是为了与大家交流。以下是我在学习C++中自已提出的一些问题并经过自已的思考,参考MSDN的说明以及查看VC定义的头文件而解答的。当然里面可能会有错误或者解答的不完全,也希望大家指正。没有太多的想法,一切只是为了大家的共同提高。
一、为什么在使用String之前需要使用 using namespace std这样一句? Essential C++告诉我标准程序库所提供的任何事物,都被封装在命名空间std内。这样子可以避免产生命名冲突。你看到这句话一定想要挖开里面的东东,看看Microsoft是如何做的 很奇怪的我没有看到我所想要找的 namespace std { ... } 但是我注意到有 _STD_BEGIN 和 _STD_END 在几乎每个标准库头文件中。如是我想Microsoft的有宏定义嗜好的程序员一定又在用#define这个法宝。我只需查找_STD_BEGIN的定义就好了。再一次感谢Microsoft在VC中提供的 Find in Files...功能,听到硬盘一阵狂响后我看到了在Yvals.h中定义的STD家族的几行。(当然你也可以用GREP这个程序来查找,只是没有VC这个方便吧了!) #if defined(__cplusplus) #define _STD std:: #define _STD_BEGIN namespace std { #define _STD_END }; #define _STD_USING #else #define _STD :: #define _STD_BEGIN #define _STD_END #endif /* __cplusplus */
很明显,Microsoft已经将标准库封在命名空间std中了,所以下次我们要使用时一定不要忘记了加上 using namespace std; 呵呵
二、关于list::list的定义说明几点(Micrsoft VC 6.0版本) 对于list的使用大家一定不会陌生,可是一定会对如何实现这些是一些疑惑的,我也是如此。我一直想知道list是如何实现其定义的。好的,首先我们看到MSDN中给出list::list的实现 list::list explicit list(const A& al = A()); explicit list(size_type n, const T& v = T(), const A& al = A()); list(const list& x); list(const_iterator first, const_iterator last, const A& al = A()); 说明list有四种初使化方式,但我对于这四个定义有几个问题 1. explicit 是作什么用的? explicit 的中文意义是"外在的" ,其反意词是 implicit 那么它有什么特点,让我们来看一个例子(MSDN中有) class X { public: explicit X(int); file://正确 explicit X(double) { file://正确 // ... } };
explicit X::X(int) {} file://不正确 ... 说明:explicit 仅能用于类定义的内部 还有一个例子(定义为以上正确定义的类)
void f(X) {} void g(int I) { f(i); // 错误 } void h() { X x1(1); // 正确 } 如果没有explicit定义,f(i)是可以通过的,因为编译器可以实现一个隐式转换 int->(implicit) X 用i来构造一个匿名X类,作为f()的参数。 而由于有了explicit定义,故而此一步无法实现。 MSDN的原文是: The function call f(i) fails because there is no available implicit conversion from int to X.
另外:需要注意的是 explict 不参定义多参数构造函数,否则引起其他构造函数不能隐式转换。 2.我的第二疑问是explicit list(size_type n, const T& v = T(), const A& al = A()); 中 const T & v= T() 代表什么? 当我问自已这问题时,我注意到我们声明一个list变量时可以用 list<int> ilist1(10) file://声明内含10个元素,元素值为默认值。 list<int> ilist2(10,5) file://10个元素,元素值均为5 两种方式来定一个初使元素一定的list变量 注意到 T() 把 T 用int代替,得到 const int & v=int(); 哈哈, 原来如此简单! 3.list(const list& x)的意义 这是一个典型的拷贝构造函数。 因为我们可以用 list <string> slist; ... list<string> slist2(slist) file://将slist复制给slist2 至于为什么要用拷贝构造函数,你不会说你不知道吧!

|