C++ 标准输入输出流、组合与继承

C++ 标准输入输出流

std::cin

基本类型自动匹配:
int a;
char arr[10]; 
cin >>a
      >>arr;

cout   <<“a: ”<<a
	<<“arr: ”<<arr;

Std::cout

基本类型自动匹配:
int a;
char arr[] = “hello”;
sdt::cout<<a<<arr<<std::endl;
输出格式控制:
a.使用控制符控制输出格式
cout<<hex<<10<<endl;
b.用流对象的成员函数控制输出格式
cout.unsetf(ios::dec); //终止10进制
cout.setf(ios::hex);
cout<<10<<endl;

在输入流与输出流中使用控制符

上面介绍的是使用cout和cin时的默认格式。但有时人们在输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。C++提供了在输入输出流中使用的控制符(有的书中称为操纵符),见表3.1。

表 3.1 输入输出流的控制符

控制符

作 用

dec

设置数值的基数为10

hex

设置数值的基数为16

oct

设置数值的基数为8

setfill(c)

设置填充字符c,c可以是字符常量或字符变量

setprecision(n)

设置浮点数的精度为n位。在以一般十进制小数形式输出时,n代表有效数字。在以fixed(固定小数位数)形式和 scientific(指数)形式输出时,n为小数位数

setw(n)

设置字段宽度为n位

setiosflags( ios::fixed)

设置浮点数以固定的小数位数显示

setiosftags( ios::scientific)

设置浮点数以科学记数法(即指数形式)显示

setiosflags( ios::left)

输出数据左对齐

setiosflags( ios::right)

输出数据右对齐

setiosflags( ios::skipws)

忽略前导的空格

setiosflags( ios::uppercase)

数据以十六进制形式输出时字母以大写表示

setiosflags( ios::lowercase)

数据以十六进制形式输出时宇母以小写表示

setiosflags(ios::showpos)

输出正数时给出“+”号


需要注意的是: 如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。

用流对象的成员函数控制输出格式

除了可以用控制符来控制输出格式外,还可以通过调用流对象cout中用于控制输出格式的成员函数来控制输出格式。用于控制输出格式的常用的成员函数见表13.4。

表13.4 用于控输出格式的流成员函数

流成员函数

与之作用相同的控制符

作用

precision(n)

setprecision(n)

设置实数的精度为n位

width(n)

setw(n)

设置字段宽度为n位

fill(c)

setfill(c)

设置填充宇符c

setf()

setiosflags()

设置输出格式状态,括号中应给出格式状态,内容与控制符setiosflags括号中的内容相同,如表13.5所示

unsetf()

resetioflags()

终止已设置的输出格式状态,在括号中应指定内容


流成员函数setf和控制符setiosflags括号中的参数表示格式状态,它是通过格式标志来指定的。格式标志在类ios中被定义为枚举值。因此在引用这些格式标志时要在前面加上类名ios和域运算符“::”。格式标志见表13.5。

表13.5 设置格式状态的格式标志

格式标志

作用

ios::left

输出数据在本域宽范围内向左对齐

ios::right

输出数据在本域宽范围内向右对齐

ios::internal

数值的符号位在域宽内左对齐,数值右对齐,中间由填充字符填充

ios::dec

设置整数的基数为10

ios::oct

设置整数的基数为8

ios::hex

设置整数的基数为16

ios::showbase

强制输出整数的基数(八进制数以0打头,十六进制数以0x打头)

ios::showpoint

强制输出浮点数的小点和尾数0

ios::uppercase

在以科学记数法格式E和以十六进制输出字母时以大写表示

ios::showpos

对正数显示“+”号

ios::scientific

浮点数以科学记数法格式输出

ios::fixed

浮点数以定点格式(小数形式)输出

ios::unitbuf

每次输出之后刷新所有的流

ios::stdio

每次输出之后清除stdout, stderr

#include <stdio.h>
#include <iostream>

using namespace std;

int main()
{
//	printf("input: ");fflush(stdout);
	cout<<"input: ";

	char buf[100];
//	gets(buf);
	cin >> buf;

//	printf("%s\n", buf);
	cout << buf << endl;


	std::cout<<10<<std::endl;
	cout<<10<<endl;
	cout<< hex <<10<<endl;
}

组合与继承

面向对象

C++是一种面向对象的编程语言,它支持面向对象的编程范式。面向对象编程是一种将现实世界的问题抽象为对象的编程方法。

