【C++】变量(三) 变量的初始化
2014-05-26 14:25
183 查看
前面介绍了什么是变量,以及变量的命名与定义,现在我们来了解一下变量的初始化。
我们都知道,在定义一个变量时,需要明确它的类型和变量名,其实,有时候我们也要为变量设定一个初始值。这样在变量定义时就已被赋值的变量,就是初始化的变量,这个赋值操作称为初始化。
C++语言支持两种初始化的格式:copy-initialization(复制初始化)和direct-initialization(直接初始化)。复制初始化在语句中使用等号;直接初始化则将初始值写在小括号内。如下,为ival赋值1024:
在C++程序的编写中,直接初始化比复制初始化的使用要更加灵活。
很多人将变量的初始化看做赋值的一种,但是在C++中这是两个不同的操作符(原书观点)。在其他的语言中,这种区别是很少见的,并且是可以不考虑的。尽管这样,在C++中也要很复杂的程序编写中才会体现出初始化和赋值的区别。
—————————————————————————————————————————————————
多重初始化程序的应用
当我们初始化一个内置数据类型的变量时,我们要做的只有:提供一个值,别且把这个值复制到被定义的变量中。对于内置数据类型的变量,直接初始化和复制初始化只有很小的区别。但是,对于类类型的变量,我们只能用直接初始化的方式来进行变量的初始化。为了理解这点,我们需要先了解下类对于初始化操作的控制。
每一个类都是由一个或者多个元函数(成员函数)组成,这些元函数恰恰影响了类类型变量的初始化。这些决定类类型变量初始化的元函数通常称为构造函数(constructor)。像其他的函数一样,构造函数也拥有很多的参数(argument)。每个类都会定义一些构造函数,这些构造函数必须包含不同数目或者类型的参数。下面我们来简单看看string类以便于我们理解。
string类是定义成库函数并且可以作用于变化长度的字符串的类。为了使用string类,我们必须include这个类的标题,像IO类型,string类是定义在std的命名空间的。
sting类定义了一些构造函数,这给了我们很多途径去初始化string。其中一种就如复制一个字符串常量:
在这个例子中,两种初始化操作都是合法的,它们都创建了一个初始值是特定字符串常量的sting变量。不仅仅是常量,我们也可以通过数量和字符来初始化sting,这样做可以创建一个包含重复一定数量的字符的string:
在这个例子中,我们只能通过直接初始化来初始化all_nines,用复制初始化来进行多重初始化程序的操作。
—————————————————————————————————————————————————
初始化多个变量
如同定义一个一样,在定义多个变量时,每个变量一般都有其自己的初始化程序。在定义变量的时候,变量名的后面加上初始化的变量值,使得这个变量更加直观。在命名语句中,可能同时存在初始化的和非初始化的变量,而且复制初始化和直接初始化可以混合使用。如下:
任何表达式都可以用作变量的初始化,包括函数的返回值。如下:
在这个例子中,apply_discount是一个包含两个double型参数并且返回值是double型的函数,我们可以把计算所得apply_discount的返回值来初始化sale_price这个变量。
—————————————————————————————————————————————————
变量的初始化潜规则
在定义一个变量时,如果我们没有进行初始化操作,系统有时候会帮我们完成初始化。至于初始化的值,主要取决于变量的类型以及被定义的位置。
不管怎样,在函数外定义的变量都被初始化为0。而如果是在函数体内定义的内置型变量,通常是未初始化的。把任何未初始化变量当做左值来使用的赋值行为都是未定义的行为,随之引起的错误很难被发现。所以这种未定义的行为实不可取的。
—————————————————————————————————————————————————
类类型变量的初始化
每个类都会定义它的对象的初始化方式,它通过定义不同的构造函数来控制变量的初始化。例如,在string类中至少有两个构造函数,一个使我们可以初始化为字符串常量,另一个使我们可以初始化为字符或者是数量。
类同样定义了初始化程序对于被定义的变量类型不可用的结果,这是通过定义默认构造函数(default constructor)来实现的。之所以称为默认构造函数,是因为当变量没有被初始化的时候,这个函数是默认运行的,而且不管这个变量是在哪里被定义的。
很多的类都会定义默认构造函数,如果一个类定义了默认构造函数的话,我们有时就不需要一对一的对变量进行初始化操作。例如,string类型定义了一个默认构造函数,使得“string”称为一个空的字符串常量:
对于那些没有定义默认构造函数的类,我们必须针对每个变量进行初始化操作。
我们都知道,在定义一个变量时,需要明确它的类型和变量名,其实,有时候我们也要为变量设定一个初始值。这样在变量定义时就已被赋值的变量,就是初始化的变量,这个赋值操作称为初始化。
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=""
对于那些没有定义默认构造函数的类,我们必须针对每个变量进行初始化操作。
相关文章推荐
- 21天学通c++之7.10 for 循环 初始化多个变量
- c++ 类中static变量初始化问题
- C++变量初始化问题总结
- 明确c++变量的一些概念:初始化,赋值
- 关于c++的类中成员变量初始化问题+初始化列表中对应顺序问题!
- C++中变量的初始化问题
- C++函数中的static变量初始化及析构顺序
- C++中使用初始化列表比在构造函数中对成员变量赋值更高效
- c++成员变量初始化问题
- [笔试题 9][c/c++]关于成员变量,对象成员的初始化问题
- c++变量初始化(猜想......)
- c++成员变量初始化问题
- C/C++ 的全局变量初始化与不初始化的区别
- [C++再学习系列] 变量与声明时初始化
- [c++] c++ 类中的静态变量初始化
- 用变量初始化C++的二维数组维数
- C/C++基础问答(1):通过初始化列表和构造函数内赋值初始化成员变量的区别
- C++全局变量初始化顺序
- C C++全局变量初始化 initializer element is not constant 错误 c++中为什么不能对全局变量在函数外赋值
- C/C++ 的全局变量初始化与不初始化的区别