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成员在派生类中均不可访问。