C++是面向对象的语言 三个特征:封装、继承、多态。
一般称显示世界中客观存在的事物为对象。
C++语言兼容C语言,可将原来C语言中的变量看做对象
使用结构对象的实例程序:
/*将结构对象的两个域值相加,乘以2,再加50*/
#include <iostream> //包含头文件
using namespace std; //使用命名空间
int result(int,int);//result函数的原型声明 定义result函数函数 传入两个int变量 返回值为int类型
const int k=2;
struct Point{
int x,y;
};//定义结构体 成员变量x,y
int main() {
//int z(0),b(50);
int z=0,b=50;//初始化并赋值
Point a;//定义结构对象a
cout<<"输入两个整数(以空格区分):";//输出提示信息
cin>>a.x>>a.y;//接受并赋值
z=(a.x+a.y)*k;//相加,乘以2
z=result(z,b);//用自定义的result函数 加50
cout<<"计算结果如下:"<<endl;//输出信息并换行
cout<<"(("<<a.x<<"+"<<a.y<<")*"<<k<<")+"<<b<<"="<<z<<endl;
return 0;
}
int result(int a,int b){
return a+b;
}
输出结果:
输入两个整数(以空格区分):23 65
计算结果如下:
((23+65)*2)+50=226
一、混合型语言
C++中有且只有一个main()函数,而面向对象的语言没有主函数,C++保留了这个面向过程的主函数,所以是混合型语言
二、注释方式
单行 //
单段 /* */
三、输入和输出对象
cin用来处理标准输入,即键盘输入 cin>>a.x 表示获取数据赋值给a.x
cout用来处理标准输出,即屏幕输出 cout<<"输入两个整数,以空格键区分" cout<<endl; 和 cout<<"/n";都表示空格
C++标准输入输入库为iostream 使用方法为 #include<iostream>
四、使用命名空间
#include <iostream>
using namespace std;
使用命名空间可以提高程序的性能和可靠性,
五、对象的定义以及初始化
int a(0); 与 int a=0; 意义相同
六、函数原型与返回值
函数都需要有类型说明。
比如自定义一个result函数 int result() 指出result()函数为整数类型,返回值由result后面的表达式决定;result 0表示函数结束;如果函数不需要返回值,可用void修饰符修饰,这时函数内部不能使用return语句。
C++里面的函数分为库函数(标准函数)和自定义函数两类。
使用自定义函数要先声明,后使用。
七、const修饰符和预处理程序
用关键字const修饰的标识符,称为符号常量。
如const int a(5);
const int d; 错误
extern const int d; 可以
文件包含语句中 <>为系统包含的文件 “”为自定义文件
C++面向过程编程的特点
一、使用函数重载
c++允许为同一名称函数定义几个版本,使一个函数具有多种功能。
#include <iostream>
using namespace std;
int max(int,int);
int max(int,int,int);
int main() {
cout <<max(26,65)<<"\n"<<max(36,65,95)<< endl;
return 0;
}
int max(int m1,int m2){
return(m1>m2)?m1:m2;//三目运算符 <表达式1>?<表达式2>:<表达式3>; 1为真,执行2,返回2的结果;1为假,执行3,返回3的结果
}
int max(int m1,int m2,int m3){
int t=max(m1,m2);
//return (t>m3)?t:m3;
return max(t,m3);
}
输出结果:
65
95
C语言的 标准允许main函数为void类型
而按照C++的标准 main 必须是int类型
但很多IDE或编译器不一定准守C++标准,比如VS
main函数为void类型
而按照C++的标准 main 必须是int类型
但很多IDE或编译器不一定准守C++标准,比如VS
二、新的基本数据类型和注意事项
C++比C语言多了bool(布尔)型;
地址运算符&用来取对象存储的首地址。
#include <iostream>
using namespace std;
int main() {
int a(25);
cout <<&a<< endl; // prints !!!Hello World!!!
return 0;
}
输出结果:0x61ff1c(十六进制)
C++与C语言一样,也使用转义序列。例如“\0”表示ASCI I 码值为零的空字符(NULL),“\101”表示A。
三、动态分配内存
指针:指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
type *var-name;
& 符号的意思是取地址,也就是返回一个对象在内存中的地址。
* 符号的意思是取得一个指针所指向的对象。 也就是如果一个指针保存着一个内存地址,那么它就返回在那个地址的对象。
#include <iostream>
using namespace std;
int main() {
int a(25);
int *p;//定义一个名为p的指针 无初始化
p = &a;
cout <<&a<<endl;
cout <<p<<endl;
cout<<*(&a)<<endl;
cout<<*p<<endl;
return 0;
}
输出结果:
0x61ff18
0x61ff18
25
25
在使用指针时,如果不使用对象地址初始化指针,可以自己给它分配地址。对于只存储一个基本类型数据的指针,申请的方式如下:new 类型名[size] //申请可以存储size个该数据类型的对象。
#include <iostream>
using namespace std;
int main() {
double *p;
p=new double[3];//分配三个double型数据的存储空间
for(int i=0;i<3;i++){
cin>>*(p+i);//将输入数据存入指定地址
}
for(int i=0;i<3;i++){
cout<<*(p+i)<<" ";
}
delete p;
输出结果:
输入:1.1 1.2 1.3
1.1 1.2 1.3
四、引用
C++支持引用,就是给现有对象起个别名。
数据类型 & 别名=对象名;
#include <iostream>
using namespace std;
int main() {
int x=56;
int &a=x;//a是x的引用,a和x地址相同
int &b=a;
a=20;
cout <<"a="<<a<<",a的地址为"<<&a<<" "<<"x="<<x<<",x的地址为"<<&x<<endl;
b=15;
cout <<"a="<<a<<",a的地址为"<<&a<<" "<<"x="<<x<<",x的地址为"<<&x<<endl;
return 0;
}
输出结果:
a=20,a的地址为0x61ff04 x=20,x的地址为0x61ff04
a=15,a的地址为0x61ff04 x=15,x的地址为0x61ff04
//对数组的引用
#include <iostream>
using namespace std;
typedef double array[10];//定义了一个int型的数组类型array标识符,用它来定义数组的引用
int main() {
array a={13,15,52,95,16,17,85,98,36,57};
array &b=a;//定义一个a数组的引用b
a[2]=100;
for(int i=0;i<10;i++){
cout<<b[i]<<" ";
}
}
输出结果:
13 15 100 95 16 17 85 98 36 57
五、对指针使用const限定符
可以用const限定符强制改变访问权限
1.左值和右值
左值是指某个对象的表达式。左值表达式在赋值语句中既可以作为左操作数,也可以作为右操作数。左值必须能被运算和修改。
2.指向常量的指针
const int *p;//告诉编译器,“ *p ”是常量,不能将“ *p ”作为左值操作,限制了“ *p= ”的操作,所以成为指向常量的指针。
#include <iostream>
using namespace std;
int main() {
const int a=10;
const int *p=&a;//a不能作为主值
cout<<*p<<endl;
int x=45;
const int *p1=&x;//可通过改变x的值间接改变*p1的值
cout<<*p1<<endl;
return 0;
}
3.常量指针
把const限定符放在*号右边,使指针本身变为一个const指针。
int x=5;
int * const p=&x;
因为指针本身就是常量,编译器要求给他一个初始化值,这个值在指针的整个生存期中都不会改变。
4.指向常量的指针
int x=2;
const int * const p=&x;
告诉编译器,*p和p都是常量,都不能作为左值。
六、泛型算法应用于普通数组
泛型算法,就是提供的操作与数据类型无关。
假设一维数组a和b的长度均为Len,数据类型为Type。
1,数组内容反转
reverse(a,a+Len)
2,复制数据的内容
copy(a,a+Len,b);
reverse_copy(a,a+Len,b);
3,数组升幂排序
sort(a,a+Len);
4,数组降幂排序
sort(a,a+Len,greater<Type>());
5,查找数组内容
find (a,a+Len,value);
返回值是位置指针
6,输出数组的内容
copy(a,a+Len,ostream_iterator<Type>(cout,"字符串"));
逆向输出:
reverse _copy(a,a+Len,ostream_iterator<Type>(cout,"字符串"));
#include <iostream>
#include <algorithm>
#include <functional>
#include <iterator>
using namespace std;
int main() {
double a[]={1.1,4.4,3.3,2.2};
sort(a,a+4);//升幂处理
copy(a,a+4,ostream_iterator<double>(cout," "));//输出数组a
cout<<endl;
sort(a,a+4,greater<double>());
copy(a,a+4,ostream_iterator<double>(cout," "));//输出数组a
cout<<endl;
double b[4];
copy(a,a+4,b);//将a拷贝到b
copy(a,a+4,ostream_iterator<double>(cout," "));//输出数组a
cout<<endl;
reverse(a,a+4);//数组a元素逆向
copy(a+0,a+4,ostream_iterator<double>(cout," "));//输出数组a
cout<<endl;
reverse_copy(b,b+4,ostream_iterator<double>(cout," "));//逆向输出数组b
cout<<endl;
double *x=find(a,a+4,4.4);
if(x==a+4){
cout<<"没有值为4.4的元素";
}else{
cout<<"有值为"<<*x<<"的元素";
}
cout<<endl;
return 0;
}
输出结果:
1.1 2.2 3.3 4.4
4.4 3.3 2.2 1.1
4.4 3.3 2.2 1.1
1.1 2.2 3.3 4.4
1.1 2.2 3.3 4.4
有值为4.4的元素
编译程序时出现如下错误error: ‘ostream_iterator’ was not declared in this scope
解决方法如下:在头文件中加入iterator这个头文件
#include<iterator>
错误解决
七、数据的简单输入输出格式
C++提供了两种格式控制方式:一种是使用iso_base类提供的接口;另一种是使用一种称为操控符的特殊参数,它的特点是可直接包含在输出和输入表达式中。
名称 | 含义 | 作用 |
dec | 设置转换基数为十进制 | 输入\输出 |
oct | 设置转换基数为八进制 | 输入\输出 |
hex | 设置转换基数为十六进制 | 输入\输出 |
endl | 输出一个换行符并刷新流 | 输出 |
resetiosflags(long flag) | 清除flag制定的标志位 | 输出 |
setiosflags(long flag) | 设置flag指定的标志位 | 输出 |
setfill(char ch) | 设置ch为填充字符 | 输出 |
setprecision(int n) | 设置浮点数输出精度n | 输出 |
setw(int width) | 设置输出数据字段宽度width | 输出 |
#include <iostream>
#include<iomanip>
using namespace std;
int main() {
const double PI=3.141592654;
cout<<PI<<endl
<<setprecision(0)<<PI<<endl
<<setprecision(1)<<PI<<endl
<<setprecision(2)<<PI<<endl
<<setprecision(3)<<PI<<endl
<<setprecision(7)<<PI<<endl;
int b=100;
cout<<"Dec:"<<dec<<b<<endl
<<"Hex:"<<hex<<b<<endl
<<"Oct:"<<oct<<b<<endl;//将100变为八进制数,并输出 程序执行cout<<oct命令后,将保持八进制格式输出。
cout<<b<<endl
<<100<<endl
<<"Input b=...";//程序执行cout<<oct命令后,将保持八进制格式输出。
cin>>b;
cout<<dec<<setiosflags(ios_base::showpos)<<b<<endl;//恢复为十进制数出,还将输出在正的数字前显示+号
cout<<resetiosflags(ios_base::showpos);//清除+号
cout<<b;
return 0;
}
运行结果
3.14159
3
3
3.1
3.14
3.141593
Dec:100
Hex:64
Oct:144
144
144
Input b=...100
+100
100