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

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

  打个比方,定义变量

     

double salary;
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 main()
{
     
int int2;
     
try
     {
     
int int3 = int2 + 10;
     cout 
<< int3;

     }
catch(char *s)
    {
        cerr 
<< s
    }

     
return 0;
}
复制代码

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

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

     我们再来看看以下代码:

    

复制代码
int main() {
// 未初始化的局部对象
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()是一个用户定义的函数,它返回一个随机整数值。

 

 

 

 

posted @   Repository  阅读(1527)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示