第二章:C++的概述
2.1 C++的起源和特点
2.1.1 起源
C++是从C语言演变而来的。
2.1.2 特点
C++的主要特点:
(1):全面兼容C,并对C的功能作了不少扩充。
(2):增加了面向对象的机制。
最有意义的方面是支持面向对象的特征。
2.2 C++源程序的构成
2.2.1
例2.1 计算两个整数之和
#include <iostream>
using namespace std;
int main()
{
int x, y, sum;
cout << "Please input two integers:" << '\n';
cin >> x;
cin >> y;
sum = x + y;
cout << "x+y=" << sum << endl;
return 0;
}
2.2.2 C++程序的结构特性
面向对象程序分为:
1:类的声明部分
2:类的使用部分
(1):主函数
(2):子函数
2.3 C++在非面向对象方面的扩充
2.3.1 注释行
和C语言一样,不做过多说明。
2.3.2 C++的输入和输出
1、C++依旧可以使用printf和scanf。
2、增加了cin和cout两种标准输入输出流。
#include <iostream>
using namespace std;
int main()
{
char name[20];
cout<<"Hello,you name:"<<endl;
cin>>name;
cout<<"My name is "<<name;
return 0;
}
输出 cout << 数据
输入 cin >> 变量 记得使用空格
两种换行 \n 和 endl
3.dec把转换基数设置为十进制,hex把转换基数设置为十六进制,oct把转换基数设置为八进制,默认为十进制。
例2.4 操纵符dec、hex、oct的使用。
#include <iostream>
using namespace std;
int main()
{
int x=25;
cout<<hex<<x<<' '<<dec<<x<<' '<<oct<<x<<'\n';
//hex是转换成十六进制,dec转换成十进制,oct是转换成八进制
return 0;
}
2.3.3 灵活的局部变量的使用
C++允许在代码块中的任何地方说明局部变量,“先定义,后使用”。
1:在大函数中,在最靠近使用变量的位置说明变量较为合理。
2:在较短的函数中,把局部变量集中在函数开始出说明较好。
2.3.4结构名,联合名,枚举名可直接作为类型名
在C++中,结构名,联合名,枚举名可直接作为类型名。
例如:
enum Bool{FALSE,TURE};
struct String
{ char *ptr;
int length;
}
可直接说明为:
Bool done;
String str;
2.3.5 const 修饰符
例2.6 用const取代#define
#include <iostream>
using namespace std;
int main()
{
int a=1;
int const T1=a+a;
int const T2=T1-T1;
cout<<"T2 is "<<T2<<endl;
return 0;
}
类别 | 区别 | 表示 |
---|---|---|
指向常量的指针 | 可以改变指针地址,不能改变数据 | const char* name =“chen” |
常指针 | 可以改变数据,不能改变地址 | char* const name =“chen” |
指向常量的常指针 | 地址和数据都不可以改变 | const char * const name =“chen” |
2.3.6 函数原型
(1):函数原型的参数表中可不包括参数的名字,而只包含它们的类型。
(2):函数定义由函数说明和函数体两个部分组成。
(3): 标准C++要求main函数必须声明为int类型。
2.3.8 带有默认参数的函数
所有指定默认值的参数都必须出现在不指定默认值的参数的右边。
如int fun(int i,int j,int k=5);
2.3.9 函数的重载
只要函数参数的类型不同,或者参数的个数不同,或者二者都满足,两个或者两个以上的函数可以使用相同的函数名。
例2.11 参数类型不同的函数重载
#include <iostream>
#include <iomanip> //和setprecision(i)搭配使用i为数字
using namespace std;
int square(int i);
long square(long l);
double square(double d);
int main()+
{
int i=12;
long l=1234;
double d=5.67;
cout<<i<<'*'<<i<<'='<<square(i)<<endl;
cout<<l<<'*'<<l<<'='<<square(l)<<endl;
cout<<setprecision(4)<<d<<'*'<<d<<'='<<square(d)<<endl;
return 0;
}
int square(int i)
{
return i*i;
}
long square(long l)
{
return l*l;
}
double square(double d)
{
return d*d;
}
例2.12 参数个数不同的函数重载
#include <iostream>
using namespace std;
int mul(int x,int y)
{
return x*y;
}
int mul(int x,int y,int z)
{
return x*y*z;
}
int main()
{
int a=3,b=4,c=5;
cout<<a<<'*'<<b<<'='<<mul(a,b)<<endl;
cout<<a<<'*'<<b<<'*'<<c<<'='<<mul(a,b,c)<<endl;
return 0;
}
注意:若两函数的参数个数和类型都相同,而只有返回值类型不同,则不孕讯重载。
2.3.10 作用域运算符“::”
例2.13 全局变量和局部变量同名
#include <iostream>
using namespace std;
int avar=10; //全局变量avar
int main()
{
int avar; //局部变量avar
avar=25;
cout<<"avar is "<<avar<<endl; //输出局部变量avar
return 0;
}
例2.14 作用域运算符的使用
#include <iostream>
using namespace std;
int avar=10;
int main()
{
int avar;
avar=25;
cout<<"local avar is "<<avar<<endl;
cout<<"global avar is "<<::avar<<endl;
return 0;
}
2.3.13 运算符new 和delete
内存分配的基本形式:
指针变量名=new类型;
delete 指针变量名;
(1):使用malloc 函数时必须使用sizeof函数来计算所需要的字节数,而new可以自动计算分配。
(2):new能自动返回正确的指针类型。
(3):使用new可以为数组动态分配内存空间(需要在类型后面缀上数组大小)
int *pi=new int[10];
int *pi=new int[2][3][4];
一维可以是任何合法的正整数表达式
int i=3;
int *pi=new int[i][3][4];
(4):new可在为简单变量分配内存的同时进行初始化
指针变量名 =new 类型(初值)
//使用new 和delete进行内存的分配和释放
/* #include <iostream>
using namespace std;
int main()
{
int *ptr; //定义一个整型指针变量ptr
ptr=new int; //动态分配一个整型存储空间,并将首地址赋给ptr
*ptr=10;
cout<<*ptr;
delete ptr; //释放指针ptr指向的存储空间
return 0;
} */
/* #include <iostream>
using namespace std;
int main()
{
int *p=new int(99);
cout<<*p;
delete p;
return 0;
} */
/* 对动态分配是否成功进行检查 */
#include <iostream>
using namespace std;
int main()
{
int *p=new int;
if (!p)
{
cout<<"allocation failure\n";
return 1;
}
*p=20;
cout<<*p;
delete p;
return 0;
}
2.3.14 引用
1,引用的概念
相当于对变量起一个新的名字。
类型 & 引用名=已定义的变量名
变量和引用的关系
#include <iostream>
using namespace std;
int main()
{
int i;
int &j=i; //声明j是一个整型变量i的引用
i=30;
cout<<"i="<<i<<"j="<<j<<endl; //输出i和引用j的值
j=80;
cout<<"变量i的地址:"<<&i<<endl; //输出变量i的地址
cout<<"变量j的地址:"<<&j<<endl; //输出变量j的地址
return 0;
}
比较引用和指针的使用方法
#include <iostream>
using namespace std;
int main()
{
int i=15; //定义整型变量i,赋初值15
int *iptr=&i; //定义指针变量iptr,将变量i的地址赋给iptr
int &rptr=i; //声明变量i的引用rptr,rptr是变量i的别名
cout<<"i is "<<i<<endl; //输出i的值
cout<<"*iptr is "<<*iptr<<endl; //输出指针iptr的值
cout<<"rptr is "<<rptr<<endl; //输出rptr的值
i=29;
cout<<"After changing i to 29:"<<endl;
cout<<"*i is "<<i<<endl; //输出i的值
cout<<"*iptr is "<<*iptr<<endl; //输出指针iptr的值
cout<<"rptr is "<<rptr<<endl; //输出rptr的值
return 0;
}
指针变量作为函数参数
#include <iostream>
using namespace std;
void swap(int *m,int *n)
{
int temp;
temp=*m;
*m=*n;
*n=temp;
}
int main()
{
int a=5,b=10;
cout<<"a="<<a<<" b="<<b<<endl;
swap(a,b);
cout<<"a="<<a<<" b="<<b<<endl;
return 0;
}
引用作为函数参数的例子
#include <iostream>
using namespace std;
void swap(int &m,int &n)
{
int temp;
temp=m;
m=n;
n=temp;
}
int main()
{
int a=5,b=10;
cout<<"a="<<a<<" b="<<b<<endl;
swap(a,b);
cout<<"a="<<a<<" b="<<b<<endl;
return 0;
}
使用引用返回函数值
#include <iostream>
using namespace std;
int a[]={1,3,5,7,9};
int &index(int);
int main()
{
index(2)=25;
cout<<index(2);
return 0;
}
int &index(int i)
{
return a[i];
}
引用实例
#include <iostream>
using namespace std;
int &max(int &num1,int &num2);
int &min(int &num1,int &num2);
int main()
{
int num1,num2;
cout<<"请输入第一个数:";
cin>>num1;
cout<<"请输入第二个数:";
cin>>num2;
max(num1,num2)=0;
cout<<"\n找出最大数,然后把最大数赋值为0后,两个数分别为:"<<endl;
cout<<num1<<"和"<<num2<<endl;
cout<<"请输入第一个数:";
cin>>num1;
cout<<"请输入第二个数:";
cin>>num2;
min(num1,num2)=0;
cout<<"\n找出最小数,然后把最小数赋值为0后,两个数分别为:"<<endl;
cout<<num1<<"和"<<num2<<endl;
return 0;
}
int &max(int &num1,int &num2)
{
return (num1>num2)?num1:num2;
}
int &min(int &num1,int &num2)
{
return (num1<num2)?num1:num2;
}