c++之旅—对象的定义与初始化(3)

一个简单的定义指定了变量的类型和标识符,它并不提供初始值。如果一个变量是在全局域global scope 内定义的,那么系统会保证给它提供初始值0 。

打个比方,定义变量



doublesalary;

doublewage;

intmonth;

intday;

intyear;

unsigned
longdistance;


salary,wage,month,day,year ,distance的初始值都为0,因为它们都是在全局域内定义的。

如果变量是在局部域local scope 内定义的,或是通过new 表达式动态分配的,则系统不会向它提供初始值0, 这些对象被称为是未初始化的。uninitialized 未初始化的对象不是没有值而是它的值是未定义的undefined 与它相关联的内存区中含有一个随机的位串可能是以前使用的结果。

比如:



intmain()

{

intint2;

try

{

intint3=int2+10;

cout
<<int3;



}
catch(char*s)

{

cerr
<<s

}



return0;

}

int2为local varible,没有初始值,所以在执行 int2+10会出现uninitialize错误。

因为使用未初始化对象是个常见错误而且很难发现,所以一般建议为每个被定义的对象提供一个初始值。

我们再来看看以下代码:



intmain() {

//未初始化的局部对象

intival;

//通过 string 的缺省构造函数进行初始化

stringproject;

//...

}
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>

doubleprice=109.99, discount=0.16;

doublesale_price( price*discount );

stringpet("wrinkles");

externintget_value();

intval=get_value();

unsigned abs_val
=abs( val );


abs()是标准C 数学库(cmath)中预定义的函数它返回其参数的绝对值get_value()是一个用户定义的函数,它返回一个随机整数值。

原文链接: https://www.cnblogs.com/repository/archive/2010/08/25/1808553.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14275

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午1:50
下一篇 2023年2月7日 下午1:50

相关推荐