标准输入输出流
为什么不直接用printf和scanf?
不能输入/输出C++新增的内容
std
C++的一些标识符,都是定义在std这个名字空间下面
cout
是什么?
1.是一个ostream对象
output stream:输出流
使用
<<:输出流运算符
作用:将右边的数据,给左边
基本形式:
cout << 内容 << '\n';
cout << 10 << endl;
cout << 1.23 << a << b << "qwe";
分成多行:
特点
自动根据输出的内容,判断数据类型
特殊标志
C++ cout格式化输出(输出格式)完全攻略 - C语言中文网
*dec 以十进制形式输出整数 常用
hex 以十六进制形式输出整数
oct 以八进制形式输出整数
setw(w) 指定输出宽度为 w 个字符,或输人字符串时读入 w 个字符
setprecision(n) 设置输出浮点数的精度为 n。
showbase 输出表示数值的进制的前缀
输出地址
输出char *,cout会当成字符串进行输出
1. cout << &str << endl;
2. cout << (int *)str << endl;
cin
是什么?
1.是一个istream对象
input stream:输入流
>>: 输入流运算符
作用:将左边的数据,给右边
cin >> a;
特点
1.自动判断数据类型
2.类型不匹配,输入不成功
3.默认的间隔符:空格,TAB,回车。cin不能直接获取
特殊用法
scanf也可以获取空格
get(buf, 100, '\n')
不传结束符,默认是\n
在输入结束后,不会丢弃结束符
---------------------------------
getline和get用法是一样的
在输入结束后,丢弃结束符
cin.get获取空格
定义一个学生结构体,学生信息的数据类型
(struct)是一种用户自定义的数据类型
struct student
{
int id;
char name[20];
int socre;
};
封装函数,实现打印学生信息,根据学生成绩排序
#include <iostream>
using namespace std;
const int n = 3;
/*
void fun()
{
cout << "请输入整数:";
int a = 0;
cin >> a;
cout << "a:" << a << endl;
}
void fun1()
{
cout << "请输入一个字符串:";
char str[100] = "";
//cin.get(str,100,'\n');
cin.get(str,100);
cout << str;
}
*/
typedef struct student
{
int id;
char name[20];
int score;
}stu;
void show_stu(stu *arr)
{
for(int i=0;i<n;i++)
{
cout << "id:" << arr[i].id << "\t"
<< "name" << arr[i].name << "\t"
<< arr[i].score << endl;
}
}
void stu_sort(stu *arr)
{
int i, j;
stu temp;
for(i=0;i<n-1;i++)//外循环
{
for(j=0;j<n-i-1;j++)//内循环
{
if(arr[j].score>arr[j+1].score)
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
int main()
{
//fun();
//fun1();
stu arr[n];
for(int i=0;i<n;i++)
{
cout << "请输入id,name,socre :";
cin >> arr[i].id >> arr[i].name >> arr[i].score;
cout << endl;
}
show_stu(arr);
stu_sort(arr);
show_stu(arr);
return 0;
}
面向对象
特性
1.抽象
数据抽象:用变量描述事物的属性/状态
代码抽象:用函数描述事物的行为
2.封装
将属性和行为,封装到一起组和成一个整体。共同描述一个事物。
可以用权限进行修饰
3.分类
层层分类,使概念逐渐细化、具体化。
4.继承
子类(派生类)可以继承父类(基类)的属性和方法。
5.多态
一个行为,多种状态。
三大特性
封装
继承
多态
封装
类
描述一个事物的抽象概念
一种自定义的数据类型
一个概念
----------------
类似于是一个结构体类型
表现形式
class 类名
{
public:
属性、行为
protected:
属性、行为
private:
属性、行为
};
对象
类的实例化
--------------------
类似于是结构体变量
表现形式
类名 对象名;
访问内容
对象.内容
对象指针->内容
权限修饰符
类内访问:在成员函数里面进行访问
类外访问:通过对象/指针,只要不在类内的作用域
public:公有权限
访问,可以在类内访问,也可以在类外访问
继承,可以被继承
protected:保护权限
访问,可以在类内访问,不能在类外访问
继承,可以被继承
private:私有权限
访问,可以在类内访问,不能在类外访问
继承,不能被继承
一般
属性用private/protected修饰
行为用public修饰
C++的结构体
基本上和类没有差别.
构造函数
继承
区别
结构体:
默认是public权限
继承默认是public权限
类:
默认是private权限
继承默认是private权限
$$$构造函数
概念
在对象被创建时,自动调用的函数
特点
1.不能主动调用
2.构造函数和类名必须同名
3.没有返回值,没有数据类型标识
4.如果用户不写,编译器会自动生成。空的无参构造。
分类
无参构造
没有形参的构造函数
有参构造
有形参的构造函数
缺省构造
形参有默认值
如果是全缺省构造,形参全有默认值。
不能和无参构造同时存在
$$$拷贝构造
拷贝另一个对象的内容
浅拷贝
是编译器默认提供的拷贝构造函数
按bit位进行拷贝,数值是一模一样的
问题:
1.如果原对象有指针/堆区空间。新的对象和原来的对象指向的空间是一样的。
如果不delete,造成内存泄漏。
如果delete,可能会回收很多次。
深拷贝
就是用户自己写的拷贝构造函数
应该,手动开辟堆区空间/手动指针赋值
移动构造
限制构造
表现形式
0.无参
类名 对象名;
1.括号
类名 对象名();
类名 对象名(实参);
类名 对象名(对象); // 拷贝构造
2.显示声明
类名 对象名 = 类名(实参);
3.隐式声明
类名 对象名 = {内容};
类名 对象名 = 对象; // 拷贝构造
初始化列表
表现形式
构造函数():属性(形参)
{
}
作用
1.对属性进行初始化
2.对基类的构造函数传参
3.对组合类对象构造函数传参