VC++学习之一
对于编程语言,我一直认为它只是一种工具,就像锤子,斧头一样,每种语言都用自己比较适用的地方,用的时候拿来就可以了。这种思想让我对语言没有做过很仔细的学习,虽然频繁使用过C,C++,java,C#,Delphi,python,perl,javascript等,但是让我对某种语言提出我的一些想法和见解,理解的就比较少了,所以我一直是一个工具的使用者,甚至连一个熟练的技术工都不算。近一段时间,将会频繁使用C++,所以抽出一段时间,对C++做一个相对仔细的学习,在以后陆续作出分享,希望同我有一样经历的同学能够从中得到学习...
回到正题
(1)“定义问题”
C++是一种静态语言,对定义的要求很严格,每个对象使用前要声明或者定义,对重复定义和未定义行为会报错;
1)一般的内置类型或者库类型的声明和定义:因为一般的程序都不会只是单独一个文件,多个文件交互中经常会有变量的传递和处理。这个时候,对变量的声明和定义就显得很重要,可以在多个文件里声明同一个变量,但是只能在一个文件里对其定义。这样多个文件可以访问同一个变量,而这个变量的值是由定义它的那个文件给出的。
非const变量的声明和定义:
//one.cc
int Val; //define
//two.cc
extern int Val; //declaration
const变量的声明和定义:
//one.cc
extern const int Val=5; //define
//two.cc
extern const int Val; //declaration
2)防止头文件的重定义:使用预处理器变量
用一个简单的例子来说明:假如我自己写了两个头文件one.h,和two.h。其中one.h包括的是一个类的定义;two.h由于也要用到这个类,所以这个头文件里面必然要有一行程序:#include“one.h”。
而我们的主程序里面,开始必然要把我们自己定义的头文件给加进去,必然应该有两行程序:#include“one.h”和#include“two.h”,这样实际上one.h这个头文件被包含了两次,那个类的也相当于定义了两次,必然编译时会出现错误,为了解决这个问题。在one.h里应该加入这么一段程序:
#ifndef ONE
#define ONE
//这里应是one.h里面本来应该有的代码程序
#endif
这样这个头文件在主程序处理时只会被处理一次。因为:当主程序首先碰到这句::#include“one.h,时,由于是第一次处理one头文件,ONE这个预处理器变量还没有定义呢,所以会执行#define ONE这个语句,ONE变量被定义了,头文件one中的代码也会被执行了。当主程序碰到这句:#include“two.h”,由于two头文件中,也有这么一句:#include“one.h”,然后程序就会再次进入到one这个头文件中执行,这是由于ONE这个变量在第一次执行one这个头文件时已经被定义了,所以#ifndef ONE判断失败,不会执行后续的代码了,也就不会在执行one头文件中实际有用的代码了。这样保证了头文件只会被处理一次。
所以作为好的编程习惯,我们应该在自己编写的每个头文件中都加上保护符,避免头文件被多次包含。
3)未定义行为是编译器经常报错的问题
未定义行为:语言没有规定其意义的用法。C++中常见的未定义问题有:
1、连接字符串字面值和宽字符串字面值。
2、使用在函数体内定义的未初始化的变量(非用作赋值操作符的左操作数)。
3、获取不存在的元素也是未定义行为。
当然这类问题很多,需要我们在平时积累并注意这种细节问题。
(2)表达式结合顺序问题
先把自己的错误给出来大家看看,这道题目是《C++ primer》第四版习题3.13的我的解答
int intval;
vector<int> vectorval;
while (cin>>intval)
{
vectorval.push_back(intval);
}
vector<int>::size_type length=vectorval.size();
if (length%==)
{
//如果是偶数
for (int i=;i!=length-;i++)
{
cout<<"plus:"<<vectorval[i]+vectorval[++i]<<endl;
}
}
else
{
//如果是奇数
for (int i=;i!=length-;i++)
{
cout<<"plus:"<<vectorval[i]+vectorval[++i]<<endl;
}
cout<<"the last number is:"<<vectorval[length-]<<endl;
}
getchar();
return ;
(当然这里是省略了头文件引用)一个疏忽出现如下结果

