从零开始学习C++第二篇:认识C++的对象

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++标准,比如VSmain函数为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 码值为零的空字符(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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值