ImageVerifierCode 换一换
格式:DOCX , 页数:44 ,大小:3MB ,
资源ID:2364494      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-2364494.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VisualStudioC++入门.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

VisualStudioC++入门.docx

1、VisualStudioC+入门关于C+的一些问题 这一回我自己都不知道应该写点什么好,或许今天的篇幅会比往常短很多。我说过,这不是C+的教程,因为我还没有那个能力来教大家C+,我能做的,是分享一些学习的经验,以及教新手如何使用VC2010这个工具去练习和实践其它C+教材上面的程序,如C+Primer等。 今天说的是我学习和使用C+这些年来对C+的一些理解,这样的日志其实是最难写的,因为众口难调,为什么这么说呢?同样的一段音乐不同的人去倾听都会有不同的感受,不同的心境去听也会有不同的感觉。记得当年我在听雅尼的If I could tell you听到的是无尽的伤感和无奈,而我的朋友却怎么也听不

2、出来,呵,你去听听之后会有什么感觉? 好,回归正题吧。 什么是编程 下面这段话我是从XX百科“编程”词条复制过来的,不敢掠人之美:编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。 这段话说的比较明白,我们如果想让计算机按照我们想要的方式工作,那么我们必须给它命令,有的常见的任务已经由操作系统帮助我们提供了,操作系统将一些简单的指令封装成一个简单的

3、操作,使得我们的操作更容易更简单,然而操作系统提供的操作始终是有限的,如果要扩展计算机的软件系统,就需要编程了。 什么是编程语言 如上所说,编程语言就是人类与计算机交流的桥梁。首先编程语言必须是计算机可以理解的或者是可以间接转换成计算机可以理解的指令的东西。打个比方,如果你在一台普通电脑面前站着,大叫道:“电脑,给哥把C盘根目录下面的A文件拷贝到D盘根目录下面去”。我猜想你就算叫上一天也没用,因为普通的电脑无法识别你的指令,这就算是对“机”弹琴吧。 什么是编译器 如上所说,编程语言是计算机可以直接理解的如机器码或者可以间接转换成计算机可以理解的指令的东西。那么C+就属于后者,那么是什么把C+翻

4、译成计算机可以识别的指令的呢?这就是编译器。 什么是C+ 我不想说C+的历史了,我想说,它是一门编程语言,它可以通过编译器的翻译成为计算机可以识别的指令。比如我们常见的C+代码: int a = 3 + 1; cout a endl; 这翻译成机器码或者计算机可以理解的指令大概可以是这样的: 现在请为我准备一个变量a,请用3+1的和去初始化它,然后请加它的值输出到控制台上并追加上一个空格。 关于C+的更多东西,建议大家去看专门的C+教材或者维基百科、XX百科等相关词条。 学C+学的是什么? 学C+学的是什么?可以说C+是很复杂的,因为要实现一些在其它语言中很简单的任务,在C+中通常都需要更多的

5、代码和时间,以创建一个窗口为例,其它语言由于有内置的支持,甚至当我们创建一个HelloWorld程序时候就已经创建了一个窗口。而在纯粹的C+环境中,这是做不到的,因为C+并没有提供GUI的内置支持,如果要用C+创建窗口,我们需要使用到系统API或者使用封装了这些API的一些库,前者如Win32程序设计后者如MFC、wxWidgets。 但是这些并不能代表C+不好,反而C+是很强大的,我们学习C+学得不仅仅是C+的语法,因为仅仅懂得C+的一些语法又能怎么样呢?演示算法么?其实我认为学习C+的初期当然是熟悉C+的语法,中期当然是学习STL等库、系统API以及熟悉C+的面向对象的思想和一般的设计方法

6、;后期是伴随着你C+生涯的一生的,因为它没有终点的,这时候除了要继续加深对C+的理解之外,还需要去学习各种各样的基于C+的库,因为你需要在这些库的帮助下使用C+去实现更具体的东西,比如一些GUI库如QT、wxWidgets,一些游戏引擎如Ogre、Unreal、Bigworld等,一些网络库如ASIO、RakNet、ACE等。这些库大多有一个特点就是他们是基于C+,封装了底层的API使得我们可以不必每次多去使用繁杂的API来实现我们想要的功能。当然,你也可以用C+去封装这些API,让自己成为一个库作者,方便他人。 学习C+,学习C和C+的库,学习其它各领域的C+库,好好的使用这些库或者自己写一

