C++语言基础 (1)
2009-7-30
主要内容
C++程序的基本组成
C++的数据类型和表达式
指针和引用
动态存储分配
C++程序的基本组成
C++源代码文件的组成头文件 (.h):类、对象、变量及类型的定义和函数的声明源程序文件 (.cpp):实现具体功能的源代码文件
C++程序的基本构成
#include <iostream.h>
void main()
{
cout<<“please input your name:”;
char name[20];
cin>>name;
}
cout<<“Hello,”<<name<<“!”<<endl;
//example 21.cpp
——编译预处理、程序主体、注释程序主体注释编译预处理说明:
每个 C++程序均有且只有一个 main()函数
C++程序中数据的输入输出采用流类对象 cout和 cin
1,cout基本用法:
cout<<E1 <<E2<<···<< Em;
2,cin基本用法:
cin>>V1 >> V2 >> ···>>Vm;
注释
1,单行注释 //
2,多行注释 /* */,不能嵌套使用
3,编程时应养成注释的习惯,增强程序可读性数据类型空类型 void
整 型 int
字符型实 型逻辑型 bool
单字符型 char
宽字符型 w_char
单精度型 float
双精度型 double
指 针 type*
结 构 struct
枚 举 enum
类 class
非基本数据类型数据类型基本数据类型联 合 union
数 组 type[ ]
基本数据类型
1.常量 ——运算过程中值不能被改变的量定义格式,const <数据类型 > <常量名 > = <表达式 >;
如,const float pi = 3.1415926; //或者定义为 double型
const char name =?Joe?;
const int x = 10;
const bool married = false;
说明,1)常量在定义时必须初始化;
const int x = 100;
x = 80;
define pi 3.14159;2)C++兼容 C的宏常量。
3) 常量是不可寻址的。
2.变量 ——运算过程中值可以被改变的量定义格式,<类型 > <变量名表 >;
int i,j,k; //各变量用逗号分开
double x,y,z = 7.15;
指针和引用
1.指针 ——存放其他数据 内存地址 的变量。
定义格式,<类型 >* <指针变量名 >;
如,int value,* iptr ; //iptr即为指针
iptr = &value; //&为取地址运算符例 1:
#include <iostream.h>
void main()
{
int *iptr,x = 73 ;
cout<<“iptr,my content is,<<iptr<<endl ;
iptr = &x ;
cout<<“iptr,now,my content is,<<iptr<<endl ;
cout<<“*iptr,now,my content is,<<*iptr<<endl ;
}
请思考该题会有怎样的结果。
cout<<“&x is,<<&x<<endl ;
分析:
step1,int *iptr,x = 73 ; 73 ^
iptrx
2000 3002
step2,iptr,my content is NULL
&x is 2000
2000step3,iptr = &x ; 73
iptrx
2000 3002
step4,iptr,now,my content is 2000
* iptr,now,my content is 73 73
iptrx
可见,指针 (iptr)是一个变量,其内容是地址,而 *iptr
则是指针所指单元的内容例 2-2:
#include <iostream.h>
void main()
{
int temp,value1 = 10,value2 = 20;
int *ptr ;
temp = *ptr;
*ptr = value2;
value2 = temp ;
}
ptr = &value1 ;
cout<<value1<<endl;
cout<<value2<<endl;
用图解法画出本题的执行过程
int temp,value1 = 10,value2 = 20;
int *ptr ;
ptr = &value1 ;
temp = *ptr;
10 20
value1 tempvalue2
Step3
ptr
10 20
^
value1 tempvalue2
Step1,2
ptr
10 20 10
value1 tempvalue2
Step4
ptr
20 20 10
value1 tempvalue2
Step5
ptr
*ptr = value2;
1020 10
value1 tempvalue2
Step6
ptr
value2 = temp ;
10 20
^
value1 tempvalue2
Step1,2
ptr
说明:
1) 指针和一般变量在本质上没有区别,只是内容不同
2) 指针实现的是间接操作
2.引用
格式,<类型 >& <引用名 > = <变量名 >;
指针与引用的区别
例 1 int a;
int& ra = a;
ra = 10;
cout<<ra<<a<<endl;
cout<<ra<<a<<endl;
a = 20;
例 2 int a,*pa;
int& ra = a;
pa = &a;
cout<<“&a:”<<&a<<endl<<,&ra:”<<&ra<<endl<<
“&pa:”<<&pa<<endl;
数组
定义格式:
<类型 > <数组名 > [<常量表达式 >] [<常量表达式 >] …;
初始化全部赋初值部分赋初值结构体
……
数据类型定义:
struct <结构体变量名 >
{ <类型 > <成员名 >;
<类型 > <成员名 >;
}
结构体变量定义:
struct <结构体 类型名 > <结构体变量名表 >;
结构体成员的表示:
<结构体变量名 >.<成员名 >
<结构体变量指针名 > -> <成员名 >
动态存储分配
静态对象 vs 动态对象
1,静态对象是有名字的,动态对象没有名字;
3,静态对象的分配和释放由编译器自动处理;
动态对象则必须手工分配和释放;
2,指针是访问动态对象的唯一方式;
动态存储空间的分配--用 new运算符
<指针变量名 > =
<指针变量名 > = new <类型 > (<初始值 >);
<指针变量名 > = new <类型 > [<元素个数 >];
new <类型 >;
当执行 new的时候,有两件事发生:
1,大小适当的一块存储空间被分配给特定的类型变量
2,存储空间的首地址作为 new表达式的返回值,分配失败则返回 0
说明,1,基本数据类型不用采取动态存储分配;
2,对于自身需要多少存储空间未知的数据类型,
如对象、数组、链表等应采用动态存储分配
动态存储空间的释放--采用 delete运算符
delete <指针变量名 >
delete[] <指针变量名 >
或
//释放用 new创建的数组注意:
1,必须用于 new操作分配的存储空间;
2,对于一个指针只能执行一次 delete操作;
3,delete[]运算忽略数组的维数或方括符内的数字;
a) int ival = 1024; c) int *ip2 = new int(1024);
b) int *pi = &ival; d) int *ip3 = new int[1024];
说明以下定义的区别,
void main()
{ int arraysize,*array;
cout<<“Can?t allocate memory,terminating.”;
cin>>arraysize;
if ((array = new int [arraysize]) == NULL);
{
cout<<“please input a number for array:”;
exit(1);}
for (int count = 0 ; count < arraysize; count++)
array[count] = count*2;{
cout<<array[count]<<,”;
}
cout<<endl;
delete[] array;
}
例:
2009-7-30
主要内容
C++程序的基本组成
C++的数据类型和表达式
指针和引用
动态存储分配
C++程序的基本组成
C++源代码文件的组成头文件 (.h):类、对象、变量及类型的定义和函数的声明源程序文件 (.cpp):实现具体功能的源代码文件
C++程序的基本构成
#include <iostream.h>
void main()
{
cout<<“please input your name:”;
char name[20];
cin>>name;
}
cout<<“Hello,”<<name<<“!”<<endl;
//example 21.cpp
——编译预处理、程序主体、注释程序主体注释编译预处理说明:
每个 C++程序均有且只有一个 main()函数
C++程序中数据的输入输出采用流类对象 cout和 cin
1,cout基本用法:
cout<<E1 <<E2<<···<< Em;
2,cin基本用法:
cin>>V1 >> V2 >> ···>>Vm;
注释
1,单行注释 //
2,多行注释 /* */,不能嵌套使用
3,编程时应养成注释的习惯,增强程序可读性数据类型空类型 void
整 型 int
字符型实 型逻辑型 bool
单字符型 char
宽字符型 w_char
单精度型 float
双精度型 double
指 针 type*
结 构 struct
枚 举 enum
类 class
非基本数据类型数据类型基本数据类型联 合 union
数 组 type[ ]
基本数据类型
1.常量 ——运算过程中值不能被改变的量定义格式,const <数据类型 > <常量名 > = <表达式 >;
如,const float pi = 3.1415926; //或者定义为 double型
const char name =?Joe?;
const int x = 10;
const bool married = false;
说明,1)常量在定义时必须初始化;
const int x = 100;
x = 80;
define pi 3.14159;2)C++兼容 C的宏常量。
3) 常量是不可寻址的。
2.变量 ——运算过程中值可以被改变的量定义格式,<类型 > <变量名表 >;
int i,j,k; //各变量用逗号分开
double x,y,z = 7.15;
指针和引用
1.指针 ——存放其他数据 内存地址 的变量。
定义格式,<类型 >* <指针变量名 >;
如,int value,* iptr ; //iptr即为指针
iptr = &value; //&为取地址运算符例 1:
#include <iostream.h>
void main()
{
int *iptr,x = 73 ;
cout<<“iptr,my content is,<<iptr<<endl ;
iptr = &x ;
cout<<“iptr,now,my content is,<<iptr<<endl ;
cout<<“*iptr,now,my content is,<<*iptr<<endl ;
}
请思考该题会有怎样的结果。
cout<<“&x is,<<&x<<endl ;
分析:
step1,int *iptr,x = 73 ; 73 ^
iptrx
2000 3002
step2,iptr,my content is NULL
&x is 2000
2000step3,iptr = &x ; 73
iptrx
2000 3002
step4,iptr,now,my content is 2000
* iptr,now,my content is 73 73
iptrx
可见,指针 (iptr)是一个变量,其内容是地址,而 *iptr
则是指针所指单元的内容例 2-2:
#include <iostream.h>
void main()
{
int temp,value1 = 10,value2 = 20;
int *ptr ;
temp = *ptr;
*ptr = value2;
value2 = temp ;
}
ptr = &value1 ;
cout<<value1<<endl;
cout<<value2<<endl;
用图解法画出本题的执行过程
int temp,value1 = 10,value2 = 20;
int *ptr ;
ptr = &value1 ;
temp = *ptr;
10 20
value1 tempvalue2
Step3
ptr
10 20
^
value1 tempvalue2
Step1,2
ptr
10 20 10
value1 tempvalue2
Step4
ptr
20 20 10
value1 tempvalue2
Step5
ptr
*ptr = value2;
1020 10
value1 tempvalue2
Step6
ptr
value2 = temp ;
10 20
^
value1 tempvalue2
Step1,2
ptr
说明:
1) 指针和一般变量在本质上没有区别,只是内容不同
2) 指针实现的是间接操作
2.引用
格式,<类型 >& <引用名 > = <变量名 >;
指针与引用的区别
例 1 int a;
int& ra = a;
ra = 10;
cout<<ra<<a<<endl;
cout<<ra<<a<<endl;
a = 20;
例 2 int a,*pa;
int& ra = a;
pa = &a;
cout<<“&a:”<<&a<<endl<<,&ra:”<<&ra<<endl<<
“&pa:”<<&pa<<endl;
数组
定义格式:
<类型 > <数组名 > [<常量表达式 >] [<常量表达式 >] …;
初始化全部赋初值部分赋初值结构体
……
数据类型定义:
struct <结构体变量名 >
{ <类型 > <成员名 >;
<类型 > <成员名 >;
}
结构体变量定义:
struct <结构体 类型名 > <结构体变量名表 >;
结构体成员的表示:
<结构体变量名 >.<成员名 >
<结构体变量指针名 > -> <成员名 >
动态存储分配
静态对象 vs 动态对象
1,静态对象是有名字的,动态对象没有名字;
3,静态对象的分配和释放由编译器自动处理;
动态对象则必须手工分配和释放;
2,指针是访问动态对象的唯一方式;
动态存储空间的分配--用 new运算符
<指针变量名 > =
<指针变量名 > = new <类型 > (<初始值 >);
<指针变量名 > = new <类型 > [<元素个数 >];
new <类型 >;
当执行 new的时候,有两件事发生:
1,大小适当的一块存储空间被分配给特定的类型变量
2,存储空间的首地址作为 new表达式的返回值,分配失败则返回 0
说明,1,基本数据类型不用采取动态存储分配;
2,对于自身需要多少存储空间未知的数据类型,
如对象、数组、链表等应采用动态存储分配
动态存储空间的释放--采用 delete运算符
delete <指针变量名 >
delete[] <指针变量名 >
或
//释放用 new创建的数组注意:
1,必须用于 new操作分配的存储空间;
2,对于一个指针只能执行一次 delete操作;
3,delete[]运算忽略数组的维数或方括符内的数字;
a) int ival = 1024; c) int *ip2 = new int(1024);
b) int *pi = &ival; d) int *ip3 = new int[1024];
说明以下定义的区别,
void main()
{ int arraysize,*array;
cout<<“Can?t allocate memory,terminating.”;
cin>>arraysize;
if ((array = new int [arraysize]) == NULL);
{
cout<<“please input a number for array:”;
exit(1);}
for (int count = 0 ; count < arraysize; count++)
array[count] = count*2;{
cout<<array[count]<<,”;
}
cout<<endl;
delete[] array;
}
例: