一.确保变量的初始化

定义一个变量,int x;

在某些语境下x会初始化为0,但在其他语境下却无法保证。

Class CPoint

{

  int m_iX;

  int m_iY;

}

CPoint pt;//声明一个点pt

pt的成员变量有时会被初始化为0,有时候不会。

读取未初始化的对象会导致不确定的行为。在某些情况下,读取未初始化的对象会让你的程序终止运行,但在另外一些情况下会读入一些随机的bits。最终导致不可预知的程序行为。

最佳的处理方法是永远在对象被使用之前将它初始化;对于无任何成员的内置数据类型,必须手动完成初始化。对象也一样,要保证每个对象在构造时初始化该对象的每个成员。

初始化列表比赋值更有效率。

赋值和列表初始化的区别:

1.使用赋值初始化对象变量时,在构造函数执行前会调用默认构造函数初始化,然后立刻执行赋值操作。这样默认构造函数所做的一切都因此浪费了。通过初始化列表做法,避免了重复操作。

2.有些情况下,即使赋值和初始化列表两者效率一样,也得使用初始化列表。如果成员变量是const或reference,它们就一定要初始化,而不能被赋值。

3.由于C++有着固定的初始化顺序,基类先于子类初始化,class中的变量总是以变量声明的顺序初始化,和成员初始化列表顺序无关,因此在成员初始化列表中初始化各变量时,最好以声明次序为顺序。

二.局部变量和全局变量

变量一般包含4种:全局变量,静态全局变量,静态局部变量,局部变量。

全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,而是属于一个源程序文件。

全局变量说明:

1.外部变量定义必须在所有的函数之外,且只能定义一次。

2.外部变量说明出现在要使用该外部变量的各个函数内,在整个程序内可能出现多次。一般形式为extern 类型说明符 变量名

3.外部变量在定义时已分配了内存单元,外部变量定义可做初始赋值,外部变量说明不能再赋初始值,只是表明在函数内要使用某外部变量

4.外部变量可加强函数模块之间的数据联系,但又使函数要依赖这些变量,因而使得函数的独立性降低。从模块化程序设计的观点来说这是不利的,因此在不必要时尽量不要使用全局变量

5.在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用。

静态存储变量通常是在变量定义时就分配存储单元并一直保持不变,直至整个程序结束。

从作用域看:

全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。其它源文件只需extern 关键字声明即可

静态全局变量也具有全局作用域,它只作用于定义它的文件里,不能作用到其他文件里,即它具有文件作用域。

静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,但只对定义自己的函数体内可见

局部变量也只有局部作用域,它只是在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,所占用的内存也被收回。

从分配内存空间看

全局变量,静态全局变量,静态局部变量都在静态存储区分配空间,而局部变量在栈里分配空间

三.掌握变量定义的位置与时机

关于变量的位置,建议变量定义得离使用位置越近越好,尽量避免变量作用域的膨胀。通过这种方式可以有效减少命名污染问题,同时可以提高代码的可读性和执行效率。

四.如何判定变量是否相等

1.判断两个变量是否相等时,两个变量类型必须相同,绝对不允许出现一个为int而另一个为short这种情况

2.每种类型的变量,其判定依据各不相同。有些可判定是否相等,有些则根本无法判断是否相等

整型值一般包括(unsigned)char,(unsigned)short,(unsigned)int这几种数据类型。

在判断两个整型值是否相等时,应尽量保证两个整型值为同种类型

1.如果两者不是同类型,C++编译器会进行类型转换。因为编译的隐式转换有时会给编程人员带来很多意想不到的麻烦,所以一般禁止两个整型值比较是发生隐式转换

2.如果两者不是同类型,不仅应该禁止隐式转换,显式类型转换更应该是明令禁止的。在这种情况下,应该重新审视设计,以避免这类问题的出现

浮点型变量包括单精度浮点型和双精度浮点型。浮点型的比较不能通过简单的“==”进行判定,必须通过差值的绝对值的精度判定。

判断两个浮点型变量是否相等的实现方法及其优缺点如下:

1.利用差值的绝对值来判断

bool IsEqual(float fValueA,float fValueB,float frelError)

{

  if(abs(fValueA-fValueB)<=frelError)  //frelError是预设的精度,如1e-6,如果要求更高,可以把frelError设置得更小一些

  {

    return true;

  }

  return false;

}

缺点:此方法使用误差分析中所说的绝对误差,在某些场合下基于绝对误差下进行的判断是不可靠的。比如frelError取值为0.0001,而fValue和fValueB也在0.0001附近,那么显然不合适。另外,对于fValueA和fVlaueB大小是10000这样数据的时候,它也不合适,因为10000和10001也可是是伪相等的。适用于fValueA或fValueB在1或者0附近的时候

2.利用差值的相对值精度来判断。

bool IsEqual(float fValueA,float fValueB,float frelError)

