苏州市吴中区住房和城乡建设局网站百度营消 营销推广
标准输入输出流
为什么不直接用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.对组合类对象构造函数传参