C++ 复习三

C++ 复习三

1. 运算符重载operator+

1.1 加法重载(成员函数p1.operator+(p2)//p1+p2 全局operator+(p1,p2)//p1+p2

1.2 重载左移,

1.2.1 不能用成员函数重载(cout不能在左边)
1.2.2 利用全局函数重载 //采用引用实现链式编程
ostream & operator <<(ostream &cout,Student & s)
{
	cout<<s.name<<endl;
	return cout;
}	

1.3 自增(减)的重载

后置++重载返回中间临时对象Student operator++(int)//返回值不同不能作为重载条件,为了区分重载,加int 
前置返回本身 Student & operator++() {return *this}//前置++效率略高,不会调用拷贝构造函数

1.4 指针运算符重载(智能指针,托管堆区创造的对象释放例子)

1.5 赋值运算符重载

系统默认给类实现四个函数(默认构造,析构,拷贝构造,operator=)
由于系统提供的operator=只是简单的值拷贝,属性中如果有堆区数据会造成重复释放
所以重载operator= 返回值Student &(const Student &p)可以链式	

1.6 = [] ->只能用成员函数进行重载

1.7 不能重载&&和||操作符,无法实现短路规则

2. 继承中的构造和析构

2.1 子类不能继承父类的这些函数。

2.2 可以使用初始化列表的方法,显式的指定调用父类的哪个构造函数。

2.3 继承中先调用父类构造,后子类,析构相反。

3. 继承中的同名 优先调用子类,可以通过作用域调用父类,子类会隐藏父类中同名函数的重载版本可通过作用域调用

4. 虚继承 vbptr虚基类指针指向虚基类表vbrable 指向唯一的指针 使用的一份数据

5.多态

5.1 静态联编和动态联编

5.1.1 动态多态 父子之间继承 + 虚函数
动态联编实现条件
父类中有虚函数,子类重写父类虚函数,使用时父类的指针或引用指向子类对象实现堕胎
//重写  子类重新实现父类的虚函数,返回值函数名,参数相同才称为重写(子类重写时可不加virtual)
5.1.2 静态多态 函数重载,运算符重载

5.2 多态原理

当父类中存在虚函数后,内部结构变化,多了指针vfptr虚函数指针指向虚函数表vftable
虚函数表内部记录着虚函数的地址 当子类重写会修改子类虚函数表中的函数地址

6. 函数模板类

6.1 函数模板类使用

templete<typename/class T>//T是一个通用类型,告诉编译器后面紧跟着的函数或者类出现T不要报错
void mySwap(T & a,T & b)//若不使用T 必须使用显式给模板T指定类型
{
	T temp = a;
	a = b;
	b = temp;
}
mySwap(x,y);//自动类型推导
mySwap<int>(x,y);//显式指定类型 可以进行隐式的类型转换(char->int)若转换失败则不能使用

6.2 普通函数和函数模板

6.2.1 区别
普通函数可以隐式类型转换
函数模板自动推导使用不能进行隐式转换
6.2.2 调用规则
函数模板和普通函数都可以调用 优先调用普通函数
可以通过空参数列表语法强制调用函数模板//mySwap<>(x,y);
函数模板也可以发生函数重载
如果函数模板可以产生更好的匹配,优先使用函数模板

6.3 模拟机制

不能处理任意类型 通过函数模板产生模板函数 两次编译
//第一次对代码本身编译,第二次调用时对参数替换后的代码进行编译

6.4 模板的局限性及使用具体化技术解决

对自定义数据类型具体化进行操作	
templete<> bool mySwap<Student>(Student &s1, Student &s2){};

6.5 类模板 不可以使用自动推导调用,且类模板中类型可以有默认参数

templete<class T1,calss T2 = int>
Student<int//第二个可以省略> s;
类模板中的成员函数并不是一开始创建出来的 而是运行时才创建出来
6.5.1 类模板作为函数参数
指定传入类型 参数模板化 整个类模板化//typeid(T).name可以查看T类型名称	
6.5.2 类模板遇到继承
如果父类是一个类模板,子类在继承的时候,必须指定父类中T的类型,否则无法为父类中的T分配内存
6.5.3 类模板类外实现成员函数
templete<class T>
Student::Student(T name)
6.5.4 类模板的分文件编写
不建议分文件编写,因为成员函数创建时在运行阶段,使用时必须包含 .cpp才可以
解决 将类中的成员函数 声明和实现都写在一个 .hpp(类模板文件)文件中

7. 泛型编程 类型参数化(类模板和函数模板)

8. 类型转换

8.1 静态类型转换

static_cast<目标类型>(原对象)
可以转换内置数据类型 
自定义数据类型必须是父子之间的指针或者引用

8.2 动态类型转换

dynamic_cast<目标类型>(原对象)
对于内置数据类型不可以转换
父转子 不安全 转换失败
子转父 安全 成功
发生多态 总是安全

8.3 常量类型转换 const_cast<int */int &/const int */…>(a)

不可以对非指针或非引用的做转换//const int a存储在符号表中不可以卸掉const

8.4 reinterpret_cast重新解释转换(最不安全的)

9. 文件读写//读写头文件fstream

9.1 写 ofstream ofs

ofs.open 指定打开方式 ios::out | ios::trunk
判断是否打开成功 ofs.is_open
ofs<<"aaa"
关闭流对象 ofs.close()

9.2 读 ifstream ifs

指定打开方式 ios::in
判断是否打开成功 ifs.is_open//!ifs
三种方式读
第一种:按行读直到文件末尾 ifs>>buf
第二种:while(ifs.eof())
{
	ifs.getline(buf,sizeof(buf))
}
第三种:单个字符读
while((c = ifs.get())!=EOF)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值