c++之旅---对象的定义与初始化(3)
时间:2010-08-25 来源:Repository
一个简单的定义指定了变量的类型和标识符,它并不提供初始值。如果一个变量是在全局域global scope 内定义的,那么系统会保证给它提供初始值0 。
打个比方,定义变量
double wage;
int month;
int day;
int year;
unsigned long distance;
salary,wage,month,day,year ,distance的初始值都为0,因为它们都是在全局域内定义的。
如果变量是在局部域local scope 内定义的,或是通过new 表达式动态分配的,则系统不会向它提供初始值0, 这些对象被称为是未初始化的。uninitialized 未初始化的对象不是没有值而是它的值是未定义的undefined 与它相关联的内存区中含有一个随机的位串可能是以前使用的结果。
比如:
{
int int2;
try
{
int int3 = int2 + 10;
cout << int3;
}catch(char *s)
{
cerr << s
}
return 0;
}
int2为local varible,没有初始值,所以在执行 int2+10会出现uninitialize错误。
因为使用未初始化对象是个常见错误而且很难发现,所以一般建议为每个被定义的对象提供一个初始值。
我们再来看看以下代码:
// 未初始化的局部对象
int ival;
// 通过 string 的缺省构造函数进行初始化
string project;
// ...
}
ival 是一个未初始化的局部变量。但project 是一个已经初始化的类对象——被缺省的string 类构造函数自动初始化
初始的第一个值可以在对象的定义中指定。一个被声明了初始值的对象也被称为已经初始化的initialized。
C++支持两种形式的初始化。第一种形式是使用赋值操作符的显式语法形式
int ival = 1024;
string project = "Fantasia 2000";
在隐式形式中初始值被放在括号中
int ival( 1024 );
string project( "Fantasia 2001" );
在对象的定义中,当对象的标识符在定义中出现后对象名马上就是可见的。因此用对象初始化它自己是合法的。只是这样做不太明智
例如:
// 合法, 但不明智
int bizarre = bizarre;
另外每种内置数据类型都支持一种特殊的构造函数语法可将对象初始化为0。
例如:
// 设置ival 为0 dval 为0.0
int ival = int();
double dval = double();
下列定义中:
// int() applied to each of the 10 elements
vector< int > ivec( 10 );
函数int()被自动应用在ivec 包含的10 个元素上。
对象可以用任意复杂的表达式来初始化包括函数的返回值例如
#include <cmath>#include <string>
double price = 109.99, discount = 0.16;
double sale_price( price * discount );
string pet( "wrinkles" );
extern int get_value();
int val = get_value();
unsigned abs_val = abs( val );
abs()是标准C 数学库(cmath)中预定义的函数它返回其参数的绝对值get_value()是一个用户定义的函数,它返回一个随机整数值。