原作者姓名 robindy
正文
很多人把学习C++语言当成学习VC了
![](/icons/81985dou.gif)
我曾经就走过这样
![](/icons/81985de.gif)
弯路
![](/icons/81985dou2.gif)
当学了很长时间
![](/icons/81985de.gif)
VC后
还是得回过头来学习C
![](/icons/81985jiajia.gif)
语言本身
![](/icons/81985dou2.gif)
那么学习C++从何处入手了?
C++语言相对于C语言来说引入了两个大
![](/icons/81985de.gif)
新东西
![](/icons/81985dou.gif)
![](/icons/81985yi.gif)
个就是面向对象(具体来将就是类
)
![](/icons/81985dou.gif)
另外就是模板技术(模板编程或者叫泛型编程是进来非常流行
![](/icons/81985de.gif)
技术
![](/icons/81985dou.gif)
在C#中虽然还
没有对泛型编程
![](/icons/81985de.gif)
支持
![](/icons/81985dou.gif)
但是相信在将来也
![](/icons/81985yi.gif)
定会加入这
![](/icons/81985yi.gif)
功能)
![](/icons/81985dou.gif)
模板是C++中比较复
杂
![](/icons/81985de.gif)
部分
![](/icons/81985dou.gif)
但是作为
![](/icons/81985yi.gif)
个真正
![](/icons/81985de.gif)
C++
![](/icons/81985chengxu.gif)
员
![](/icons/81985dou.gif)
这部分很重要
![](/icons/81985dou2.gif)
尤其是对C++标准
![](/icons/81985chengxu.gif)
库
![](/icons/81985de.gif)
掌握尤为重要
刚开始
![](/icons/81985de.gif)
时候千万不要直扑VC中
![](/icons/81985de.gif)
各种向导和设计器
![](/icons/81985dou2.gif)
![](/icons/81985yinwei.gif)
依赖开发环境生成
![](/icons/81985de.gif)
很多代码
会把我们搞糊涂
![](/icons/81985dou.gif)
也不利于我们学习C++语言本身
![](/icons/81985dou2.gif)
我
![](/icons/81985de.gif)
建议就是生成
![](/icons/81985yi.gif)
个空
![](/icons/81985de.gif)
控制台工
程
![](/icons/81985dou.gif)
然后自己向里面添加文件
如下就是
![](/icons/81985yi.gif)
个简单
![](/icons/81985de.gif)
控制台
![](/icons/81985chengxu.gif)
:
//robindy/list.cpp
#
![](/icons/81985include.gif)
<iostream>
#
![](/icons/81985include.gif)
<list>
using
![](/icons/81985namespace.gif)
std;
![](/icons/81985main.gif)
{
list<char> coll;
for(char c = \'a\'; c <= \'z\';
![](/icons/81985jiajia.gif)
c)
{
coll.push_back(c);
}
list::const_iterator pos;
for(pos = coll.begin
![](/icons/81985kh.gif)
; pos != coll.end
![](/icons/81985kh.gif)
;
![](/icons/81985jiajia.gif)
pos)
{
cout << *pos << \' \';
}
cout << endl;
![](/icons/81985return.gif)
0;
}
对using
![](/icons/81985namespace.gif)
std;
![](/icons/81985de.gif)
解释:
所谓
![](/icons/81985namespace.gif)
![](/icons/81985dou.gif)
是指标识符
![](/icons/81985de.gif)
各种可见范围
![](/icons/81985dou2.gif)
C++标准
![](/icons/81985chengxu.gif)
库中
![](/icons/81985de.gif)
所有标识符都被定义于
![](/icons/81985yi.gif)
个名为std
![](/icons/81985de.gif)
![](/icons/81985namespace.gif)
中
由于
![](/icons/81985namespace.gif)
![](/icons/81985de.gif)
概念
![](/icons/81985dou.gif)
使用C++标准
![](/icons/81985chengxu.gif)
库
![](/icons/81985de.gif)
任何标识符时
![](/icons/81985dou.gif)
可以有 3种选择:
1、直接指定标识符
![](/icons/81985dou2.gif)
例如std::ostream而不是ostream
![](/icons/81985dou2.gif)
完整语句如下:
std::cout << std::hex << 3.4 << std::endl;
2、使用using关键字
using std::cout;
using std::endl;
以上
![](/icons/81985chengxu.gif)
可以写成
cout << std::hex << 3.4 << endl;
3、最方便
![](/icons/81985de.gif)
就是使用using
std;这样命名空间std内定义
![](/icons/81985de.gif)
所有标识符都有效(曝光)
![](/icons/81985dou2.gif)
就好像它们被声明为全局变量
![](/icons/81985yi.gif)
样
![](/icons/81985dou2.gif)
那么以上语句可以如下写:
cout << hex << 3.4 << endl;
这段
![](/icons/81985chengxu.gif)
用到了标准模板库,在屏幕上打印
![](/icons/81985zifu.gif)
a~z
![](/icons/81985dou.gif)
其中
![](/icons/81985main.gif)
![](/icons/81985hanshu.gif)
![](/icons/81985de.gif)
标记式只有两种是被
C++标准委员会接受
![](/icons/81985de.gif)
![](/icons/81985dou.gif)
只有以下两种写法是符合C++标准
![](/icons/81985de.gif)
![](/icons/81985dou.gif)
是可移植
![](/icons/81985de.gif)
![](/icons/81985dou2.gif)
即:
![](/icons/81985main.gif)
{
}
和
![](/icons/81985main.gif)
(
![](/icons/81985int.gif)
argc, char* argv
![](/icons/81985zhk2.gif)
)
{
}
C
![](/icons/81985jiajia.gif)
在
![](/icons/81985main.gif)
![](/icons/81985kh.gif)
![](/icons/81985de.gif)
末尾定义了
![](/icons/81985yi.gif)
个隐式
![](/icons/81985de.gif)
![](/icons/81985return.gif)
0; 但是在VC中必须显式
![](/icons/81985de.gif)
写出
![](/icons/81985return.gif)
语句
在BCB中可以不写
![](/icons/81985return.gif)
而编译通过
这段
![](/icons/81985chengxu.gif)
中用到了STL中
![](/icons/81985de.gif)
容器:链表
![](/icons/81985dou2.gif)
先是向链表中插入26个字母
![](/icons/81985dou.gif)
然后从遍历链表
![](/icons/81985dou.gif)
输
出
![](/icons/81985zifu.gif)
我不建议初学者
![](/icons/81985yi.gif)
开始就从模板库入手
![](/icons/81985dou.gif)
但是我建议应该逐渐地有意识地学习模板库
![](/icons/81985dou2.gif)
如
我们应该熟悉cout和cin
![](/icons/81985de.gif)
使用方法(位于iostream)
![](/icons/81985dou.gif)
而减少使用老式
![](/icons/81985de.gif)
C
![](/icons/81985hanshu.gif)
库中pr
![](/icons/81985int.gif)
f和sc
anf等
从控制台入手
![](/icons/81985de.gif)
好处就是避免我们理解VC中向导等工具生成
![](/icons/81985de.gif)
其他代码
![](/icons/81985dou.gif)
整个
![](/icons/81985chengxu.gif)
![](/icons/81985de.gif)
流程
很清楚
![](/icons/81985dou2.gif)
新手学习VC
![](/icons/81985de.gif)
![](/icons/81985yi.gif)
大难点就是搞不清楚整个
![](/icons/81985chengxu.gif)
![](/icons/81985de.gif)
流程(从那条语句开始执行
![](/icons/81985dou.gif)
然后
从那条语句退出
![](/icons/81985dou2.gif)
MFC做了太多封装
![](/icons/81985dou.gif)
掩盖了事实
![](/icons/81985de.gif)
真相
![](/icons/81985dou.gif)
^_^)
![](/icons/81985dou2.gif)
通过控制台我们可以很快
地学习C++语言中
![](/icons/81985de.gif)
很多新特性
![](/icons/81985dou2.gif)
如类
![](/icons/81985de.gif)
封装、继承和多态等
![](/icons/81985dou2.gif)
通过这个时期
![](/icons/81985de.gif)
学习
![](/icons/81985dou.gif)
要
能够掌握 3个东西: C++关键字、语法(重点是和面向对象有关
![](/icons/81985de.gif)
![](/icons/81985dou.gif)
以及模板)、C++
标准
![](/icons/81985chengxu.gif)
库(知道如何使用即可
![](/icons/81985dou.gif)
要彻底掌握需要很多时间和精力)
![](/icons/81985dou2.gif)
至于和界面有关
东东(MFC中很大
![](/icons/81985yi.gif)
部分是和界面相关
![](/icons/81985de.gif)
类
![](/icons/81985dou.gif)
所以我认为MFC很臃肿而无聊!回头看过以前
用MFC写
![](/icons/81985de.gif)
![](/icons/81985chengxu.gif)
![](/icons/81985dou.gif)
有
![](/icons/81985yi.gif)
种“垃圾”
![](/icons/81985de.gif)
感觉
![](/icons/81985dou2.gif)
)
自己做个测试:
写
![](/icons/81985yi.gif)
个控制台
![](/icons/81985chengxu.gif)
![](/icons/81985dou.gif)
在其中体现出类
![](/icons/81985de.gif)
继承
![](/icons/81985dou.gif)
![](/icons/81985hanshu.gif)
重载
![](/icons/81985dou.gif)
动态多态(通过虚
![](/icons/81985hanshu.gif)
实现)
数据封装
![](/icons/81985dou.gif)
C++标准库
![](/icons/81985de.gif)
运用
如果你能够轻松搞定
![](/icons/81985dou.gif)
恭喜你
![](/icons/81985dou.gif)
你已经通过C++语言关了
![](/icons/81985dou2.gif)
不过C++实在是
![](/icons/81985yi.gif)
个复杂
东东
![](/icons/81985dou.gif)
其中有各种千奇百怪
![](/icons/81985de.gif)
语法现象
![](/icons/81985dou.gif)
如果没有 3、 5年
![](/icons/81985de.gif)
功力
![](/icons/81985dou.gif)
千万不要说自己懂C+
+
![](/icons/81985dou2.gif)
^_^
推荐书籍
![](/icons/81985smhl.gif)
Thinking in C
![](/icons/81985jiajia.gif)
![](/icons/81985smhr.gif)
(有精力
![](/icons/81985de.gif)
话
![](/icons/81985dou.gif)
可以直接读原版)
![](/icons/81985smhl.gif)
Essential C++
本来我计划继续说说如何来进入C++世界
![](/icons/81985de.gif)
![](/icons/81985dou.gif)
但是琢磨了
![](/icons/81985yi.gif)
下
![](/icons/81985dou.gif)
觉得还是要先解决
![](/icons/81985yi.gif)
个问
题:为什么要学习C++?我觉得在软件Software开发这个行当了里除了为了生计外
![](/icons/81985dou.gif)
学习新东西都
是应该以兴趣为导向
![](/icons/81985de.gif)
![](/icons/81985dou2.gif)
所以撇开我个人对C++
![](/icons/81985de.gif)
偏爱
![](/icons/81985dou.gif)
我想为你树立起学习C++
![](/icons/81985de.gif)
信
心和兴趣
![](/icons/81985dou2.gif)
当初我对自己学习C++
![](/icons/81985de.gif)
第
![](/icons/81985yi.gif)
个忠告就是:不能半途而废!起初是兴趣驱动
后来则是生计所需
![](/icons/81985dou.gif)
最后还是回归到了兴趣
![](/icons/81985dou2.gif)
毕竟我从中得到了乐趣
![](/icons/81985dou.gif)
这就足够了
![](/icons/81985dou2.gif)
在学
![](/icons/81985yi.gif)
个新东西前
![](/icons/81985dou.gif)
解决动机问题很重要
![](/icons/81985dou2.gif)
就如同杀人
![](/icons/81985yi.gif)
样
![](/icons/81985dou.gif)
如果只是突然兴起
![](/icons/81985dou.gif)
那么等尝试
了以后
![](/icons/81985dou.gif)
是没有成就感
![](/icons/81985de.gif)
![](/icons/81985dou2.gif)
革命先烈们为我们作出了很好
![](/icons/81985de.gif)
榜样
![](/icons/81985dou.gif)
就算我们在学习C++
道路上遇到了太多困惑和痛苦
![](/icons/81985dou.gif)
但是我们毕竟为自己
![](/icons/81985de.gif)
信念做了努力
![](/icons/81985dou.gif)
我们知道自己在
做什么
![](/icons/81985dou.gif)
知道自己在追求什么
C++适合做什么样
![](/icons/81985de.gif)
开发?
C++是
![](/icons/81985yi.gif)
门广泛用于工业软件Software研发
![](/icons/81985de.gif)
大型语言
![](/icons/81985dou2.gif)
具有很高
![](/icons/81985de.gif)
复杂性和解决问题
![](/icons/81985de.gif)
能力
![](/icons/81985dou2.gif)
C
++不仅在开发上极具价值
![](/icons/81985dou.gif)
同时在学术界也就有很高
![](/icons/81985de.gif)
价值
![](/icons/81985dou2.gif)
有关C++
![](/icons/81985de.gif)
文章应该可以
用浩如烟海来形容了吧
![](/icons/81985dou2.gif)
C++
![](/icons/81985de.gif)
世界级经典书籍也是数不胜数
![](/icons/81985dou2.gif)
然而
![](/icons/81985dou.gif)
目前开发语言是如
此地繁荣
![](/icons/81985dou.gif)
就连微软也在推出了新
![](/icons/81985de.gif)
开发语言C#
![](/icons/81985dou2.gif)
![](/icons/81985yi.gif)
个不可否认
![](/icons/81985de.gif)
现实是
![](/icons/81985dou.gif)
在低阶
![](/icons/81985chengxu.gif)
设
计领域
![](/icons/81985dou.gif)
C
![](/icons/81985jiajia.gif)
挤压着C同时也在承受着C
![](/icons/81985de.gif)
强烈反弹
![](/icons/81985dou.gif)
前段时间看了据说是微软操作系统源代
码
![](/icons/81985de.gif)
东东
![](/icons/81985dou.gif)
其中很多还是C语言
![](/icons/81985dou2.gif)
而在高阶
![](/icons/81985chengxu.gif)
设计领域
![](/icons/81985dou.gif)
Java和C#正在不断蚕食着C
![](/icons/81985jiajia.gif)
地盘
![](/icons/81985dou2.gif)
也许Java和C#
![](/icons/81985de.gif)
狂潮终将迫使C
![](/icons/81985jiajia.gif)
回归本位— 回到它有着根本性优势
![](/icons/81985de.gif)
开发领域:
低级系统
![](/icons/81985chengxu.gif)
设计、高级大规模高性能应用设计、嵌入式
![](/icons/81985chengxu.gif)
设计、通用
![](/icons/81985chengxu.gif)
设计以及数
值科学计算等
![](/icons/81985dou2.gif)
果真如此
![](/icons/81985dou.gif)
我认为这未尝不是
![](/icons/81985yi.gif)
件好事
![](/icons/81985dou2.gif)
电力系统软件Software所要求
![](/icons/81985de.gif)
高性能和
大规模数值计算正是C++所擅长
![](/icons/81985de.gif)
![](/icons/81985dou2.gif)
就我所接触
![](/icons/81985de.gif)
南瑞和鲁能
![](/icons/81985dou.gif)
很多涉及到电力系统计算
![](/icons/81985de.gif)
软件Software如PAS等
![](/icons/81985dou.gif)
都是用C++来开发
![](/icons/81985de.gif)
![](/icons/81985dou2.gif)
在电力系统软件Software开发这块阵地
![](/icons/81985dou.gif)
C++大有用武的
地
![](/icons/81985dou2.gif)
C
![](/icons/81985jiajia.gif)
吸引如此的多
![](/icons/81985de.gif)
智力投入
![](/icons/81985dou.gif)
以至于这个领域
![](/icons/81985de.gif)
优秀作品
![](/icons/81985dou.gif)
包括重量级
![](/icons/81985de.gif)
软件Software产品、
![](/icons/81985chengxu.gif)
库以及书籍等
![](/icons/81985dou.gif)
数不胜数
![](/icons/81985dou2.gif)
在C++的父Bjarne Stroustrup
![](/icons/81985de.gif)
个人主页上
![](/icons/81985dou.gif)
有
![](/icons/81985yi.gif)
页
列出了
![](/icons/81985yi.gif)
些(全部或大部分)使用C
![](/icons/81985jiajia.gif)
编写
![](/icons/81985de.gif)
系统、应用
![](/icons/81985chengxu.gif)
和库
下面是
![](/icons/81985yi.gif)
些例子(摘自荣耀网站WebSite):
o Adobe
![](/icons/81985System.gif)
s:所有主要应用
![](/icons/81985chengxu.gif)
都使用C
![](/icons/81985jiajia.gif)
开发而成
![](/icons/81985dou.gif)
比如Photoshop & ImageReady
、Illustrator和Acrobat等
o Maya:知道“蜘蛛人”、“指环王”
![](/icons/81985de.gif)
电脑特技是使用什么软件Software做出来
![](/icons/81985de.gif)
吗?没错
![](/icons/81985dou.gif)
就
是Maya
o Amazon.com:使用C
![](/icons/81985jiajia.gif)
开发大型电子商务软件Software
o Apple:部分重要“零件”采用C
![](/icons/81985jiajia.gif)
编写而成
o AT&T:美国最大
![](/icons/81985de.gif)
电讯技术提供商
![](/icons/81985dou.gif)
主要产品采用C
![](/icons/81985jiajia.gif)
开发
o Google:Web搜索引擎采用C
![](/icons/81985jiajia.gif)
编写
o IBM:OS/400
o Microsoft:以下产品主要采用C
![](/icons/81985jiajia.gif)
(Visual C
![](/icons/81985jiajia.gif)
)编写:
o Windows XP Windows NT:NT4、2000 Windows 9x:95、98、Me Microsoft
Office:Wo
rd、Excel、Access、PowerPo
![](/icons/81985int.gif)
、Outlook Internet Explorer
![](/icons/81985dou.gif)
包括Outlook
Express
Visual Studio:Visual C
![](/icons/81985jiajia.gif)
、Visual Basic、Visual FoxPro .NET
Framework类库采用C
#编写
![](/icons/81985dou.gif)
但C#编译器自身则使用C
![](/icons/81985jiajia.gif)
编写而成
![](/icons/81985dou2.gif)
Exchange SQL Server FrontPage Project
所有游戏......
o KDE:K Desktop Environment(Linux)
o Symbian OS:最流行
![](/icons/81985de.gif)
蜂窝电话OS的
![](/icons/81985yi.gif)
很多新手特别容易会对自己所学习
![](/icons/81985de.gif)
东东产生疑惑、迷茫
![](/icons/81985dou2.gif)
觉得自己学这个东西
![](/icons/81985dou.gif)
花了这
么多时间有没有用
![](/icons/81985dou.gif)
会不会过时?这种思想很普遍
![](/icons/81985dou2.gif)
在
![](/icons/81985yi.gif)
些论坛上经常会看到
![](/icons/81985yi.gif)
些各语言
![](/icons/81985de.gif)
优劣比较
![](/icons/81985dou.gif)
知道自己所学语言
![](/icons/81985de.gif)
优劣也好
![](/icons/81985dou.gif)
但是如果
![](/icons/81985yi.gif)
味停留在这个层面就没有用了
任何语言都只是工具而已
![](/icons/81985dou2.gif)
重要
![](/icons/81985de.gif)
是使用工具
![](/icons/81985de.gif)
人!就我个人
![](/icons/81985de.gif)
经验来讲
![](/icons/81985dou.gif)
真正处于业界
搞开发
![](/icons/81985de.gif)
人都愿意使用成熟
![](/icons/81985de.gif)
、为自己所熟知
![](/icons/81985de.gif)
技术来完成工作
![](/icons/81985dou2.gif)
而新手都喜欢用
![](/icons/81985yi.gif)
些比
较新
![](/icons/81985de.gif)
技术来做开发
![](/icons/81985dou.gif)
而且喜欢追求新奇(从界面很容易看出来
![](/icons/81985dou.gif)
花花绿绿
![](/icons/81985de.gif)
界面多半出
自新手)
![](/icons/81985dou2.gif)
其实
![](/icons/81985dou.gif)
安于用
![](/icons/81985yi.gif)
些效率可能低下、扩展性和维护性差
![](/icons/81985de.gif)
思路方法来解决问题并不是
开发人员
![](/icons/81985de.gif)
错
![](/icons/81985dou2.gif)
他们只是在完成工作而已
![](/icons/81985dou2.gif)
但是作为
![](/icons/81985yi.gif)
个真正有上进心
![](/icons/81985de.gif)
开发人员
![](/icons/81985dou.gif)
我们
应该使用更优雅和高效
![](/icons/81985de.gif)
编程技术
![](/icons/81985dou.gif)
这才是我们逐渐变成编程“大牛”
![](/icons/81985de.gif)
好习惯
![](/icons/81985dou2.gif)
老是停留在
原地
![](/icons/81985dou.gif)
很容易被淘汰
![](/icons/81985de.gif)
![](/icons/81985dou2.gif)
在软件Software开发这个行当
![](/icons/81985dou.gif)
尤其如此
![](/icons/81985dou2.gif)
无论是对学生
![](/icons/81985dou.gif)
还是
![](/icons/81985yi.gif)
线开发
人员
![](/icons/81985dou.gif)
我觉得都不应该产生“书读够了”
![](/icons/81985de.gif)
感叹!我有时候喜欢将以前看过
![](/icons/81985de.gif)
书翻出来再
看
![](/icons/81985dou.gif)
每次总能体会到
![](/icons/81985yi.gif)
些新东西
![](/icons/81985dou2.gif)
有关C++语言
![](/icons/81985de.gif)
书籍更是如此
![](/icons/81985dou.gif)
而且我觉得我所起
![](/icons/81985de.gif)
题
目不是很好
![](/icons/81985dou2.gif)
为什么?
![](/icons/81985yinwei.gif)
我觉得学习语言还只是新手跨入软件Software开发“地狱”
![](/icons/81985de.gif)
第
![](/icons/81985yi.gif)
步
单单学习语言本身是远远不够
![](/icons/81985de.gif)
![](/icons/81985dou.gif)
还要学习相关
![](/icons/81985de.gif)
![](/icons/81985chengxu.gif)
库(C
![](/icons/81985jiajia.gif)
当然首选是先学习C++标准
![](/icons/81985chengxu.gif)
库)、相关
![](/icons/81985de.gif)
平台技术(如.NET)
![](/icons/81985dou.gif)
说得更远
![](/icons/81985yi.gif)
点
![](/icons/81985dou.gif)
还要锻炼对目标问题
![](/icons/81985de.gif)
分析、
归纳能力等等
![](/icons/81985dou2.gif)
工作的前
![](/icons/81985dou.gif)
技术路线自己作主
![](/icons/81985dou.gif)
工作的后
![](/icons/81985dou.gif)
绝大多数
![](/icons/81985chengxu.gif)
员将被公司技术
路线左右
![](/icons/81985dou2.gif)
所以
![](/icons/81985dou.gif)
趁现在还有时间
![](/icons/81985dou.gif)
可以学
![](/icons/81985yi.gif)
些自己感兴趣
![](/icons/81985de.gif)
![](/icons/81985dou2.gif)
如果想搞软件Software开发
![](/icons/81985dou.gif)
特别是
电力系统软件Software
![](/icons/81985de.gif)
开发
![](/icons/81985dou.gif)
学好C++不会令我们失望
![](/icons/81985dou2.gif)
当我们进入C++
![](/icons/81985de.gif)
前门
![](/icons/81985dou.gif)
然后经过
![](/icons/81985yi.gif)
段
黑暗的路
![](/icons/81985dou.gif)
再从后门出来到达光明顶后
![](/icons/81985dou.gif)
我们会体味到“
![](/icons/81985yi.gif)
览众山小”
![](/icons/81985de.gif)
感觉
推荐书籍:
![](/icons/81985smhl.gif)
编程高手箴言
![](/icons/81985smhr.gif)
梁肇新(用过超级解霸
![](/icons/81985de.gif)
都应该知道吧
![](/icons/81985dou.gif)
^_^)写
![](/icons/81985de.gif)
第
![](/icons/81985yi.gif)
本书
![](/icons/81985dou.gif)
其中有几
章还是值得
![](/icons/81985yi.gif)
读
![](/icons/81985de.gif)
![](/icons/81985dou2.gif)
在这本书中
![](/icons/81985dou.gif)
梁告诉我们
![](/icons/81985dou.gif)
学东西要耐心
![](/icons/81985dou.gif)
要耐得住“寂寞”
![](/icons/81985dou.gif)
走自
己
![](/icons/81985de.gif)
路
![](/icons/81985dou.gif)
让别人去“说”吧!
最近比较忙
![](/icons/81985dou.gif)
原来打算紧扣主题讲讲
![](/icons/81985yi.gif)
些具体
![](/icons/81985de.gif)
C++语言
![](/icons/81985de.gif)
细节
![](/icons/81985de.gif)
![](/icons/81985dou.gif)
但还是抽不出大段
时间了
![](/icons/81985dou2.gif)
所以
![](/icons/81985dou.gif)
现在只能再漫谈
![](/icons/81985yi.gif)
些有关C++
![](/icons/81985de.gif)
故事了
C++源于C语言
![](/icons/81985dou.gif)
还记得很久以前学习C语言
![](/icons/81985de.gif)
时光(那是
![](/icons/81985yi.gif)
段快乐而充实
![](/icons/81985de.gif)
时光)
![](/icons/81985dou.gif)
可是
现在学习C++
![](/icons/81985dou.gif)
并不是在C
![](/icons/81985de.gif)
基础上加上了类而已
![](/icons/81985dou.gif)
如果这样认为
![](/icons/81985dou.gif)
我们是耍不好C++
![](/icons/81985dou2.gif)
因此
![](/icons/81985dou.gif)
C++绝不是C
![](/icons/81985de.gif)
升级或扩充
![](/icons/81985dou.gif)
我们应该把C++当作
![](/icons/81985yi.gif)
门新语言来学习(C++的
父Bjarne Stroustrup语)
写
![](/icons/81985chengxu.gif)
首先希望是
![](/icons/81985chengxu.gif)
能正确执行
![](/icons/81985dou.gif)
其次是效率能够被接受
![](/icons/81985dou.gif)
再次就是易于维护
![](/icons/81985dou2.gif)
C++是
![](/icons/81985yi.gif)
个难学易用
![](/icons/81985de.gif)
语言
![](/icons/81985dou2.gif)
C++提供了太多可选择
![](/icons/81985de.gif)
东西
![](/icons/81985dou.gif)
而且使用使用C++来写
![](/icons/81985chengxu.gif)
可以
有 4种研究模式:基于过程、基于对象、面向对象和泛型
![](/icons/81985dou2.gif)
我们使用
![](/icons/81985yi.gif)
种语言来写
![](/icons/81985chengxu.gif)
并不意味着就是使用语言本身
![](/icons/81985dou.gif)
换句话说
![](/icons/81985dou.gif)
我们更多
![](/icons/81985de.gif)
时候是使用
![](/icons/81985chengxu.gif)
库在写
![](/icons/81985chengxu.gif)
![](/icons/81985dou2.gif)
比如
MFC、STL、ATL、VCL等等
![](/icons/81985dou2.gif)
其中要使用C++来写出结构优美、性能卓越、代码简洁、易于
维护
![](/icons/81985de.gif)
代码
![](/icons/81985dou.gif)
首推C++标准
![](/icons/81985chengxu.gif)
库
![](/icons/81985dou2.gif)
STL对效率做了严格
![](/icons/81985de.gif)
要求
![](/icons/81985dou.gif)
而且使用STL写出来
![](/icons/81985de.gif)
程
序简洁美观(前段时间我特意贴了
![](/icons/81985yi.gif)
个要求对若干整数进行排序
![](/icons/81985de.gif)
帖子
![](/icons/81985dou.gif)
其实目
![](/icons/81985de.gif)
就是用来
展示STL
![](/icons/81985de.gif)
简洁优雅)
![](/icons/81985dou2.gif)
![](/icons/81985yi.gif)
旦习惯使用泛型思维来考虑问题
![](/icons/81985dou.gif)
我们能够充分体会到模板带来
![](/icons/81985de.gif)
美!
对于数值计算来说
![](/icons/81985dou.gif)
C++标准
![](/icons/81985chengxu.gif)
库可以充分满足现代化服务和商业计算对数据、信息
![](/icons/81985de.gif)
即
时回应
![](/icons/81985de.gif)
要求
我觉得学好
![](/icons/81985yi.gif)
门语言最重要
![](/icons/81985de.gif)
就是实战
![](/icons/81985dou2.gif)
也就是多“写”!“工程经验的积累”对已具有
![](/icons/81985yi.gif)
段开发时间
![](/icons/81985de.gif)
![](/icons/81985chengxu.gif)
员而言
![](/icons/81985dou.gif)
非常重要!只有在不断
![](/icons/81985de.gif)
积累中
![](/icons/81985dou.gif)
我们才能渐渐体会到C++
语言中
![](/icons/81985de.gif)
![](/icons/81985yi.gif)
些背后
![](/icons/81985de.gif)
东西
![](/icons/81985dou2.gif)
对于这点
![](/icons/81985dou.gif)
没有大量
![](/icons/81985chengxu.gif)
代码写作经验
![](/icons/81985de.gif)
菜鸟
![](/icons/81985dou.gif)
也可以借助
Effective C
![](/icons/81985jiajia.gif)
![](/icons/81985smhr.gif)
先攒
![](/icons/81985yi.gif)
些经验值
![](/icons/81985dou2.gif)
![](/icons/81985smhl.gif)
Effective C
![](/icons/81985jiajia.gif)
![](/icons/81985smhr.gif)
是
![](/icons/81985yi.gif)
本好书!
![](/icons/81985dou2.gif)
Meyers
![](/icons/81985de.gif)
书绝对值
得
![](/icons/81985yi.gif)
读
![](/icons/81985dou.gif)
Meyers可以说当今C++社群中数
![](/icons/81985yi.gif)
数 2
![](/icons/81985de.gif)
技术专家
推荐网站WebSite:
www.royaloo.com
以下文字应该是去年所涂鸦而成
![](/icons/81985dou.gif)
主要是有关动态内存分配
![](/icons/81985de.gif)
![](/icons/81985dou.gif)
在这里将其重新看了看
![](/icons/81985dou.gif)
觉得还是写得太浅薄了
![](/icons/81985dou2.gif)
![](/icons/81985yinwei.gif)
内存是
![](/icons/81985chengxu.gif)
运行
![](/icons/81985de.gif)
“运动场”
![](/icons/81985dou.gif)
对场地
![](/icons/81985de.gif)
了解程度会直接
影响到我们
![](/icons/81985chengxu.gif)
运行
![](/icons/81985de.gif)
流畅度和稳定性
C
![](/icons/81985jiajia.gif)
提供了操作符
![](/icons/81985new.gif)
来在堆上分配内存
![](/icons/81985dou.gif)
操作符delete来释放内存
![](/icons/81985dou2.gif)
有些情况下
![](/icons/81985dou.gif)
我
们需要对内存
![](/icons/81985de.gif)
分配和释放进行更好
![](/icons/81985de.gif)
控制
![](/icons/81985dou2.gif)
许多
![](/icons/81985chengxu.gif)
创建和释放
![](/icons/81985yi.gif)
些重要类
![](/icons/81985de.gif)
大量
![](/icons/81985de.gif)
对
象
![](/icons/81985dou.gif)
如tree nodes,linked lists links,po
![](/icons/81985int.gif)
s,lines,messages,etc.使用通用
![](/icons/81985de.gif)
内存分
配器如
![](/icons/81985new.gif)
和delete来进行这些对象
![](/icons/81985de.gif)
分配和释放有时将支配
![](/icons/81985chengxu.gif)
![](/icons/81985de.gif)
运行时间和内存需求
两方面
![](/icons/81985de.gif)
原因:通用内存分配操作
![](/icons/81985de.gif)
运行和空间
![](/icons/81985de.gif)
耗费以及区别对象大小引起
![](/icons/81985de.gif)
内存碎片
![](/icons/81985dou2.gif)
类使用定制
![](/icons/81985de.gif)
内存分配器将加快模拟器、编译器和类似
![](/icons/81985chengxu.gif)
![](/icons/81985de.gif)
执行速度
例外
![](/icons/81985yi.gif)
种需要更好
![](/icons/81985de.gif)
内存控制
![](/icons/81985de.gif)
情况是:需要在有限资源
![](/icons/81985de.gif)
情况下长时间不间断运行
![](/icons/81985de.gif)
![](/icons/81985chengxu.gif)
![](/icons/81985dou2.gif)
实时系统经常需要用最少
![](/icons/81985de.gif)
耗费来获取有保证
![](/icons/81985de.gif)
可预期
![](/icons/81985de.gif)
内存
![](/icons/81985dou2.gif)
这也就导致了更
好
![](/icons/81985de.gif)
内存控制
![](/icons/81985de.gif)
需要
![](/icons/81985dou2.gif)
![](/icons/81985yi.gif)
般来说
![](/icons/81985dou.gif)
这些
![](/icons/81985chengxu.gif)
都避免使用动态
![](/icons/81985de.gif)
内存分配
![](/icons/81985dou.gif)
而使用特殊目
![](/icons/81985de.gif)
内存分配器来管理有限资源
此外
![](/icons/81985dou.gif)
还有
![](/icons/81985yi.gif)
些情况下由于硬件或系统
![](/icons/81985de.gif)
要求
![](/icons/81985dou.gif)
需要将对象放在指定
![](/icons/81985de.gif)
内存位置
![](/icons/81985dou2.gif)
这也
需要进行定制
![](/icons/81985de.gif)
内存管理(通过重载
![](/icons/81985new.gif)
来加以实现)
在C
![](/icons/81985jiajia.gif)
Release 2.0中
![](/icons/81985dou.gif)
为了满足以上需求
![](/icons/81985dou.gif)
内存管理机制做了相应
![](/icons/81985de.gif)
修改
![](/icons/81985dou2.gif)
主要是引
进了operator
![](/icons/81985zhk2.gif)
和 operator delete
![](/icons/81985zhk2.gif)
![](/icons/81985new.gif)
操作符
![](/icons/81985de.gif)
作用范围(Scope for operator
![](/icons/81985new.gif)
Functions)
操作符(Operator) 范围(Scope)
::operator
![](/icons/81985new.gif)
Global
![](/icons/81985class.gif)
-name::operator
![](/icons/81985new.gif)
Class
operator
![](/icons/81985new.gif)
![](/icons/81985de.gif)
第
![](/icons/81985yi.gif)
个参数必须是类型size_t(在STDDEF.H中定义
![](/icons/81985de.gif)
类型)
![](/icons/81985dou.gif)
返回类型
为void *
当分配内建(built-in)类型
![](/icons/81985de.gif)
对象、未包含用户自定义
![](/icons/81985de.gif)
![](/icons/81985new.gif)
操作符
![](/icons/81985hanshu.gif)
![](/icons/81985de.gif)
类对象、任何
类型
![](/icons/81985de.gif)
![](/icons/81985shuzu.gif)
时
![](/icons/81985dou.gif)
使用全局
![](/icons/81985new.gif)
操作符
![](/icons/81985hanshu.gif)
![](/icons/81985dou2.gif)
当在类中自定义
![](/icons/81985new.gif)
操作符时
![](/icons/81985dou.gif)
分配该类对象
内存时
![](/icons/81985dou.gif)
![](/icons/81985diaoyong.gif)
该类
![](/icons/81985de.gif)
![](/icons/81985new.gif)
操作符
![](/icons/81985dou2.gif)
如下:
#
#
![](/icons/81985class.gif)
Blanks
{
public:
Blanks
![](/icons/81985kh.gif)
{}
void *operator
![](/icons/81985new.gif)
( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator
![](/icons/81985new.gif)
( size_t stAllocateBlock, char chInit )
{
void *pvTemp = malloc( stAllocateBlock );
![](/icons/81985if.gif)
( pvTemp != 0 )
mem
![](/icons/81985set.gif)
( pvTemp, chInit, stAllocateBlock );
![](/icons/81985return.gif)
pvTemp;
}
![](/icons/81985main.gif)
{
Blanks *a5 =
![](/icons/81985new.gif)
( 0xa5 ) Blanks;//创建对象Blanks
![](/icons/81985dou.gif)
并且初试化为0xa5
![](/icons/81985return.gif)
a5 != 0;
}
![](/icons/81985new.gif)
操作符可以重载
![](/icons/81985dou.gif)
而delete却不行
![](/icons/81985dou2.gif)
![](/icons/81985yinwei.gif)
等到需要释放
![](/icons/81985de.gif)
时候
![](/icons/81985dou.gif)
我们所能得到
![](/icons/81985de.gif)
就
是
![](/icons/81985yi.gif)
个指针
![](/icons/81985dou2.gif)
而且该指针可能不是原先
![](/icons/81985de.gif)
对象类型指针(有可能进行了类型转换)
![](/icons/81985dou2.gif)
实际
上
![](/icons/81985dou.gif)
当使用
![](/icons/81985new.gif)
获得
![](/icons/81985yi.gif)
个指向
![](/icons/81985yi.gif)
片内存
![](/icons/81985de.gif)
指针时
![](/icons/81985dou.gif)
在该片内存前有
![](/icons/81985yi.gif)
个指示器(indicator)
![](/icons/81985dou.gif)
记录实际分配
![](/icons/81985de.gif)
内存数量
![](/icons/81985dou2.gif)
当
![](/icons/81985diaoyong.gif)
delete时
![](/icons/81985dou.gif)
可以获知需要释放
![](/icons/81985de.gif)
内存大小
![](/icons/81985shuzu.gif)
![](/icons/81985de.gif)
释放(Deallocating Arrays):
void f( )
{
X* p1 =
![](/icons/81985new.gif)
X[10];
//...
delete
![](/icons/81985zhk2.gif)
X;
}
为什么不使用delete [10] X;来释放内存?Bjarne Stroustrup称这种做法容易导致错
误
![](/icons/81985dou.gif)
而将记录元素个数
![](/icons/81985de.gif)
任务放在delete
![](/icons/81985de.gif)
实现中了
至于为什么C
![](/icons/81985jiajia.gif)
中未内建垃圾收集器(Garbage Collection)
![](/icons/81985de.gif)
原因
![](/icons/81985dou.gif)
看
![](/icons/81985smhl.gif)
C++语言
![](/icons/81985de.gif)
设
计和演化
![](/icons/81985smhr.gif)
(En) Bjarne Stroustrup 机械工业出版社(俗称:D&E)可以得到答案
此外
![](/icons/81985dou.gif)
C++标准库中提供了
![](/icons/81985yi.gif)
种智能型指针auto_ptr,这种指针可以帮助我们防止“被
异常抛出时发生资源泄漏”
![](/icons/81985dou2.gif)
但是缺点是该智能型指针不能指向
![](/icons/81985shuzu.gif)
![](/icons/81985dou.gif)
![](/icons/81985yinwei.gif)
其内部释放内
存是通过delete而非delete
![](/icons/81985zhk2.gif)
来进行
![](/icons/81985de.gif)
![](/icons/81985dou2.gif)
所以
![](/icons/81985dou.gif)
只能使用其来指向
![](/icons/81985yi.gif)
个单个对象
模板部分是C++中比较难
![](/icons/81985de.gif)
部分
![](/icons/81985dou.gif)
也是C++
![](/icons/81985de.gif)
魅力所在
![](/icons/81985dou2.gif)
以下文字是我以前看过
![](/icons/81985de.gif)
![](/icons/81985dou.gif)
具
体出处不清楚了
![](/icons/81985dou2.gif)
今天稍微整理了
![](/icons/81985yi.gif)
下
![](/icons/81985dou.gif)
作为模板介绍
![](/icons/81985de.gif)
![](/icons/81985yi.gif)
个单元
为什么要使用模板
对于除类型的外
![](/icons/81985dou.gif)
其余都相同
![](/icons/81985de.gif)
![](/icons/81985hanshu.gif)
(譬如quicksort)
![](/icons/81985dou.gif)
我们
![](/icons/81985yi.gif)
般有3种解决办法
1、针对每个区别
![](/icons/81985de.gif)
类型重复地编写
![](/icons/81985hanshu.gif)
实体(C语言
![](/icons/81985de.gif)
做法):
![](/icons/81985int.gif)
* quicksort(
![](/icons/81985int.gif)
a
![](/icons/81985zhk2.gif)
) {... }
double* quicksort(double a
![](/icons/81985zhk2.gif)
) {... }
…
2、使用Object(Java
![](/icons/81985de.gif)
做法)或者void*
缺点有两个
效率问题方面也有问题
类型检查问题
3、使用宏预处理机制
缺点:只是愚蠢
![](/icons/81985de.gif)
文本替换
![](/icons/81985dou.gif)
而且也不会考虑作用域和类型安全
然而
![](/icons/81985dou.gif)
应用模板却可以避免这些缺点
![](/icons/81985dou.gif)
我们可以编写:
template
T* quicksort(T a
![](/icons/81985zhk2.gif)
) {... }
优点:
代码简洁优雅
![](/icons/81985dou.gif)
所有参数类型都以T来代替
![](/icons/81985dou.gif)
真正实现了类型无关性
更好
![](/icons/81985de.gif)
类型安全性
![](/icons/81985dou.gif)
所有
![](/icons/81985de.gif)
类型检查都是在编译期进行
![](/icons/81985dou.gif)
而且避免使
用指针
不存在继承
![](/icons/81985dou.gif)
效率高
![](/icons/81985dou2.gif)
(1)没有虚
![](/icons/81985hanshu.gif)
;(2)所有
![](/icons/81985de.gif)
![](/icons/81985yi.gif)
切工作都是
在编译期完成
![](/icons/81985dou.gif)
大大提高运行效率
目
![](/icons/81985de.gif)
:告诉编译器如何做出最佳
![](/icons/81985de.gif)
选择
![](/icons/81985dou.gif)
而且这种选择
全部是在编译期完成
![](/icons/81985de.gif)
模板
![](/icons/81985de.gif)
机制:特化 和 实参演绎
1、特化
基本模板:
template
![](/icons/81985class.gif)
A { // (1)
void f(T1 a, T2 b);
}
局部特化(偏特化):
template
![](/icons/81985class.gif)
A { // (2)
void f(
![](/icons/81985int.gif)
a, T2 b);
}
或者
template>
![](/icons/81985class.gif)
A { // (3)
void f(T a, T b);
}
全局特化(显式特化):
template<>
![](/icons/81985class.gif)
A {
void f(
![](/icons/81985int.gif)
a,
![](/icons/81985int.gif)
b); // (4)
}
使用举例:
A* p1; //将使用(4) ——全局特化
A* p2; //将使用(3) ——局部特化
A* p3; //将使用(2) ——局部特化
A* p4; //将由(1) ——基本模板——生成
//A
优点:
由:全局特化->局部特化->基本模板
![](/icons/81985dou.gif)
这种特化顺序
![](/icons/81985de.gif)
选择和匹配(重载解析规则)是由编译器自动进行
![](/icons/81985de.gif)
![](/icons/81985dou.gif)
无需人工参和
可以根据区别
![](/icons/81985de.gif)
情况(诸如类型区别
![](/icons/81985dou.gif)
条件区别)
![](/icons/81985dou.gif)
给出区别
![](/icons/81985de.gif)
实现
![](/icons/81985dou.gif)
从而获得更加灵活
![](/icons/81985de.gif)
针对性
可以针对任何变化
![](/icons/81985dou.gif)
改善了
![](/icons/81985chengxu.gif)
![](/icons/81985de.gif)
扩展性
2 实参演绎
T const& f(T const& a, T const& b)
{
![](/icons/81985return.gif)
a + b; //1处
}
![](/icons/81985int.gif)
g = f(1,2);
实际上f(1,2)要匹配
![](/icons/81985de.gif)
![](/icons/81985hanshu.gif)
是
![](/icons/81985int.gif)
const& f(
![](/icons/81985int.gif)
const&,
![](/icons/81985int.gif)
const&);
而这个
![](/icons/81985hanshu.gif)
又是如何来
![](/icons/81985de.gif)
呢?
优点:
再也无需提供
![](/icons/81985yi.gif)
对尖括号和里面
![](/icons/81985de.gif)
实参
![](/icons/81985dou.gif)
诸如f(1,2)
![](/icons/81985dou.gif)
有了
实参演绎
![](/icons/81985dou.gif)
我们就可以写成f(1,2)
模板
![](/icons/81985de.gif)
应用
1、标准库(STL)——到处都是模板代码
标准库=算法+容器+迭代器
如list /
2、类型无关性(T)
3、trait和policy
(1)trait: 主要用到了许多typedef和特化,指定
![](/icons/81985de.gif)
是
![](/icons/81985yi.gif)
种特性
// traits/accumtraits3.hpp
template
lass AccumulationTraits;
c template<>
![](/icons/81985class.gif)
AccumulationTraits {
public:
typedef
![](/icons/81985int.gif)
AccT;
![](/icons/81985static.gif)
AccT const zero = 0;
};
template<>
![](/icons/81985class.gif)
AccumulationTraits {
public:
typedef
![](/icons/81985int.gif)
AccT;
![](/icons/81985static.gif)
AccT const zero = 0;
};
template<>
![](/icons/81985class.gif)
AccumulationTraits {
public:
typedef long AccT;
![](/icons/81985static.gif)
AccT const zero = 0;
};
(2)policy:通常表现为某个
![](/icons/81985hanshu.gif)
![](/icons/81985dou.gif)
指定
![](/icons/81985de.gif)
是
![](/icons/81985yi.gif)
种行为
![](/icons/81985class.gif)
SumPolicy {
public:
template
![](/icons/81985static.gif)
void accumulate (T1& total, T2 const & value) {
total
![](/icons/81985jiadeng.gif)
value;
}
};
(3)trait和policy
![](/icons/81985de.gif)
使用方法:
template >
![](/icons/81985class.gif)
Accum {
public:
typedef typename Traits::AccT AccT;
![](/icons/81985static.gif)
AccT accum (T const* beg, T const* end) {
AccT total = Traits::zero
![](/icons/81985kh.gif)
;
while (beg != end) {
Policy::accumulate(total, *beg);
![](/icons/81985jiajia.gif)
beg;
}
![](/icons/81985return.gif)
total;
}
};
4、Metaprogramming
编译期计算、递归
![](/icons/81985de.gif)
思想
5、新形式
![](/icons/81985de.gif)
设计模板
(第 3、第 4、第 5点以后再详细介绍)
![](/icons/81985smhl.gif)
C
![](/icons/81985jiajia.gif)
Templates中文版
![](/icons/81985smhr.gif)
![](/icons/81985de.gif)
具体介绍
第1部分介绍了模板
![](/icons/81985de.gif)
基本概念
![](/icons/81985dou.gif)
以教程
![](/icons/81985de.gif)
风格来介绍这些基本概念
第2部分阐述了模板
![](/icons/81985de.gif)
语言细节
![](/icons/81985dou.gif)
可以作为
![](/icons/81985yi.gif)
本基于模板
![](/icons/81985de.gif)
构造
![](/icons/81985de.gif)
参考手册
第3部分介绍了C
![](/icons/81985jiajia.gif)
模板所支持
![](/icons/81985de.gif)
基本设计技术
![](/icons/81985dou.gif)
范围覆盖从微小
![](/icons/81985de.gif)
概念
![](/icons/81985yi.gif)
直延伸到复杂
![](/icons/81985de.gif)
使用方法;
![](/icons/81985yi.gif)
些技术在别
![](/icons/81985de.gif)
书籍都没有出现过
第4部分基于前两部分
![](/icons/81985dou.gif)
深入讨论了各种使用模板
![](/icons/81985de.gif)
普通应用
![](/icons/81985chengxu.gif)
发信人: robindy (丁丁), 信区: EES
标 题: Re: vc要学多久呀?那位大哥给个说法?Thank you!
发信站: 水上明珠 (Sat Jun 12 19:19:31 2004)
学
![](/icons/81985yi.gif)
个月
![](/icons/81985dou.gif)
可以用VC写
![](/icons/81985yi.gif)
些小
![](/icons/81985chengxu.gif)
自己玩玩
学两个月
![](/icons/81985dou.gif)
可以用VC写像样点
![](/icons/81985de.gif)
东西在周围人面前炫炫
学 3个月
![](/icons/81985dou.gif)
可以用VC给老板开始干活了
学 6个月
![](/icons/81985dou.gif)
开始重头去学C++
学
![](/icons/81985yi.gif)
年后
![](/icons/81985dou.gif)
决定要不要继续
![](/icons/81985dou.gif)
![](/icons/81985if.gif)
(继续) 学习MFC、ATL、STL、C#、BCB、Network、Databa
se、Algorithm...
![](/icons/81985else.gif)
开始就是个
学 3年后
![](/icons/81985dou.gif)
学会如何来用编程语言来解决问题
![](/icons/81985dou.gif)
VC、BCB等都只是解决问题
![](/icons/81985de.gif)
工具
![](/icons/81985dou2.gif)
这时候
你如果还在学C++
![](/icons/81985dou.gif)
你可以从事软件Software开发这个很有“前途”
![](/icons/81985de.gif)
职业了
Tags:
延伸阅读
最新评论