7、些库,其它一些你能想到的与C+相关的事情。 怎样才能用C+来做事情 通常我认为如果只使用最基本的C+以及其内置库来做事情,那么能做的事情始终是有局限的,因为C+的库毕竟是有限的,我们能用它来写一些核心代码,因为这部分代码通常都不需要与具体的应用关联起来。使用C+以及C+继承的C库我们能做一些简单的文件操作,因此还可以写一些与此相关的处理程序。其实不仅仅是C+,比如C#,加入你在应用中不引入.net Framework下面提供的大量的其它的类(指除了最基本的如System.Console等之外的类),你又能用C#做什么呢?我们在做C#的时候通常要引入一些新的类,引用一些新的命名空间,其实C+也是

8、这样的,要做更具体的事情,就需要除C+本身之外的更多东西才行。 因此,要用C+来做事情,除了C+的基本语法之外,还需要学习一些其它一些内容如Windows API、MFC、DirectX 3D API等。 C+、C#、Java到底谁好? 对于这个问题,我想说的是:语言无贵贱,技术有高低。其实无论什么语言,它们在这里都是编程语言,也许它们看起来不一样,它们用起来也不一样,它们的“翻译”编译器不一样,但是它们的本质作用就是要用它们自己的方式将我们人类的解决问题的方法、思路和流程告知给计算机。这也就是为什么C+、C#、Java可以相互交互的原因。 每个语言就像江湖上的各门派的武功一样,其实真的没有高

9、下之分,只有个人的修为,少林武功就一定强于武当么?碧血剑中袁承志不也用普普通通的五行拳击溃了荣彩么?只是不同的武功在不同的条件下表现不同,他们各自占据了自己有利的地位罢了,以杨家枪法为例,或许二人比武它不厉害,但是征战沙场估计是再适合不过了。 因此不要再纠结什么语言好,什么语言流行了,选择一个自己喜欢的方向,然后调查好那个方向最常用最适合的语言,然后集中注意力坚持的去学习它,这就好了。 今天的内容就是这些,希望对大家有帮助。请大家务必好好学习C+教材,并使用VC2010好好演练,最好能够举一反三自己创造问题自己解决!多看看XX知道C/C+下面的那些问题,每解决一个那样的问题,你自己也会进步。第

10、四章VC2010中初学者常见错误、警告和问题 这一章将帮助大家解释一些常见的错误、警告和问题,帮助大家去理解和解决一些常见问题,并了解它的根本原因。 iostream.h与 下面的代码为什么在VC2010下面编译不过去?#include int main()coutHello World.endl;return 0; 错误信息:fatal error C1083: 无法打开包括文件:“iostream.h”: No such file or directory 造成这个错误的原因在于历史原因,在过去C+98标准尚未订立的时候,C+的标准输入输出流确实是定义在这个文件里面的,这是C风格的定义方法

11、,随着C+98标准的确定,iostream.h已经被取消,至少在VC2010下面是这样的,取而代之的是我们要用头文件来代替,你甚至可以认为是这样定义的: namespacestd #include iostream.h 因此我们可以简单的修改我们的Hello World。 #include using namespace std;int main()coutHello World.endl;return 0; iostream.h是属于C+的头文件,而非C的,因此标准订立的时候被改成了。而C的头文件stdio.h等依然可以继续使用,这是为了兼容C代码。但是它们依然有对应的C+版本,如等。记住,

12、在VC2010上面采用C+风格的头文件而不是C风格的头文件,除非你是在用C。 warning C4996 这是一个警告,请看下面的代码:#include using namespace std;int main()char sz128 = 0;strcpy( sz, Hello World! );coutszendl;return 0; 上面的strcpy会产生这个警告:warning C4996: strcpy: This function or variable may be unsafe. Consider using strcpy_s instead. To disable depre

13、cation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 这是因为VC从2005版本开始,微软引入了一系列的安全加强的函数来增强CRT(C运行时),这里对应的是strcpy_s。_s意为safe的意思,同样的道理,strcat也是同样。因此要解决这个问题,我们可以用strcpy_s来替换strcpy,但是注意strcpy_s并非所有编译器都提供,因此如果要跨编译器,请采用错误信息中所提示的方式,定义_CRT_SECURE_NO_WARNINGS宏来掩耳盗铃吧。另外注意并非所有的加强函数都是在屁股后面加_s,比如stric