在C++中,对象是由数据和行为组成的。数据通常通过成员变量表示,行为通常通过成员函数来实现。通过封装、继承和多态这三个特性,C++提供了一种组织和管理代码的方式,使得程序更加模块化、可扩展和易于维护。

封装是将数据和相关的操作封装在一起形成类的过程。通过封装,可以隐藏实现细节,只暴露必要的接口给外部使用,提高代码的安全性和可维护性。

继承是一种通过扩展现有类的方式来创建新类的机制。通过继承,新类可以继承父类的属性和方法,并可以添加自己的特性。继承可以实现代码的重用和扩展。

多态是一种可以根据对象的实际类型来选择不同的方法实现的机制。通过多态,可以以统一的方式处理不同类型的对象,提高代码的灵活性和可扩展性。

除了封装、继承和多态,C++还提供了其他一些面向对象的特性,如构造函数和析构函数、运算符重载、模板等,用于进一步增强面向对象编程的能力。

总结来说,C++是一种支持面向对象编程的语言,通过封装、继承和多态等特性,可以更好地组织和管理代码,提高代码的可重用性、可扩展性和可维护性。

组合

点
class  Point{
public:
	Point(int x, int y){  
		this->x = x;
		this->y = y;
	}
	int x;
	int y;
}
线
class  Line{
public:
	Line(Point &a, Point &b)
		:start(a),end(b)
	{  }
	Point  start;
	Point  end;
}

 

#include "arr.h"
#include <iostream>

using namespace std;

class ARRX :public ARR
{
public:
	int ever(void)
	{
		int i = 0;
		int sum = 0;
		for (;i < tail; i++)
			sum += data[i];
		return sum / tail;
	}
};

class Stuma
{
public:
	Stuma()
	{

	}
	~Stuma() {}

	void savescore(int score)
	{
		scorearr.addtail(score);
	}

	int everscore(void)
	{
		return scorearr.ever();
	}

	void showscore(void)
	{
		scorearr.show();
	}

private:
	//ARR scorearr;//组合别的类开发更高级的功能  组合 依赖基本类
	ARRX scorearr;
};

int main()
{
	Stuma mmm;

	mmm.savescore(23);
	mmm.savescore(44);
	mmm.savescore(55);
	mmm.savescore(23);

	mmm.showscore();
	cout << mmm.everscore() << endl;
}

继承

有粗细的线
class  xLine: public Line{
public:
	xLine(Point &start, Point  &end, int width=10)
		:Line(start, end){
		  this->width = width;
	}
	int width;
}
#include <iostream>

using namespace std;

class A{
public:
	A(){ }
	~A(){ }
	void showx()
	{
		cout<<"xxxxxxxxxxxxxxx"<<endl;
	}
};

class AX:public A{//继承、派生  AX是A的派生类 A是基类
public:
	void showy()
	{
		cout<<"yyyyyyyyyyyyyy"<<endl;
	}
};

int main()
{
	A a;
	a.showx();
//	a.showy();

	AX b;
	b.showx();
	b.showy();
}
#include "arr.h"
#include <iostream>

using namespace std;

class ARRX :public ARR//采用public继承方式
{
public:
	int ever(void)
	{
		int i = 0;
		int sum = 0;
		for (;i < tail; i++)
			sum += data[i];
		return sum / tail;
	}
};

class Stuma
{
public:
	Stuma()
	{

	}
	~Stuma() {}

	void savescore(int score)
	{
		scorearr.addtail(score);
	}

	int everscore(void)
	{
		return scorearr.ever();
	}

	void showscore(void)
	{
		scorearr.show();
	}

private:
	//ARR scorearr;//组合别的类开发更高级的功能  组合 依赖基本类
	ARRX scorearr;//派生、继承新的数组类
};

int main()
{
	Stuma mmm;

	mmm.savescore(23);
	mmm.savescore(44);
	mmm.savescore(55);
	mmm.savescore(23);

	mmm.showscore();
	cout << mmm.everscore() << endl;
}

1) public继承方式 

  • 基类中所有public成员在派生类中为public属性;
  • 基类中所有protected成员在派生类中为protected属性;
  • 基类中所有private成员在派生类中不可访问。


2) protected继承方式 

  • 基类中的所有public成员在派生类中为protected属性;
  • 基类中的所有protected成员在派生类中为protected属性;
  • 基类中的所有private成员在派生类中仍然不可访问。


3) private继承方式 

  • 基类中的所有public成员在派生类中均为private属性;
  • 基类中的所有protected成员在派生类中均为private属性;
  • 基类中的所有private成员在派生类中均不可访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值