按照自己想法应该得出的是 3,13,13;5。可是结果为什么会这样,原因就在于cout<<语句的执行顺序,是从右往左执行,这下明白了....
VC++学习之一的更多相关文章
- 孙鑫VC学习笔记:多线程编程
孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010 HQU Email:zgzhaobo@gmail.com QQ:452728574 Latest Modified ...
- VC++ 学习笔记(序):神一样的语言
总的来说,我觉得VC++是一门神一样的语言——它是公认最强大.最复杂的:它一切以效率为第一要务,却又不肯落伍,拼命兼容现在的新的语言设计特点.本来在别的语言很容与就避开的问题,在这里要用很高的技巧去设 ...
- VC++学习之GDI概述
VC++学习之GDI概述 图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏 ...
- VC++学习之VC中常见问题
VC++学习之VC中常见问题 (1)为什么某个类突然在工作区间里面突然看不见了? 只是类隐藏了,打开FILEVIEW,找到隐藏类的头文件,随便敲一下键盘的空格键,类就会在CLASSVIEW中显示了 ( ...
- VC++学习之进程和线程的区别
VC++学习之进程和线程的区别 一.进程 进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格.内存空间.磁盘 ...
- VC++学习之网络编程中的套接字
VC++学习之网络编程中的套接字 套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程.应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问 ...
- VC学习笔记:对话框
VC学习笔记:对话框 SkySeraph NOV.11st 2009 HQU Email-zgzhaobo@gmail.com QQ-452728574 Latest Modified Date:O ...
- VC++ 学习笔记(三):摩登之路——C++/CLI简介
在Windows上,除非我们必须得用C++来写界面,否则我会选择避免,避免学习和使用MFC.替代的方案是用C#来做界面,然后用C++/CLI来连接C#和Native C++.那么问题来了,C++/CL ...
- VC++ 学习笔记(二):VC++与C、VB和C#
罗马不是一天建成的,VC++的也不是凭空产生的——它一直标榜自己的从C发展而来的.VB好像是专门为了羞辱VC++而创建的.C#呢,是微软类C语言的新秀——其实也不新了.乱吧?貌似挺乱的,其实这里有章可 ...
- VC++ 学习笔记(一):如何开始
毫无疑问,学习C++是一件痛苦的事情. 我大概十年前接触C++.那是在学校里,准备考研究生,某学校要求考C++.我就开始一点一点学习,学习的过程还是比较舒服的.不得不说,就古典C++的理论,钱老讲的还 ...
随机推荐
- 十、装饰(Decorator)模式 --结构模式(Structural Pattern)
装饰(Decorator)模式又名包装(Wrapper)模式[GOF95].装饰模式以对客户端透明的方 式扩展对象的功能,是继承关系的一个替代方案. 装饰模式类图: 类图说明: 抽象构件(Compon ...
- 外贸中MFQ
MFQ = Mask Fee Quantity 退掩膜费量Masking charge USD 2000. MFQ 100k in the first year
- Linux远程桌面
发现windows下有个VNC viewer.据说是跨平台的. sudo apt-cache search VNC | grep VNC了一下.发现有一个gvncviewer的包,然后apt-get ...
- Qt编程之QtScript
需求是这样的: 需要给一个硬件接口测试些东西,用js来调用,js做成不同的独立模块分别测试不同的硬件接口,包括DMD内存,PCIE带宽等等.需要用一个exe来载入这些js文件分别调用测试模块.exe用 ...
- 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.0
/** * 百度地图使用工具类-v1.5 * * @author boonya * @date 2013-7-7 * @address Chengdu,Sichuan,China * @email b ...
- Unity 读取Excel
游戏有大多数配置文件,比如玩家等级,游戏商店信息等等.通常情况下把这些放入excel中来读取 第一种解决方案: xlsx –> csv –> 改变成UTF-8 或者Unicode编码 –& ...
- android scrollview 简单的使用
以前写的Scrollview ,通常都是与Listview结合使用,不过因复杂可能新手不太懂,网上有许多文章,这里就不贴那个了DEMO了. 写了个简单的供大家参考:这样比较好理解(需要复杂的可以Q我 ...
- 俄罗斯方块:win32api开发
本文简述一门课程,演示win32api开发俄罗斯方块的开发过程.如果学生学习过C语言,没学过或者学习C++不好,刚刚開始学习win32api程序设计,还不懂消息循环和注冊窗体类. 近期的照片在这里 ...
- Windows Mobile 6 sdk installation error, COM3 in use,please check the implementation
问题:Windows Mobile 6 sdk installation error, COM3 in use,please check the implementation 1. Windows-& ...
- [Manacher][HDU3613][Best Reward]
题意: 将一段字符串 分割成两个串 如果分割后的串为回文串,则该串的价值为所有字符的权值之和(字符的权值可能为负数),否则为0. 问如何分割,使得两个串权值之和最大 思路: 裸的: 枚举分割点,计算, ...