分享
 
 
 

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

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

Author : BlueDog

E-mail : zhenghesoft@etang.com

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

// // 原创作品,欢迎转载,务必注明版权及出处。请在你转载时加上以下一行 //

// //

// BlueDog 原创 出处: www.csdn.net 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<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

至于为什么要用拷贝构造函数,你不会说你不知道吧!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有