C++变量

一.确保变量的初始化

定义一个变量,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 关键字声明即可

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

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

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

从分配内存空间看

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

时间: 2024-08-09 22:15:41

C++变量的相关文章

前端面试合集

VUE 1.什么是 vue 生命周期 2.vue生命周期的作用是什么 3.第一次页面加载会触发哪几个钩子 4.简述每个周期具体适合哪些场景 5.created和mounted的区别 6.vue获取数据在哪个周期函数 7.请详细说下你对vue生命周期的理解? vue路由面试题 mvvm 框架是什么?vue-router 是什么?它有哪些组件 active-class 是哪个组件的属性?怎么定义 vue-router 的动态路由? 怎么获取传过来的值vue-router 有哪几种导航钩子?6.$ro

Linux下修改环境变量PATH

1.什么是环境变量(PATH) 在Linux中,在执行命令时,系统会按照PATH的设置,去每个PATH定义的路径下搜索执行文件,先搜索到的文件先执行. 我们知道查阅文件属性的指令ls 完整文件名为:/bin/ls(这是绝对路径), 那你会不会觉得很奇怪:"为什么我可以在任何地方执行/bin/ls这个指令呢? " 为什么我在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢? 这是因为环境变量 PATH 的帮助所致呀! 当我们在执行一个指令癿时候,举例

Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量)

原文:http://www.cnblogs.com/heshan664754022/archive/2013/03/27/2984357.html Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量) 用文本编辑工具打开用于启动Tomcat的批处理文件startup.bat,仔细阅读.在这个文件中,首先判断CATALINA_HOME环境变量是否为空,如果为空,就将当前目录设为CATALINA_HOME的值.接着判断当前目录下是否存在bin\catalina.bat,如果文件

JavaScript的进阶之路(二)函数简介,变量、作用域和内存问题

<h3>ECMAScript中函数不存在函数签名的概念,没有重载</h3><h3>无需指定返回值,可以在任何时候返回任何值.未指定返回值的函数,返回的是一个特殊的undefined值</h3> <script type="text/javascript"> function sayHi(){ console.log("Hi"); }; sayHi(); function sayName(name,age){

Linux下修改.bash_profile 文件改变PATH变量的值

Linux中含有两个重要的文件 /etc/profile和$HOME/.bash_profile 每当系统登陆时都要读取这两个文件,用来初始化系统所用到的变量,其中/etc/profile是超级用户所用,$HOME/.bash_profile是每个用户自己独立的,我们可以修改该文件来设置一些变量. 命令用法如下 $ cd (进入用户登陆目录) $ls –al .bash_profile(.bash_profile为隐藏文件,因此要用ls –a命令查找) $vi .bash_profile(用vi

linux安装maven及配置环境变量 配图

Maven 3.5.0 maven安装和环境变量的配置 1 下载 maven 链接:http://pan.baidu.com/s/1qXXjXfe 密码:r92r 2 解压安装包 tar zvxf apache-maven-3.5.0-bin.tar.gz 3  配置maven环境变量 vi  /etc/profile   编辑系统配置文件 #set Maven environmentexport MAVEN_HOME=/usr/local/software/dir-maven/apache-m

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

[转]表变量和临时表的比较

本文转自;http://www.cnblogs.com/CareySon/archive/2012/06/11/TableVariableAndTempTable.html 关于表变量是什么(和表变量不是什么),以及和临时表的比较让很多人非常困惑.虽然网上已经有了很多关于它们的文章,但我并没有发现一篇比较全面的.在本篇文章中,我们将探索表变量和临时表是什么(以及不是什么),然后我们通过使用临时表和表变量对其解密. 表变量 表变量在SQL Server 2000中首次被引入,那么,什么是表变量呢?

Java的成员变量初始化

对于方法里面的成员变量,Java要求程序员强制提供一个初始化的值.比如下面这个方法就会出错: public class Breakyizhan{ public void Z(){ int z; z++; } public static void main(String[] args) { Breakyizhan B = new Breakyizhan(); B.Z(); } } /* (www.breakyizhan.com) 输出结果是: 编译会出错,方法变量没有初始化 */ 而对于类的数据,

关于makefile中变量的多次赋值以及override指令

1 基本原则如下 1.1 原则1 变量的普通赋值是有先后顺序的,后面的赋值会覆盖掉前面的赋值. 1.2 原则2 使用的时候,用的是其前面最后的赋值,就算其后面有使用了override指令的赋值也不会影响这条原则. 1.3 原则3 当使用了override指令定义赋值了变量后,其后对该变量的所有的赋值都是无效的.但是override之前的所有的赋值都是有效的.使用的时候是往前最近原则. 2 override变量.命令行参数和普通变量之间的屏蔽关系 override变量会屏蔽命令行参数,除非用+=: