第2章C++的变量、类型及函数 本章内容: ■2.1声明及定义 ■2.2类型定义 ■2.3引用类型 ■2.4函数参数 ■2.5函数内联
第2章 C++的变量、类型及函数 本章内容: 2.1 声明及定义 2.2 类型定义 2.3 引用类型 2.4 函数参数 2.5 函数内联
声明及定义 声明:对名及其内涵的不完整描述。 定义:对该名及其内涵的完整描述。 名可以声明多次,但只能定义一次。 ■ 类型声明:前向引用声明只说明类名。 class Student; ■ 变量声明:类型、变量名。定义再加初 值。 ■ 函数声明:函数原型只说明函数名,返回 类型以及函数参数。定义再加函数体
2.1 声明及定义 声明:对名及其内涵的不完整描述。 定义:对该名及其内涵的完整描述。 名可以声明多次,但只能定义一次。 类型声明:前向引用声明只说明类名。 class Student; 变量声明:类型、变量名。定义再加初 值。 函数声明:函数原型只说明函数名,返回 类型以及函数参数。定义再加函数体
.1声明及定义 C语言:一般只允许以常量表达式初始化变 量,局部非静态变量可以用任意表达式初始 化。变量声明和定义必在语句前。 C++语言:所有变量都可以用任意表达式初始 化。变量声明和定义不必在语句前。兼容C,局 部非静态变量如不初试化,则其值不确定。 ■常量表达式:编译时可计算出常量值。 任意表达式:常量、变量、函数调用等组成。 只能在运行时计算出值
2.1 声明及定义 C语言:一般只允许以常量表达式初始化变 量,局部非静态变量可以用任意表达式初始 化。变量声明和定义必在语句前。 C++语言:所有变量都可以用任意表达式初始 化。变量声明和定义不必在语句前。兼容C,局 部非静态变量如不初试化,则其值不确定。 常量表达式:编译时可计算出常量值。 任意表达式:常量、变量、函数调用等组成。 只能在运行时计算出值
.1声明及定义 常量表达式:3, 3.14*3*3,size2, sizeof(int[2]),sizeof(3+printf("ABC")) 任意表达式: ·常量表达式 ·A,3+A printf(“ABCDEF) ·3+printf(“ABCDEF) ■注意:int[2]是类型表达式,而非值表达式。 值表达式包括常量表达式和任意表达式。值表 达式又可分为左值或右值表达式
2.1 声明及定义 常量表达式: 3, 3.14*3*3, size 2, sizeof(int[2]), sizeof(3+printf( “ABC ”)) 任意表达式: 常量表达式 A, 3+A printf(“ABCDEF”) 3+ printf(“ABCDEF”) 注意: int[2]是类型表达式,而非值表达式。 值表达式包括常量表达式和任意表达式。值表 达式又可分为左值或右值表达式
,1声明及定义 左值表达式:可以出现在等号左边的表达式。 。非只读类型的变量:intx;x=2; 引用非只读类型的变量:int&y=x;y=3; 0 指向非只读单元的内容访问:intp=&x;p=1; 引用非只读类型的函数:int&f(){};f0=3; 前置+和一运算,赋值运算:((x=2)=3;(+x)=5; ■右值表达式:只能出现在等号右边的表达式。 注意:左值表达式是右值表达式,反之不成 立。 某些变量或参数传递只能用左值表达式。如非 只读类型的引用变量或参数
2.1 声明及定义 左值表达式:可以出现在等号左边的表达式 。 非只读类型的变量:int x; x=2; 引用非只读类型的变量:int &y=x; y=3; 指向非只读单元的内容访问:int *p=&x; *p=1; 引用非只读类型的函数: int &f( ){ }; f()=3; 前置++和 —运算,赋值运算: (x=2)=3; (++x)=5; 右值表达式:只能出现在等号右边的表达式。 注意:左值表达式是右值表达式,反之不成 立。 某些变量或参数传递只能用左值表达式。如非 只读类型的引用变量或参数
2.1声明及定义 【例2.1】C++的声明、定义及初试化。 #include extern int h=0;/C变量定义 extern int i; /1C变量声明 ■ int i; //C变量定义,缺省初始化i=0 int j=i+4; //C++变量定义,初始化ji+4 static int p=jt5;/C++变量定义,初始化为p=jt5
2.1 声明及定义 【例2.1 】C++的声明、定义及初试化。 #include extern int h=0; //C变量定义 extern int i; //C变量声明 int i; //C变量定义,缺省初始化i=0 int j=i+4; //C++变量定义,初始化j=i+4 static int p=j+5;//C++变量定义,初始化为p=j+5
2.1声明及定义 void main(void){ static int n=j+5; /C+定义,初始化为n=j+5 int i=20; /C定义,初始化为i=20 int k; /C声明,k未初始化值不定 for(int j=i+2;j<9;j++) /1C+定义,初始化为j=i+2 int m=5; /C定义,初始化为m=5 k+=m; /警告,k未初始化就被引用 }; int q=23; /C+在语句中间定义变量 scanf ("%d",&j); /输入main外定义的变量j struct{intk,m;}b={jt3,5};/C+定义,任意表达式初始化 inta[4幻={scanf("%d”",&k),1};/C+定义,任意表达式初始化 }
2.1 声明及定义 void main(void){ static int n=j+5; //C++定义,初始化为n=j+5 int i=20; //C定义,初始化为i=20 int k; //C声明,k未初始化值不定 for(int j=i+2;j<9;j++) //C++定义,初始化为j=i+2 { int m=5; //C定义,初始化为m=5 k+=m; //警告,k未初始化就被引用 }; int q=23; //C++在语句中间定义变量 scanf("%d",&j); //输入main外定义的变量j struct {int k,m;}b={j+3,5};//C++定义,任意表达式初始化 int a[4]={scanf("%d",&k),1};//C++定义,任意表达式初始化 }
,1声明及定义 C允许初试化局部静态数组。C+的局部自动 数组通常在栈段分配空间,若初始化则还会在 数据段分配空间。 程序X.CPP: void main(void)/空间在栈段 int array[10]; 程序Y.CPP: ■ void main(void)/空间在数据段 static int array[10]=(1,2}; 程序Z.CPP: void main(void)/空间在栈段和数据段 int array[10]={1};
2.1 声明及定义 C允许初试化局部静态数组。C++的局部自动 数组通常在栈段分配空间,若初始化则还会在 数据段分配空间。 程序X.CPP: void main(void) //空间在栈段 { int array[10]; } 程序Y.CPP: void main(void) //空间在数据段 { static int array[10]={1, 2};} 程序Z.CPP: void main(void) //空间在栈段和数据段 { int array[10]={1}; }
.1声明及定义 简单类型全局变量:若初始化表达式是任意表 达式,则初始值由编译生成的开工函数在运行 时计算得到。 ▣复杂类型全局变量:即全局对象,其初始化由 开工函数调用其相应的构造函数完成。 ·注意:开工函数先于main执行,收工函数后于 main执行。收工函数负责自动执行全局对象的 析构函数。因此,程序被看作一个对象,有构 造(生),活动(main),析构(死)
2.1 声明及定义 简单类型全局变量:若初始化表达式是任意表 达式,则初始值由编译生成的开工函数在运行 时计算得到。 复杂类型全局变量:即全局对象,其初始化由 开工函数调用其相应的构造函数完成。 注意:开工函数先于main执行,收工函数后于 main执行。收工函数负责自动执行全局对象的 析构函数。因此,程序被看作一个对象,有构 造(生),活动(main),析构(死)
.1声明及定义 #include long sum(void){ int m,n,S=0; cout>n,m=1;m<=n;m++) s+=m; cout<<\nSum="<<s; return s; long x=sum();/开工函数初始化x调用sum ■ void main(void){}//空函数有运行结果
2.1 声明及定义 #include long sum(void){ int m, n, s=0; cout>n,m=1; m<=n; m++) s+=m; cout<<"\nSum="<<s; return s; } long x=sum( );//开工函数初始化x调用sum void main(void){ } //空函数有运行结果