BlueDog 关于标准C++有关问题的解答<二> (转)

C++标准库与list详解
本文详细解析了C++标准程序库中的命名空间std及其使用原因,并深入探讨了list容器的多种构造方法,包括拷贝构造函数的应用场景。
BlueDog 关于标准C++有关问题的解答 (转)[@more@]

BlueDog 关于标准C++有关问题的解答

Author : BlueDog
E-Mail : zhenghesoft@etang.com

/////////////////////////////////////////////////////////////////////////////////// 

// //  原创作品,欢迎转载,务必注明版权及出处。请在你转载时加上以下一行  //
//  //
//  BlueDog 原创  出处: .NET">www.youkuaiyun.com  E-mail: zhenghesoft@etang.com  // 
//  //
/////////////////////////////////////////////////////////////////////////////////

  需要申明的是我是一个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 ilist1(10) file://声明内含10个元素,元素值为默认值。
  list ilist2(10,5) file://10个元素,元素值均为5
 
  两种方式来定一个初使元素一定的list变量
  注意到 T()
  把 T 用int代替,得到
  const int & v=int();
  哈哈, 原来如此简单!
 
  3.list(const list& x)的意义
  这是一个典型的拷贝构造函数。
  因为我们可以用
  list slist;
  ...
  list slist2(slist) file://将slist复制给slist2
  至于为什么要用拷贝构造函数,你不会说你不知道吧!
 
 
 
 
 

 

 


 
 

 

 

 

 

 

 

 

     


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-991679/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-991679/

@startuml left to right direction skinparam rectangleBackgroundColor #E0E0E0 skinparam usecase { BackgroundColor #FFFFFF BorderColor #333333 } ' 完全隐藏所有构造型显示 skinparam stereotype { Visibility false } ' 直接为每个用例设置颜色 skinparam usecase { BackgroundColor<<blue>> #BBDEFB BorderColor<<blue>> #1976D2 BackgroundColor<<orange>> #FFCCBC BorderColor<<orange>> #E64A19 } actor 用户 as User rectangle "网络安全态势感知平台" { (登录系统) as UC1 <<blue>> (注册) as UC2 <<orange>> (查看安全态势仪表盘) as UC3 <<blue>> (查看实时告警) as UC4 <<orange>> ' ... 其余用例定义保持不变 (多源数据采集) as UC5 <<blue>> (数据解析与标准) as UC6 <<orange>> (威胁情报融合) as UC7 <<blue>> (安全事件分析) as UC8 <<orange>> (风险监测与评估) as UC9 <<blue>> (修改风险阈值) as UC10 <<orange>> (异常行为检测) as UC11 <<blue>> (动态基线管理) as UC12 <<orange>> (终端安全管控) as UC13 <<blue>> (外设与端口管理) as UC14 <<orange>> (安全预警与通知) as UC15 <<blue>> (分级响应处置) as UC16 <<orange>> (态势评估报告生成) as UC17 <<blue>> (导出评估报告) as UC18 <<orange>> (攻击仿真测试) as UC19 <<blue>> (仿真结果分析) as UC20 <<orange>> (可视化图表交互) as UC21 <<blue>> (下钻分析) as UC22 <<orange>> } ' 关系定义保持不变... User --> UC1 : 登录 User --> UC3 : 查看仪表盘 User --> UC5 : 数据采集 User --> UC7 : 威胁融合 User --> UC9 : 风险评估 User --> UC11 : 异常检测 User --> UC13 : 终端管控 User --> UC15 : 预警通知 User --> UC17 : 报告生成 User --> UC19 : 攻击仿真 User --> UC21 : 图表交互 UC1 <.. UC2 : <<extend>> UC3 ..> UC4 : <<include>> UC5 ..> UC6 : <<include>> UC7 ..> UC8 : <<include>> UC9 <.. UC10 : <<extend>> UC11 ..> UC12 : <<include>> UC13 ..> UC14 : <<include>> UC15 ..> UC16 : <<include>> UC17 <.. UC18 : <<extend>> UC19 ..> UC20 : <<include>> UC21 ..> UC22 : <<include>> @enduml修改代码
08-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值