声明、定义、初始化、赋值

变量的定义形式:

首先是类型说明符,随后紧跟由一个或者多个变量名组成的类别,其中变量名以逗号隔开,最后以分号结束。

例子:int sum,value,unsold;

struct GraphNode{
    int label;
    vector<GraphNode*> neighbors;
    GraphNode(int x):label(x){};
};/*expected ';' after struct definition*/

同理:类的定义后面也要加;

class solution{};

何为对象?

答:对象是具有某种数据类型的内存空间。

初始值:

当对象在创建时获得一个特定的值,我们说这个对象就被初始化(initialized)。(用于初始化变量的值可以使任意复杂的表达式)

WARNING:在c++语言中,初始化和赋值是两个完全不同的操作,初始化不是赋值。

初始化和赋值的区别:

初始化:创建变量时赋予一个初始值;赋值:把对象当前的值擦掉,而以一个新值来替代。

c++11新标准的部分,用花括号来初始化变量(比如 int un_sold{0};)得到全面应用,而在此之前,这种初始化形式在某些受限的场合使用(比如vector,vector<string> articles{"a","an","the"};  这种初始化形式叫做列表初始化),不过现在无论是初始化对象,还是某些时候为对象赋新值都可以使用这样一组由花括号括起来的初始值了。

注意:当使用内置类型变量时候,如果存在丢失信息的风险,编译器将会报错:

long double ld = 3.1451234;

int a{ld};//错误:转换未执行。

int c(ld);//正确,但是丢失信息。

默认初始化:如果定义变量时没有指定的值,则变量被默认初始化(default initialized)。

如果内置属性变量未被显示初始化,它的值由定义的位置决定:

定义于任何函数体之外的变量被初始化为0;定义在函数体内部的内置类型变量将不被初始化(uninitialized)。

为什么一定要初始化(没有初始化的后果):

一个未被初始化的内置属性变量的值是未定义的,如果试图拷贝或者以其他形式访问此类值将引发错误。

每个类各自决定其初始化对象的方式。而且,是否允许不经初始化就定义对象也由类自己决定。如果类允许这种行为,它将决定对象的初始值到底是什么。

绝大多数类都支持无须初始化而定义对象,这样的类(默认构造函数)提供了一个合适的默认值。

例如:string类规定没有指定初始值则生成一个空串。

string empty;//empty非显示的初始化为一个空串。

sales_item item;

一些类要求每个对象都显示初始化,如果创建一个该类对象而未对其做明确的初始化操作,将引发错误。

NOTE:定义于函数体内的内置类型的对象没有初始化,则其值未定义。

类的对象如果没有显示的初始化,则其值由类确定。

TIP:未初始化的变量含有一个不确定的值,会用未初始化变量的值是一种错误的并且很难调试的变成行为。

建议初始化每一个内置类型的变量。

变量声明和定义的关系

为了支持分离式编译,c++语言将声明和定义区分来。

变量声明规定了变量的类型和名字;

变量的定义规定了变量的类型和名字,还申请存储空间,也可能会为变量赋一个初始值。

如果 想申明一个变量并不是定义它,则可以添加external关键字。

extern int i ;//声明并非定义i

int j ;//声明并且定义j


任何包含了显示初始化的声明都会成为定义。

extern double pi = 3.1415;//定义

如果要在多个文件中使用同一个变量,就必须将声明和定义分离,并且变量定义只能出现在一个文件之中,其他用到该变量的文件必须对其进行申明。变量可以声明多次,但是只可以定义一次。

 

函数声明和函数的定义

函数的声明和定义非常类似,唯一的区别就是函数声明无需函数体,用一个分号代替就可以。

int value(); //函数声明

int value(){} //函数定义

函数三要素(返回类型,函数名,形参类型)描述了函数的接口,说明了调用该函数所需要的全部信息,函数声明也称作函数原型(function prototype)

总结:变量(函数)的声明都放在头文件之中,在源文件中定义。

猜你喜欢

转载自blog.csdn.net/qq_34269988/article/details/84612172