C++学习-9
- 友元主要用于访问私有变量,友元函数跟所在位置的权限没有任何关系friend+函数声明
友元类通常设计为一种对数据操作或类之间传递消息的辅助类(注意一下顺序)
- Explicit就是要求严格的匹配,不允许转换适应,可以强转(最后的那一层一定至少披着同类型的外衣)
- 做类方面的重载的时候一定得考虑深浅拷贝的问题
- 流运算符的重载必须在类的外部
- 运算符重载:1.类的内部重载2.在类的外部重载(要配合friend)简称 友元重载
在每个类都重载了对应的操作之后,可以使用模板进行公共接口的创建
Template<class T>
Void show(T &t)
{ cout<<t<<endl;}
这样就把相同功能统一了接口
在类这个级别的重载运算符,其实就是把对基本数据的操作,整合提升为对类的操作
原则就是跟写函数的形式是一样的
6.在重载自增自减的时候,(int)搞一个填充位标识为后 重载是不改变优先级的
shortsafe operator++(int) 先自增再引用(后自增的思路:创建一个临时对象记录当前状态,再自增原对象然后返回临时对象)
void operator++()先引用临时再自增原本
对于运算符重载是不严格控制返回值或者参数的,
7.赋值重载:主要用于类型转换,基本数据类型转换成类类型都是可以的
Void operator=(const myclass& my1)赋值重载(主要是下一阶段的赋值)
Myclass(const myclass&my1)拷贝构造(主要用于初始化阶段)
重载的精髓在于,你可以随心的控制接口的摆法,至于函数块的实现完全由你根据需求去实现
狭义的:只是用于类对象自己的拷贝和赋值
广义的而言:把参数换成对应的类型就可以生成对应的类型转换
说到底的总结:重载操作符还是重载构造函数:在面向过程向面向对象转换的这个阶段,由对基本数据类型的操作转换到对类类型对象的相关操作这个过程中,重载操作就是自定义许多的原子操作构成类操作
8.非指针深浅拷贝都一样,自己开辟了内存就得注意深浅拷贝
Myclass& operator=(const myclass& my1)赋值重载
返回类对象的时候,此时会调用拷贝构造函数,注意是否拷贝构造也重写了深拷贝
9.typeid(表达式).name()只会获取表达式的类型,但是不会对表达式进行计算
10,你在栈上创建一个对象,即使内部是用new创建的内存,在你返回对象的时候,对象还是无效的
参数都是引用,就不会调用拷贝构造(栈上创建的指针指向在堆上开辟的内存)
拷贝构造深拷贝,赋值重载深拷贝
对象在栈上有生命周期,拷贝栈上的对象,需要深拷贝
拷贝成员的返回值的深浅拷贝总结:
1.Void operator=(const myclass& my1)赋值重载(主要是下一阶段的赋值)
Myclass(const myclass&my1)拷贝构造(主要用于初始化阶段)
狭义的:只是用于类对象自己的拷贝和赋值
广义的而言:把参数换成对应的类型就可以生成对应的类型转换
2.赋值重载有返回值的时候(返回的直接是对象而不是引用或者指针),如果你在创建的对象是在栈上的话,此时返回的时候对象就会调用析构函数,(1).如果你的拷贝构造函数没有进行深拷贝重写,那么内存就会出错(此时指针指向的内容就已经释放掉了),(2)如果拷贝构造是深拷贝,那么流程就是:赋值重载->拷贝构造(当你在赋值重载有返回值的时候,你就得注意你的拷贝构造是否需要深拷贝) (3)如果没有重载返回值的时候,你把析构函数的释放内存的那步给搞掉,那么程序还是可以继续运行。
3. 赋值重载有返回值的时候(指针或引用),是不会调用拷贝构造,但是你的对象必须是在堆上创建,只要是栈上创建的对象都会调用析构函数,一定会被销毁。一个被销毁的对象深浅拷贝都已经没有意义了。
4.在一个函数里面的一个对象实在栈上创建的,那么即使他的成员是在堆上开辟的那么只要函数块走完,析构函数就会完完整整的释放掉这段内存,(所以啊,看一个对象是否会在函数块结束的时候被销毁,就看这个对象创建的时候是在栈上还是在堆上,而不是看他的成员是否在堆上还是在栈上,因为成员的销毁与否,都由析构函数进行指挥)
11.内存四区:
成员函数,静态函数都在代码区,
全局对象,静态变量(只会初始化一次)在静态区
类的大小不算成员函数,静态成员
类中的非静态成员跟对象创建的位置相关
栈区,堆区
Myclass*p=new(指针)。。。。 什么区就跟指针的区相关
类中的const和类的成员数据一样
重载只要涉及到this指针的时候必须是成员函数=,[],(),->
重载的三种形式:
友元重载;涉及到私有或者保护变量
成员函数重载
一般函数重载:那么类一般都是公有成员
重点操作:
Strcpy()实现字符串的深拷贝
Strcat()实现字符串的拼接
宏观总结:在编译器会默认操作的如:delete[],运算符。。。。。这些已经嵌入到了编译器的底层,你需要做的懂是什么搞法,掌握套路即可