您的位置:首页 > 编程语言 > C语言/C++

【C++】变量(三) 变量的初始化

2014-05-26 14:25 183 查看
前面介绍了什么是变量,以及变量的命名与定义,现在我们来了解一下变量的初始化。

 我们都知道,在定义一个变量时,需要明确它的类型和变量名,其实,有时候我们也要为变量设定一个初始值。这样在变量定义时就已被赋值的变量,就是初始化的变量,这个赋值操作称为初始化。

C++语言支持两种初始化的格式:copy-initialization(复制初始化)和direct-initialization(直接初始化)。复制初始化在语句中使用等号;直接初始化则将初始值写在小括号内。如下,为ival赋值1024:

int ival(1024);  //direct-initialization

int ival=1024;   //copy-initialization

在C++程序的编写中,直接初始化比复制初始化的使用要更加灵活。

很多人将变量的初始化看做赋值的一种,但是在C++中这是两个不同的操作符(原书观点)。在其他的语言中,这种区别是很少见的,并且是可以不考虑的。尽管这样,在C++中也要很复杂的程序编写中才会体现出初始化和赋值的区别。

—————————————————————————————————————————————————

多重初始化程序的应用

 当我们初始化一个内置数据类型的变量时,我们要做的只有:提供一个值,别且把这个值复制到被定义的变量中。对于内置数据类型的变量,直接初始化和复制初始化只有很小的区别。但是,对于类类型的变量,我们只能用直接初始化的方式来进行变量的初始化。为了理解这点,我们需要先了解下类对于初始化操作的控制。

  每一个类都是由一个或者多个元函数(成员函数)组成,这些元函数恰恰影响了类类型变量的初始化。这些决定类类型变量初始化的元函数通常称为构造函数(constructor)。像其他的函数一样,构造函数也拥有很多的参数(argument)。每个类都会定义一些构造函数,这些构造函数必须包含不同数目或者类型的参数。下面我们来简单看看string类以便于我们理解。

string类是定义成库函数并且可以作用于变化长度的字符串的类。为了使用string类,我们必须include这个类的标题,像IO类型,string类是定义在std的命名空间的。

sting类定义了一些构造函数,这给了我们很多途径去初始化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.");

 在这个例子中,两种初始化操作都是合法的,它们都创建了一个初始值是特定字符串常量的sting变量。不仅仅是常量,我们也可以通过数量和字符来初始化sting,这样做可以创建一个包含重复一定数量的字符的string:

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

在这个例子中,我们只能通过直接初始化来初始化all_nines,用复制初始化来进行多重初始化程序的操作。

—————————————————————————————————————————————————

初始化多个变量

 如同定义一个一样,在定义多个变量时,每个变量一般都有其自己的初始化程序。在定义变量的时候,变量名的后面加上初始化的变量值,使得这个变量更加直观。在命名语句中,可能同时存在初始化的和非初始化的变量,而且复制初始化和直接初始化可以混合使用。如下:

#include <string>

double salary=9999.99,

wage(salary+0.01);

int interval,

month=8, day=7, year=1995;

std::string title ("C++ Primer, 4th Ed."),

publisher="A-W";

任何表达式都可以用作变量的初始化,包括函数的返回值。如下:

double price=109.99, discount=0.16;

double sale_price=apply_discount(price, discount);

 在这个例子中,apply_discount是一个包含两个double型参数并且返回值是double型的函数,我们可以把计算所得apply_discount的返回值来初始化sale_price这个变量。

—————————————————————————————————————————————————

变量的初始化潜规则

在定义一个变量时,如果我们没有进行初始化操作,系统有时候会帮我们完成初始化。至于初始化的值,主要取决于变量的类型以及被定义的位置。

不管怎样,在函数外定义的变量都被初始化为0。而如果是在函数体内定义的内置型变量,通常是未初始化的。把任何未初始化变量当做左值来使用的赋值行为都是未定义的行为,随之引起的错误很难被发现。所以这种未定义的行为实不可取的。

—————————————————————————————————————————————————

类类型变量的初始化

 每个类都会定义它的对象的初始化方式,它通过定义不同的构造函数来控制变量的初始化。例如,在string类中至少有两个构造函数,一个使我们可以初始化为字符串常量,另一个使我们可以初始化为字符或者是数量。

类同样定义了初始化程序对于被定义的变量类型不可用的结果,这是通过定义默认构造函数(default constructor)来实现的。之所以称为默认构造函数,是因为当变量没有被初始化的时候,这个函数是默认运行的,而且不管这个变量是在哪里被定义的。

 很多的类都会定义默认构造函数,如果一个类定义了默认构造函数的话,我们有时就不需要一对一的对变量进行初始化操作。例如,string类型定义了一个默认构造函数,使得“string”称为一个空的字符串常量:

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

对于那些没有定义默认构造函数的类,我们必须针对每个变量进行初始化操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息