C++的学习感想



原作者姓名 robindy
正文
很多人把学习C++语言当成学习VC了我曾经就走过这样弯路当学了很长时间VC后
还是得回过头来学习C语言本身 那么学习C++从何处入手了?
C++语言相对于C语言来说引入了两个大新东西个就是面向对象(具体来将就是类
)另外就是模板技术(模板编程或者叫泛型编程是进来非常流行技术在C#中虽然还
没有对泛型编程支持但是相信在将来也定会加入这功能)模板是C++中比较复
部分但是作为个真正C++这部分很重要尤其是对C++标准
掌握尤为重要
刚开始时候千万不要直扑VC中各种向导和设计器依赖开发环境生成很多代码
会把我们搞糊涂也不利于我们学习C++语言本身建议就是生成个空控制台工
然后自己向里面添加文件
如下就是个简单控制台:
//robindy/list.cpp

# <iostream>
# <list>

using std;


{
list<char> coll;

for(char c = \'a\'; c <= \'z\'; c)
{
coll.push_back(c);
}

list::const_iterator pos;
for(pos = coll.begin; pos != coll.end; pos)
{
cout << *pos << \' \';
}
cout << endl;

0;
}

对using std;解释:
所谓是指标识符各种可见范围C++标准库中所有标识符都被定义于个名为std
由于概念使用C++标准任何标识符时可以有 3种选择:
1、直接指定标识符例如std::ostream而不是ostream完整语句如下:
std::cout << std::hex << 3.4 << std::endl;
2、使用using关键字
using std::cout;
using std::endl;
以上可以写成
cout << std::hex << 3.4 << endl;
3、最方便就是使用using
std;这样命名空间std内定义所有标识符都有效(曝光)就好像它们被声明为全局变量那么以上语句可以如下写:
cout << hex << 3.4 << endl;

这段用到了标准模板库,在屏幕上打印a~z其中标记式只有两种是被
C++标准委员会接受只有以下两种写法是符合C++标准是可移植即:

{
}

( argc, char* argv)
{
}
C末尾定义了个隐式 0; 但是在VC中必须显式写出语句
在BCB中可以不写而编译通过
这段中用到了STL中容器:链表先是向链表中插入26个字母然后从遍历链表

我不建议初学者开始就从模板库入手但是我建议应该逐渐地有意识地学习模板库
我们应该熟悉cout和cin使用方法(位于iostream)而减少使用老式C库中prf和sc
anf等

从控制台入手好处就是避免我们理解VC中向导等工具生成其他代码整个流程
很清楚新手学习VC大难点就是搞不清楚整个流程(从那条语句开始执行然后
从那条语句退出MFC做了太多封装掩盖了事实真相^_^)通过控制台我们可以很快
地学习C++语言中很多新特性如类封装、继承和多态等通过这个时期学习
能够掌握 3个东西: C++关键字、语法(重点是和面向对象有关以及模板)、C++
标准库(知道如何使用即可要彻底掌握需要很多时间和精力)至于和界面有关
东东(MFC中很大部分是和界面相关所以我认为MFC很臃肿而无聊!回头看过以前
用MFC写种“垃圾”感觉)
自己做个测试:
个控制台在其中体现出类继承重载动态多态(通过虚实现)
数据封装C++标准库运用
如果你能够轻松搞定恭喜你你已经通过C++语言关了不过C++实在是个复杂
东东其中有各种千奇百怪语法现象如果没有 3、 5年功力千万不要说自己懂C+
+^_^
推荐书籍Thinking in C(有精力可以直接读原版)
Essential C++

本来我计划继续说说如何来进入C++世界但是琢磨了觉得还是要先解决个问
题:为什么要学习C++?我觉得在软件Software开发这个行当了里除了为了生计外学习新东西都
是应该以兴趣为导向所以撇开我个人对C++偏爱我想为你树立起学习C++
心和兴趣当初我对自己学习C++个忠告就是:不能半途而废!起初是兴趣驱动
后来则是生计所需最后还是回归到了兴趣毕竟我从中得到了乐趣这就足够了在学
个新东西前解决动机问题很重要就如同杀人如果只是突然兴起那么等尝试
了以后是没有成就感革命先烈们为我们作出了很好榜样就算我们在学习C++
道路上遇到了太多困惑和痛苦但是我们毕竟为自己信念做了努力我们知道自己在
做什么知道自己在追求什么

C++适合做什么样开发?
C++是门广泛用于工业软件Software研发大型语言具有很高复杂性和解决问题能力C
++不仅在开发上极具价值同时在学术界也就有很高价值有关C++文章应该可以
用浩如烟海来形容了吧C++世界级经典书籍也是数不胜数然而目前开发语言是如
此地繁荣就连微软也在推出了新开发语言C#个不可否认现实是在低阶
计领域C挤压着C同时也在承受着C强烈反弹前段时间看了据说是微软操作系统源代
东东其中很多还是C语言而在高阶设计领域Java和C#正在不断蚕食着C
地盘也许Java和C#狂潮终将迫使C回归本位— 回到它有着根本性优势开发领域:
低级系统设计、高级大规模高性能应用设计、嵌入式设计、通用设计以及数
值科学计算等果真如此我认为这未尝不是件好事电力系统软件Software所要求高性能和
大规模数值计算正是C++所擅长就我所接触南瑞和鲁能很多涉及到电力系统计算
软件Software如PAS等都是用C++来开发在电力系统软件Software开发这块阵地C++大有用武的
C吸引如此的多智力投入以至于这个领域优秀作品包括重量级软件Software产品、
库以及书籍等数不胜数在C++的父Bjarne Stroustrup个人主页上
列出了些(全部或大部分)使用C编写系统、应用和库
下面是些例子(摘自荣耀网站WebSite):
o Adobe s:所有主要应用都使用C开发而成比如Photoshop & ImageReady
、Illustrator和Acrobat等
o Maya:知道“蜘蛛人”、“指环王”电脑特技是使用什么软件Software做出来吗?没错
是Maya
o Amazon.com:使用C开发大型电子商务软件Software
o Apple:部分重要“零件”采用C编写而成
o AT&T:美国最大电讯技术提供商主要产品采用C开发
o Google:Web搜索引擎采用C编写
o IBM:OS/400
o Microsoft:以下产品主要采用C(Visual C)编写:
o Windows XP Windows NT:NT4、2000 Windows 9x:95、98、Me Microsoft
Office:Wo
rd、Excel、Access、PowerPo、Outlook Internet Explorer包括Outlook
Express
Visual Studio:Visual C、Visual Basic、Visual FoxPro .NET
Framework类库采用C
#编写但C#编译器自身则使用C编写而成Exchange SQL Server FrontPage Project
所有游戏......
o KDE:K Desktop Environment(Linux)
o Symbian OS:最流行蜂窝电话OS的



很多新手特别容易会对自己所学习东东产生疑惑、迷茫觉得自己学这个东西花了这
么多时间有没有用会不会过时?这种思想很普遍些论坛上经常会看到些各语言
优劣比较知道自己所学语言优劣也好但是如果味停留在这个层面就没有用了
任何语言都只是工具而已重要是使用工具人!就我个人经验来讲真正处于业界
搞开发人都愿意使用成熟、为自己所熟知技术来完成工作而新手都喜欢用些比
较新技术来做开发而且喜欢追求新奇(从界面很容易看出来花花绿绿界面多半出
自新手)其实安于用些效率可能低下、扩展性和维护性差思路方法来解决问题并不是
开发人员他们只是在完成工作而已但是作为个真正有上进心开发人员我们
应该使用更优雅和高效编程技术这才是我们逐渐变成编程“大牛”好习惯老是停留在
原地很容易被淘汰在软件Software开发这个行当尤其如此无论是对学生还是线开发
人员我觉得都不应该产生“书读够了”感叹!我有时候喜欢将以前看过书翻出来再
每次总能体会到些新东西有关C++语言书籍更是如此而且我觉得我所起
目不是很好为什么?我觉得学习语言还只是新手跨入软件Software开发“地狱”
单单学习语言本身是远远不够还要学习相关库(C当然首选是先学习C++标准
库)、相关平台技术(如.NET)说得更远还要锻炼对目标问题分析、
归纳能力等等工作的前技术路线自己作主工作的后绝大多数员将被公司技术
路线左右所以趁现在还有时间可以学些自己感兴趣如果想搞软件Software开发特别是
电力系统软件Software开发学好C++不会令我们失望当我们进入C++前门然后经过
黑暗的路再从后门出来到达光明顶后我们会体味到“览众山小”感觉

推荐书籍:
编程高手箴言梁肇新(用过超级解霸都应该知道吧^_^)写本书其中有几
章还是值得在这本书中梁告诉我们学东西要耐心要耐得住“寂寞”走自
让别人去“说”吧!

最近比较忙原来打算紧扣主题讲讲些具体C++语言细节但还是抽不出大段
时间了所以现在只能再漫谈些有关C++故事了

C++源于C语言还记得很久以前学习C语言时光(那是段快乐而充实时光)可是
现在学习C++并不是在C基础上加上了类而已如果这样认为我们是耍不好C++
因此C++绝不是C升级或扩充我们应该把C++当作门新语言来学习(C++的
父Bjarne Stroustrup语)

首先希望是能正确执行其次是效率能够被接受再次就是易于维护C++是
个难学易用语言C++提供了太多可选择东西而且使用使用C++来写可以
有 4种研究模式:基于过程、基于对象、面向对象和泛型我们使用种语言来写
并不意味着就是使用语言本身换句话说我们更多时候是使用库在写比如
MFC、STL、ATL、VCL等等其中要使用C++来写出结构优美、性能卓越、代码简洁、易于
维护代码首推C++标准STL对效率做了严格要求而且使用STL写出来
序简洁美观(前段时间我特意贴了个要求对若干整数进行排序帖子其实目就是用来
展示STL简洁优雅)旦习惯使用泛型思维来考虑问题我们能够充分体会到模板带来美!
对于数值计算来说C++标准库可以充分满足现代化服务和商业计算对数据、信息
时回应要求

我觉得学好门语言最重要就是实战也就是多“写”!“工程经验的积累”对已具有
段开发时间员而言非常重要!只有在不断积累中我们才能渐渐体会到C++
语言中些背后东西对于这点没有大量代码写作经验菜鸟也可以借助
Effective C先攒些经验值Effective C本好书!Meyers书绝对值
Meyers可以说当今C++社群中数数 2技术专家

推荐网站WebSite:
www.royaloo.com

以下文字应该是去年所涂鸦而成主要是有关动态内存分配在这里将其重新看了看
觉得还是写得太浅薄了内存是运行“运动场”对场地了解程度会直接
影响到我们运行流畅度和稳定性
C提供了操作符来在堆上分配内存操作符delete来释放内存有些情况下
们需要对内存分配和释放进行更好控制许多创建和释放些重要类大量
如tree nodes,linked lists links,pos,lines,messages,etc.使用通用内存分
配器如和delete来进行这些对象分配和释放有时将支配运行时间和内存需求
两方面原因:通用内存分配操作运行和空间耗费以及区别对象大小引起内存碎片
类使用定制内存分配器将加快模拟器、编译器和类似执行速度
例外种需要更好内存控制情况是:需要在有限资源情况下长时间不间断运行
实时系统经常需要用最少耗费来获取有保证可预期内存这也就导致了更
内存控制需要般来说这些都避免使用动态内存分配而使用特殊目
内存分配器来管理有限资源
此外还有些情况下由于硬件或系统要求需要将对象放在指定内存位置这也
需要进行定制内存管理(通过重载来加以实现)
在C Release 2.0中为了满足以上需求内存管理机制做了相应修改主要是引
进了operator 和 operator delete
操作符作用范围(Scope for operator Functions)
操作符(Operator) 范围(Scope)
::operator Global
-name::operator Class
operator 个参数必须是类型size_t(在STDDEF.H中定义类型)返回类型
为void *
当分配内建(built-in)类型对象、未包含用户自定义操作符类对象、任何
类型使用全局操作符当在类中自定义操作符时分配该类对象
内存时该类操作符如下:
#
#
Blanks
{


public:
Blanks{}
void *operator ( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator ( size_t stAllocateBlock, char chInit )
{
void *pvTemp = malloc( stAllocateBlock );
( pvTemp != 0 )
mem( pvTemp, chInit, stAllocateBlock );
pvTemp;
}

{
Blanks *a5 = ( 0xa5 ) Blanks;//创建对象Blanks并且初试化为0xa5
a5 != 0;
}
操作符可以重载而delete却不行等到需要释放时候我们所能得到
个指针而且该指针可能不是原先对象类型指针(有可能进行了类型转换)实际
当使用获得个指向片内存指针时在该片内存前有个指示器(indicator)
记录实际分配内存数量delete时可以获知需要释放内存大小
释放(Deallocating Arrays):
void f( )
{
X* p1 = X[10];
//...
delete X;
}
为什么不使用delete [10] X;来释放内存?Bjarne Stroustrup称这种做法容易导致错
而将记录元素个数任务放在delete实现中了
至于为什么C中未内建垃圾收集器(Garbage Collection)原因C++语言
计和演化(En) Bjarne Stroustrup 机械工业出版社(俗称:D&E)可以得到答案
此外C++标准库中提供了种智能型指针auto_ptr,这种指针可以帮助我们防止“被
异常抛出时发生资源泄漏”但是缺点是该智能型指针不能指向其内部释放内
存是通过delete而非delete 来进行所以只能使用其来指向个单个对象

模板部分是C++中比较难部分也是C++魅力所在以下文字是我以前看过
体出处不清楚了今天稍微整理了作为模板介绍个单元

为什么要使用模板

对于除类型的外其余都相同(譬如quicksort)我们般有3种解决办法
1、针对每个区别类型重复地编写实体(C语言做法):
* quicksort( a) {... }
double* quicksort(double a) {... }

2、使用Object(Java做法)或者void*
缺点有两个
效率问题方面也有问题
类型检查问题
3、使用宏预处理机制
缺点:只是愚蠢文本替换而且也不会考虑作用域和类型安全
然而应用模板却可以避免这些缺点我们可以编写:
template
T* quicksort(T a) {... }
优点:
代码简洁优雅所有参数类型都以T来代替真正实现了类型无关性
更好类型安全性所有类型检查都是在编译期进行而且避免使
用指针
不存在继承效率高(1)没有虚;(2)所有切工作都是
在编译期完成大大提高运行效率
:告诉编译器如何做出最佳选择而且这种选择
全部是在编译期完成

模板机制:特化 和 实参演绎
1、特化
基本模板:
template
A { // (1)
void f(T1 a, T2 b);
}
局部特化(偏特化):
template A { // (2)
void f( a, T2 b);
}
或者
template> A { // (3)
void f(T a, T b);
}
全局特化(显式特化):
template<>
A {
void f( a, b); // (4)
}
使用举例:
A* p1; //将使用(4) ——全局特化
A* p2; //将使用(3) ——局部特化
A* p3; //将使用(2) ——局部特化
A* p4; //将由(1) ——基本模板——生成
//A
优点:
由:全局特化->局部特化->基本模板这种特化顺序选择和匹配(重载解析规则)是由编译器自动进行无需人工参和
可以根据区别情况(诸如类型区别条件区别)给出区别实现从而获得更加灵活针对性
可以针对任何变化改善了扩展性
2 实参演绎
T const& f(T const& a, T const& b)
{
a + b; //1处
}
g = f(1,2);
实际上f(1,2)要匹配 const& f( const&, const&);
而这个又是如何来呢?
优点:
再也无需提供对尖括号和里面实参诸如f(1,2)有了
实参演绎我们就可以写成f(1,2)

模板应用
1、标准库(STL)——到处都是模板代码
标准库=算法+容器+迭代器
如list /
2、类型无关性(T)
3、trait和policy
(1)trait: 主要用到了许多typedef和特化,指定种特性
// traits/accumtraits3.hpp
template
lass AccumulationTraits;
c template<>
AccumulationTraits {
public:
typedef AccT;
AccT const zero = 0;
};
template<>
AccumulationTraits {
public:
typedef AccT;
AccT const zero = 0;
};
template<>
AccumulationTraits {
public:
typedef long AccT;
AccT const zero = 0;
};
(2)policy:通常表现为某个指定种行为
SumPolicy {
public:
template
void accumulate (T1& total, T2 const & value) {
total value;
}
};
(3)trait和policy使用方法:
template >
Accum {
public:
typedef typename Traits::AccT AccT;
AccT accum (T const* beg, T const* end) {
AccT total = Traits::zero;
while (beg != end) {
Policy::accumulate(total, *beg);
beg;
}
total;
}
};
4、Metaprogramming
编译期计算、递归思想
5、新形式设计模板
(第 3、第 4、第 5点以后再详细介绍)

C Templates中文版具体介绍
第1部分介绍了模板基本概念以教程风格来介绍这些基本概念
第2部分阐述了模板语言细节可以作为本基于模板构造参考手册
第3部分介绍了C模板所支持基本设计技术范围覆盖从微小概念直延伸到复杂使用方法;些技术在别书籍都没有出现过
第4部分基于前两部分深入讨论了各种使用模板普通应用



发信人: robindy (丁丁), 信区: EES
标 题: Re: vc要学多久呀?那位大哥给个说法?Thank you!
发信站: 水上明珠 (Sat Jun 12 19:19:31 2004)

个月可以用VC写些小自己玩玩
学两个月可以用VC写像样点东西在周围人面前炫炫
学 3个月可以用VC给老板开始干活了
学 6个月开始重头去学C++
年后决定要不要继续(继续) 学习MFC、ATL、STL、C#、BCB、Network、Databa
se、Algorithm... 开始就是个
学 3年后学会如何来用编程语言来解决问题VC、BCB等都只是解决问题工具这时候
你如果还在学C++你可以从事软件Software开发这个很有“前途”职业了



Tags: 

延伸阅读

最新评论

发表评论