C++之初始化问题
首先,我们应该明确的是在C++中初始化不是赋值,因为初始化是必要的,如果读取了未初始化的值将会导致不明确的行为。初始化指创建变量并且给它赋初值,而赋值则是擦除对象的当前值并用新值代替。C++支持两种初始化变量的方式:复制初始化和直接初始化:
int ival(1000);//直接初始化是将初始化式放在括号里
int ival=1000;//复制初始化是用等号(=)
那么这两种方式有什么区别呢?我们可以这样认为,对于内置类型来说,复制初始化和直接初始化几乎没有差别,对于类类型来讲,当创建类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后使用复制构造函数将那个临时对象复制到正在创建的对象:
string strVal1="2014";//编译器首先调用接受一个字符串形参的string构造函数,创建一个临时对象,然后,编译器使用
string复制构造函数将strVal1初始化为那个临时对象的副本
string strVal2("2014");//直接调用string类中匹配的构造函数
string strVal3 = string();//先使用默认构造函数创建一个临时对象,使用复制构造函数将那个临时对象复制到正在创建的对象
string strVal4;//直接运行strVal4的默认构造函数
其次,讲讲变量的初始化规则:
内置类型变量的初始化是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化成0,在函数体内定义的内置变量不进行自动初始化,因此,实际编程中,建议每个内置类型的对象都要初始化,虽然有时候这样做并不总是必须的。类类型的初始化与它的默认构造函数是否存在有关,只要它有默认构造函数,则不管变量在那里定义,我们都可以不提供初始化式,相反,我们则需要每个定义都必须提供显式的初始化式,如:
string emptyStr;//因为类中定义了默认构造函数来初始化string变量为空字符串
接下来,我们来看看关于类类型的两种构造函数的写法
法一:
TestOne::TestOne(const std::string &name,const::string & address,
const std::list<PhoneNumber>& phones)
{
theName=name;
theAddress=address;//注意这些都是赋值,而非初始化
thePhones=phones;
}
法二:
TestTwo::TestTwo(const std::string &name,const::string & address,
const std::list<PhoneNumber>& phones)
:theName(name),
theAddress(address),//现在这些都是初始化
thePhones(phones)
{ }//现在,构造函数体不必有任何动作
这两种方法都可以满足我们的需要,但是效果是不一样的。
C++中规定,对象的成员变量的初始化动作发生在进入构造函数本体之前,在法一中,theName,theAddress,thePhone这些成员的初始化发生的时间是在这些成员的默认构造函数被自动调用之时,也就是它们真正被初始化的时候,因此,它们发生的时间比进入当前构造函数的时间更早。因此,法一相当于对这些已经被默认构造函数初始化的成员变量再次进行赋值,默认构造函数做了无用功。而法二,则是直接就通过成员的构造函数来初始化的,一步到位。
C++之初始化问题的更多相关文章
- Java初始化过程
这篇文章主要讲解Java在创建对象的时候,初始化的顺序.主要从以下几个例子中讲解: 继承关系中初始化顺序 初始化块与构造器的顺序 已经加载过的类的初始化顺序 加载父类,会不会加载子类 创建子类对象会不 ...
- nginx源码分析之模块初始化
在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- Java类变量和成员变量初始化过程
一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...
- Git学习笔记一:新建本地仓库及初始化
1.百度搜索Git下载安装,直接按默认选项安装即可. 例如:Git-2.7.2-32-bit_setup.1457942412.exe 2.配置Git信息,建立版本仓库 (Alt+PrintScerr ...
- Spring MVC初始化参数绑定
初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法 使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型 proper ...
- SpringMVC初始化参数绑定--日期格式
一.初始化参数绑定[一种日期格式] 配置步骤: ①:在applicationcontext.xml中只需要配置一个包扫描器即可 <!-- 包扫描器 --> <context:comp ...
- SpringMvc中初始化参数绑定
初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法 使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型 proper ...
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
- 【初探Spring】------Spring IOC(三):初始化过程---Resource定位
我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...
随机推荐
- Android出现:Your project path contains non-ASCII characters.
导入Project的出现: Error:(1, 0) Your project path contains non-ASCII characters. This will most likely ca ...
- 【bzoj3312】[Usaco2013 Nov]No Change 状态压缩dp+二分
题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...
- web服务器压测工具siege、ab
web服务器压测工具也挺多,这里只介绍我用过的这两种--siege(for linux).ab(for windows). 一.siege 1.简介: Siege是一款开源的压力测试工具,设计用于评估 ...
- hdu 1528 Card Game Cheater (二分匹配)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- django_filters实现搜索
定义model # models.py class Product(models.Model): name = models.CharField(max_length=255) author = mo ...
- CentOS expr和let
1.expr,用于计算变量等 用法:expr 表达式 用例1: #运算符号和参数之间要有空格分开:[es@bigdata-senior01 ~]$ expr 2 + 3 5 #乘号(*)需要用 \ , ...
- [洛谷P3224][HNOI2012]永无乡
题目大意:给你$n$个点,每个点有权值$k$,现有两种操作: 1. $B\;x\;y:$将$x,y$所在联通块合并2. $Q\;x\;k:$查询第$x$个点所在联通块权值第$k$小是哪个数 题解:线段 ...
- MySQL安装出现“不是内部或外部命令,也不是可执行程序”等一系列问题的解决方案
MySQL安装出现“不是内部或外部命令,也不是可执行程序” 一.这是应该是环境变量处问题了,设置如下: 1)右击我的电脑选择“属性”,找到“高级系统设置” 2)在系统属性下,选择“高级”中的“环境变量 ...
- ES6 Set,WeakSet,Map,WeakMap
1. Set Set是一个集合,里面的值都是唯一的,没有重复的.Set中可以是任何数据类型,并且添加数据时会进行严格比较,重复数据无法加入. 2. WeakSet 弱引用Set.只能存储对象,不能存储 ...
- linux 使用vim文件加密/解密的方法
一. 利用 vim/vi 加密:优点:加密后,如果不知道密码,就看不到明文,包括root用户也看不了:缺点:很明显让别人知道加密了,容易让别人把加密的文件破坏掉,包括内容破坏和删除: vi编辑器相信大 ...