{

  if(abs(fValueA)<abs(fValueB))  //frelError是预设的精度,如1e-6,如果要求更高,可以把frelError设置得更小一些

  {

    return (fabs(fValueA-fValueB)/fValueA)>frelError?(true):(false);

  }

  return (fabs(fValueA-fValueB)/fValueB)>frelError?(true):(false);

}

缺点:在某些情况下,相对精度也不能代表全部。例如,在判断空间三点是否共线的时候,使用判断点到另外两个点形成的线段的距离的方法的时候

两个字符串相等要满足两个条件:一是两个字符串的长度必须相等,二是两个字符串的每个字符必须相等

C语言提供几个标准函数,可比较两个字符串是否相等

int strcmp(_In_z_const char* _Str1,_In_z_const char* _Str2);  //大小写敏感

int strcmpi(_In_z_const char* _Str1,_In_z_const char* _Str2);  //大小写不敏感

指针在进行比较时必须保证两个变量是同一类型的指针变量

指针大小只能比较是否相等,无法进行大于和小于的比较

C++变量的更多相关文章

  1. 6 小时 Python 入门

    6 小时 Python 入门 以下操作均在 Windows 环境下进行操作,先说明一下哈 一.安装 Python 1.官网下载 Python 进入官网(https://www.python.org), ...

  2. In-Memory:在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  3. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  4. Shell特殊变量

    $ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...

  5. Java多线程基础——对象及变量并发访问

    在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...

  6. Js 变量声明提升和函数声明提升

    Js代码分为两个阶段:编译阶段和执行阶段 Js代码的编译阶段会找到所有的声明,并用合适的作用域将它们关联起来,这是词法作用域的核心内容 包括变量声明(var a)和函数声明(function a(){ ...

  7. PHP源码分析-变量

    1. 变量的三要素变量名称,变量类型,变量值 那么在PHP用户态下变量类型都有哪些,如下: // Zend/zend.h #define IS_NULL 0 #define IS_LONG 1 #de ...

  8. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  9. shell变量

    定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...

  10. 引人瞩目的 CSS 变量(CSS Variable)

    这是一个令人激动的革新. CSS 变量,顾名思义,也就是由网页的作者或用户定义的实体,用来指定文档中的特定变量. 更准确的说法,应该称之为 CSS 自定义属性 ,不过下文为了好理解都称之为 CSS 变 ...

随机推荐

  1. WIN7 64位通过VPN远程登录 ASP.Net通过VPN访问Oracle服务器

    因为客户这边的服务器是64位的,所以本人手贱,把系统换成了64位的win7,以为来客户这边工作会更方便,谁知道来到客户这边,进不了他们公司的内网,然后给我一个VPN的账号,先VPN然后才能登录他们的测 ...

  2. 柯南君:看大数据时代下的IT架构(3)消息队列之RabbitMQ-安装、配置与监控

    柯南君:看大数据时代下的IT架构(3)消息队列之RabbitMQ-安装.配置与监控 一.安装 1.安装Erlang 1)系统编译环境(这里采用linux/unix 环境) ① 安装环境 虚拟机:VMw ...

  3. BZOJ 1143 [CTSC2008]祭祀river(二分图匹配)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1143 [题目大意] 给出一张有向图,问最大不连通点集,连通具有传递性 [题解] 我们将 ...

  4. iptsbles及磁盘扩容

    如果你的IPTABLES基础知识还不了解,建议先去看看. 们来配置一个filter表的防火墙 1.查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables -L -n Cha ...

  5. python SyntaxError: Non-ASCII character '\xd5' in file

    我使用的是python2.7, 在pycharm想运行程序,但是却报出了SyntaxError: Non-ASCII character '\xd5' in file 原因是因为源码中包含了中文注释, ...

  6. ANDROID资源文件【转】

    1.  资源包括:文本字符串.图像和图标.音频文件.视频和其他应用程序使用的组件. 2.  在Android工程中,Android资源文件是同Java类文件分开存储的,大多数常见的资源类型存储在XML ...

  7. EF简介

    EF:EF是 asp.net的一套ORM框架. ORM: 广义上:ORM指的是面向对象的模型和关系型数据库的数据库之间的相互转换; 狭义上:ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟 ...

  8. 优质UI的7条准则(一)

    本文原文来自于 Medium:https://medium.com/@erikdkennedy/7-rules-for-creating-gorgeous-ui-part-1-559d4e805cda ...

  9. Matlab中边缘提取方法简析

    1.Matlab简述 Matlab是国际上最流行的科学与工程计算的软件工具,它起源于矩阵运算,已经发展成一种高度集成的计算机语言.有人称它为“第四代”计算机语言,它提供了强大的科学运算.灵活的程序设计 ...

  10. 高效的数组去重(js)

    function uniqueArray(data){ data = data || []; var a = {}; for (var i=0; i<data.length; i++) { va ...