14、mp这个字符串比较函数的增强版名字是_stricmp。下面,用strcpy_s来更改程序:int main()char sz128 = 0;strcpy_s( sz, Hello World! );coutszendl;char* pSz2 = new char128;strcpy_s( pSz2, 128, hello);cout pSz2 endl;delete pSz2;return 0; 注意,strcpy_s有两个版本,一个可以帮助我们自动推断缓冲区的大小,而另外一个不能帮助我们推断,因此在编译器不能推断缓冲区大小的时候,我们需要自己指定缓冲区的大小,如上面的程序所演示的那样,关于增

15、强版的函数请参考我写的深入学习C+ String2.1版。 TCHAR、wchar_t、char 请大家看下面这个程序:#include #include #include using namespace std;int main()MessageBox( NULL, 你好HelloWorld!, Information, 0 );return 0; 貌似没什么问题吧?错了,如果你是按照我教你的方法创建的控制台空工程的话,那么会有编译错误: error C2664: “MessageBoxW”: 不能将参数 2 从“const char 17”转换为“LPCWSTR” 这个问题太普遍了,几乎所

16、有的初学者都会遇到而且感到难以应付,因为按照提示使用(LPCWSTR)强制转型貌似并不能帮助我们解决问题,而且这个程序在VC6下面应该是没有任何问题的,那问题出现在哪里呢?问题在这里,请右键单击解决方案浏览器下面的项目,属性, 问题的根本就是字符集问题,在VC6中,我们默认使用的是多字节字符集,而现在我们默认需要的是UNICODE字符集,简单的,我们把这个字符集改成多字节字符集这个问题就解决了: 再试试应该就可以了吧?但是我并不推荐大家这么做,因为让自己的程序适应各种字符集是我们写代码的人义不容辞的义务。 我们把程序改成下面这样:#include #include #include using

17、 namespace std;int main()MessageBox( NULL, TEXT(你好HelloWorld!), TEXT(Information), 0 );MessageBox( NULL, _T(你好HelloWorld!), _T(Information), 0 );return 0; 用两个宏TEXT或者_T都可以解决这个问题,它们两个并没有太大区别,也许区别在于前者是通过windows.h头文件引入的,而_T是通过tchar.h引入的,我推荐大家使用_T和tchar.h,因为tchar.h还帮助我们引入了其它一些很有用的宏,比如_tcscpy_s,这个宏在使用UNIC

18、ODE字符集的时候被替换成wcscpy_s,在使用多字节字符集的使用被替换成strcpy_s。关于这部分的内容,请大家不要错过Windows核心编程的第二章(第四版或第五版都可以),以及深入学习C+ String2.1版。它们都有提到。 有人听说_T可以把多字节字符串转换成UNICODE,因此他写了如下的代码:const char* pStr = haha哈哈;MessageBox( NULL, _T(pStr), _T(Information), 0 ); 当然,除非你运气好的抓狂,否则你是编译不过去的,为什么呢?我们现在应该知道对于Hello这样的字符串,VC2010会默认的将它视为con

19、st char*,即多字节字符串,而LHello前面有个L前缀的被视为UNICODE字符串,这和C#是有区别的,因为C#的字符串总是被视为UNICODE,C+/CLI下面编译器也会帮助我们做到这件事情,所以它们不需要L(C+/CLI兼容L这种写法)。 让我们看看_T的定义吧:#define wxCONCAT_HELPER(text, line) text # line/* could already be defined by tchar.h (its quasi standard) */#ifndef _T #if !wxUSE_UNICODE #define _T(x) x #else /

20、* Unicode */ /* use wxCONCAT_HELPER so that x could be expanded if its a macro */ #define _T(x) wxCONCAT_HELPER(L, x) #endif /* ASCII/Unicode */#endif /* !defined(_T) */ _T在UNICODE下面最终会被替换成L # x。 #是一个编译预处理指令,意味着让L和x贴在一起,比如L # Hello最终就是LHello,因此它可以把Hello转换成UNICODE字符串。那为什么上面的程序不行呢?让我们看看_T(pStr)会被替换成什么

21、:L # pStr -LpStr,哦,LpStr是一个新的标识符,如果你没有定义过它,你当然不能通过编译啦。 因此我们可以了解到_T这样的宏只能处理直接的常量字符串,不能处理其它的情况。而我们上面演示的那种情况需要我们动态的去转换编码,Windows有API可以帮助我们做到,C库也有函数可以帮助我们。恰好我曾经写过这样的代码,欢迎大家参考:ASCII/UNICODE/UTF8字符串互相转换的C+代码 对于_T宏,再说一点东西,或许你会感到奇怪为什么_T不直接定义成#define _T(x) L # x,而要绕个圈子去调用wxCONCAT_HELPER呢?这实际上涉及到宏展开顺序和截断的问题。在

