首先,我们应该明确的是在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++之初始化问题的更多相关文章

  1. Java初始化过程

    这篇文章主要讲解Java在创建对象的时候,初始化的顺序.主要从以下几个例子中讲解: 继承关系中初始化顺序 初始化块与构造器的顺序 已经加载过的类的初始化顺序 加载父类,会不会加载子类 创建子类对象会不 ...

  2. nginx源码分析之模块初始化

    在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...

  3. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  4. Java类变量和成员变量初始化过程

    一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...

  5. Git学习笔记一:新建本地仓库及初始化

    1.百度搜索Git下载安装,直接按默认选项安装即可. 例如:Git-2.7.2-32-bit_setup.1457942412.exe 2.配置Git信息,建立版本仓库 (Alt+PrintScerr ...

  6. Spring MVC初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...

  7. SpringMVC初始化参数绑定--日期格式

    一.初始化参数绑定[一种日期格式] 配置步骤: ①:在applicationcontext.xml中只需要配置一个包扫描器即可 <!-- 包扫描器 --> <context:comp ...

  8. SpringMvc中初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...

  9. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

  10. 【初探Spring】------Spring IOC(三):初始化过程---Resource定位

    我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...

随机推荐

  1. 【bzoj1707】[Usaco2007 Nov]tanning分配防晒霜 贪心+Treap

    题目描述 奶牛们计划着去海滩上享受日光浴.为了避免皮肤被阳光灼伤,所有C(1 <= C <= 2500)头奶牛必须在出门之前在身上抹防晒霜.第i头奶牛适合的最小和最 大的SPF值分别为mi ...

  2. XML-RPC协议学习

    XML-RPC调用包括2部分:客户端client(调用线程).服务器端server(被调用的线程).服务端是通过特定的URL获得的,调用过程如下: 1.客户端程序使用XML-RPC客户端发出作业请求, ...

  3. Python数据定义

    数据类型: 什么是数据? 在计算机科学中,数据是指所有能输入到计算机并被计算机程序处理的符号的介质的总称,是用于输入电子计算机进行处理,具有一定意义的数字字母.符号和模拟量等的统称.现在计算机存储和处 ...

  4. [洛谷P4092][HEOI2016/TJOI2016]树

    题目大意:给你一棵树,有两个操作: $C\;x:$给第$x$个节点打上标记 $Q\;x:$询问第$x$个节点的祖先中最近的打过标记的点(自己也是自己的祖先) 题解:树剖,可以维护区间或,然后若一段区间 ...

  5. bzoj4300: 绝世好题(DP)

    按位DP f[i]表示第i位为1的最长子序列 #include<iostream> #include<cstring> #include<cstdlib> #inc ...

  6. android xml字符串通配

    1.基本使用方法 xml中定义如下字符串: <string name="buff">%1$d --- %2$s</string> 代码中解析: String ...

  7. UVALive - 5713 最小生成树

    题意: 秦始皇修路,已知n个城市的坐标以及该城市的人口数,修路的费用是两个城市之间的欧几里得距离,其中可以有一条路不用花费代价但是要求这条路连接的两个城市的人口之和A/B尽量大,其中B是修路的总费用. ...

  8. C# 把类实例保存到文件里(类的序列化和反序列化)

    有时候我们希望把类的实例保存下来,以便以后的时候用.一个直观的方法就是StreamWriter把类写成一行,用\t分隔开每个属性,然后用StreamReader读出来. 但是这样太麻烦,代码行数较多, ...

  9. [C#] 类型学习笔记二:详解对象之间的比较

    继上一篇对象类型后,这里我们一起探讨相等的判定. 相等判断有关的4个方法 CLR中,和相等有关系的方法有这么4种: (1) 最常见的 == 运算符 (2) Object的静态方法ReferenceEq ...

  10. java线程的常用方法和属性介绍

    start() start方法是Thread 类的方法,在这个方法中会调用native方法(start0())来启动线程,为该线程分配资源. sleep() sleep方法有2个方法. public ...