首先,我们应该明确的是在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这些成员的初始化发生的时间是在这些成员的默认构造函数被自动调用之时,也就是它们真正被初始化的时候,因此,它们发生的时间比进入当前构造函数的时间更早。因此,法一相当于对这些已经被默认构造函数初始化的成员变量再次进行赋值,默认构造函数做了无用功。而法二,则是直接就通过成员的构造函数来初始化的,一步到位。

最新文章

  1. react-native 简单的导航
  2. 为什么现在更多需要用的是 GPU 而不是 CPU,比如挖矿甚至破解密码?
  3. MySQL字符串的‘123’转换为数字的123
  4. 相识不易,要懂珍惜----------Spring Mvc
  5. oracle删除表以及清理表空间
  6. JQuery常用函数及功能小结--转载
  7. 20个有用的jq弹窗
  8. pfile 与 spfile
  9. Android应用增加计时器
  10. iOS常用的几种数据存储方式
  11. HTTP详解(3)-http1.0 和http1.1 区别
  12. IIS 之 托管管道模式
  13. 防止非授权用户调用DLL
  14. jquery元素查找方法
  15. 基于Visual C++2013拆解世界五百强面试题--题10-找出N个数种最大的K个数
  16. Startup 和 Middleware(中间件)
  17. C-Lodop提示“有窗口已打开,先关闭它(持续如此请刷新页面)!”
  18. Win32汇编学习(6):键盘输入消息
  19. 5.STM32通用定时器TIM3中断
  20. gcc -02引起内存溢出&#39;unsigned i&#39;应修订为&#39;volatile unsigned i&#39;

热门文章

  1. 【其他】VS提示不一致的行尾
  2. Java入门之:基本数据类型
  3. SPOJ - PHRASES
  4. LOJ6388:[THUPC2018]赛艇——题解
  5. [CQOI2011]放棋子
  6. 用JQuery实现自定义选择桌面
  7. HDU 5249 离线树状数组求第k大+离散化
  8. could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.5 or one of(maven报错)
  9. [nginx]proxy_pass&amp;rewrite知识点
  10. each jquery