22、这里,我们需要说一个宏参数的概念,这很函数的参数是类似的,这里_T(x)的x就是宏参数,好,记住下面一句话: 如果你定义的宏中使用了#或者是#的话,宏参数将不会被展开,也就是说_T(x)如果直接定义成L#x那么在下面这种情况就会出错( PS: #是给参数加引号的意思): _T(_FUNCTION_),_FUNCTION_是一个预定义的宏,它代表了当前函数的名字,这个展开会是什么呢?L_FUNCTION_。为什么间接调用wxCONCAT_HELPER就能得到正确的结果呢?因为当我们调用wxCONCAT_HELPER的时候,_FUNCTION_已经被_T展开成了函数名。 说多了说多了,如果你觉得复

23、杂可以暂时跳过这些东西,我只是顺便说说。重定义的编译错误和链接错误 让我们在项目里面再添加一个Test.h头文件,方法是右击解决方案中的项目,添加,新建项,C+头文件,名称输入test.h。然后我们在test.h中输入:/*#pragma once*/void print() 回到main.cpp中:#include using namespace std;#include Test.h#include Test.hint main()return 0; 编译一下我们会得到重定义的编译错误: error C2084: 函数“void print(void)”已有主体 或许你会说,你引用(#in

24、clude)了两次,我没你那么傻,我只引用一次不就好了么?是的。你聪明,但是是小聪明哈,因为你不能保证每个人都不去引用它。 这个问题演示的是#pragma once的用处,让我们解开它的注释。编译成功!#pragma once的作用就在于防止头文件被多次引用。你或许见过#ifndef _TEST_H_#define_TEST_H_代码#endif 这样的代码,它们的作用是一样的,如果你跟我一样懒,那么就用#pragma once,如果你打算去没有这个指令的编译器上编译代码,那么还是用后面一种方式吧。 现在让我们来见识一个对初学者稍微复杂一点的链接错误,用创建main.cpp的方法再添加一个te

25、st.h头文件,输入#include Test.h即可。 让我们再编译一次。1test.obj : error LNK2005: void _cdecl print(void) (?printYAXXZ) 已经在 Main.obj 中定义1e:documentsvisual studio 2010ProjectsHelloWorldDebugHelloWorld.exe : fatal error LNK1169: 找到一个或多个多重定义的符号 如果说编译错误好找的话,链接错误对于初学者来说就有点麻烦了,聪明的初学者会去Google、XX寻找答案,笨的初学者就会找所谓的高手、前辈问,而这些高手

26、Or前辈未必有心情为你解释。要解决这个错误有无数种方法。 1.内联,把print声明为内联函数。 inline void print() 这个方法的好处是简单,坏处是局限性太强,意味着你总是需要公开print的实现,因为内联函数必须在编译时就知道实现才行。 2.static,把print声明为static函数: static void print()。 这便告诉编译器,哥是唯一的,而且哥只能被本编译单元的代码调用,这和extern是对应的。简单来说,想要哥帮你做事,请先include哥声明的头文件,也就是#include test.h。 3.h头文件中只放声明,实现放到.cpp中去。 现在te

27、st.h中只有void print();,而实现在test.cpp中: #include Test.h void print() int a = 1; cout a+ endl; 这个时候有意思的是我们在main.cpp无需包含test.h头文件也可以引用print函数,因为print并非static的函数:void print();int main()print();print();return 0; 但是声明一下是必须的。 由于XX空间的帖子的篇幅是有限制的,因此今天只好就说这么几点了。新的内容请大家等候下一章。合理组织项目、使用外部工具让工作更. 这一章跟大家分享一些与c+项目管理、VA

28、X、SVN、VS快捷键等方面的东西。 有效的在项目中组织C+文件,分配各种文件的目录对以后的维护会有好处的,至少不会出现不知道什么东西在什么地方,特别是大的项目,这里用TextSearcher来做例子。 使用SVN来管理项目会让我们的工作更轻松,工作也会更简单容易。 掌握常用的快捷键和常用的VS功能让我们的工作更有效。 合理的组织文件体系 首先说在IDE中为我们的文件分类组织,如下图所示:我把不同功能的代码和文件放在不同的Filter下面,如何添加这样的Filter呢? 这样就可以添加筛选器了,默认情况下VS为我们创建三个筛选器:头文件、源文件和资源文件,实际上我们可以再增加很多。这样区分开的好处就是各个功能的代码被分开了,在文件很多的情况下不会造成混乱。如TextSearcher,它的搜索算法、软件控制逻辑、自定义控件

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2