《C++ Primer》笔记C++变量初始化

这里说的直接初始化以前没用过,或者是忘记了:

C++ 支持两种初始化变量的形式:复制 初始化和直接初始化。复制初始化语法用等号(=),直接初始化则是把初始化 式放在括号中:

      int ival(1024);     // direct-initialization
      int ival = 1024;    // copy-initialization

这两种情形中,ival 都被初始化为 1024。 

在 C++ 中理解 “初始化不是赋值”是必要的。初始化指创建变量并给它赋初 始值,而赋值则是擦除对象的当前值并用新值代替。 当初始化类类型对象时,复制初始化和直接初始化之间的差别是很微妙的。我们在第十三章再详细解释它们之间的差别。现在我们只需知道,直接初始化语法更灵活且效率更高。

类对象初始化:

string 类定义了几个构造函数,使得我们可以用不同的方式初始化 string 对象。其中一种初始化 string 对象的方式是作为字符串字面值的副本:

      #include <string>

// alternative ways to initialize string from a character string literal

      std::string titleA = "C++ Primer, 4th Ed.";
      std::string titleB("C++ Primer, 4th Ed.");

本例中,两种初始化方式都可以使用。两种定义都创建了一个 string 对象, 其初始值都是指定的字符串字面值的副本。

也可以通过一个计数器和一个字符初始化 string 对象。这样创建的对象包 含重复多次的指定字符,重复次数由计数器指定:

      std::string all_nines(10, '9');   // all_nines= "9999999999"

本例中,初始化 all_nines 的唯一方法是直接初始化。有多个初始化式时 不能使用复制初始化。 

类通过定义一个或多个构造 函数来控制类对象的初始化 。

如果定义某个类的变量时没有提供初始化式,这个类也可以定义初始化时的 操作。它是通过定义一个特殊的构造函数即默认构造函数来实现的。这个构造函 数之所以被称作默认构造函数,是因为它是“默认”运行的。如果没有提供初始 化式,那么就会使用默认构造函数。不管变量在哪里定义,默认构造函数都会被 使用。 

例如,string 类定义了默认构造函 数来初始化 string 变量为空字符串,即没有字符的字符串: 

std::string empty;  // empty is the empty string; empty =""

变量初始化规则 :

内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变 量都初始化成 0,在函数体里定义的内置类型变量不进行自动初始化。除了用作 赋值操作符的左操作数,未初始化变量用作任何其他用途都是没有定义的。未初 始化变量引起的错误难于发现。正如我们在第 2.2 节劝告的,永远不要依赖未 定义行为。 

警告:未初始化的变量引起运行问题
使用未初始化的变量是常见的程序错误,通常也是难以发现的错误。

建议每个内置类型的对象都要初始化。虽然这样做并不 总是必需的,但是会更加容易和安全,除非你确定忽略 初始化式不会带来风险。 

原文地址:https://www.cnblogs.com/worldtraveler/p/2835102.html