类中的四个默认成员函数+运算符重载

来源:互联网 发布:九院吴巍 知乎 编辑:程序博客网 时间:2024/06/06 02:45
1:整理类和对象的基础知识,如类的定义,访问限定符,面向对象封装性,对象的大小计算等等。 
类 = 成员对象+成员方法,成员对象 = 数据,成员方法 = 函数,函数可以在类外部定义,类中声明使用。
访问限定符 :①public ②private ③protect 
public: 可以从外部访问类中的成员对象和成员方法。
private,protect:成员不能从类外部直接访问。
没有限定符,默认为私有。类的限定符体现了面向对象的封装型。
面向对象封装型:该公开的就公开话,该私有的就隐藏掉,主要是由public,private实现;作用是便于分工和分模块,防止不必要的扩展;
对象的大小计算:和结构体计算大小相同,也要遵循对齐规则。对齐规则,空间换取时间,提高效率。
类中没有成员时,vs默认大小为1,占位。
2:整理四个默认成员函数及运算符重载相关知识 


一: 构造函数:
1:函数名和类名相同
2:无返回值
3:对象构造(创建对象)时系统自动调用构造函数
Data D1(1,2,3);
4:可重载
5:可在类中定义,也可在类外定义,类中调用。
6:如果类中没有给出构造函数,c++编译器系统自动给一个缺省构造函数,但只要构造了一个构造函数,编译器就不会再给。
7:无参的函数和全缺省的构造函数都认为是缺省构造函数,缺省构造函数类中只能存在一个,不然冲突,
                        Data(int year = 2017,int month = 7,int day = 10)
{
}
Data()
{
}


二:拷贝构造函数:创建对象时同类初始化
1:拷贝构造函数其实是构造函数的重载
2:拷贝构造函数的参数必须是引用,如果用形参会导致无限递归,
比如:Data d2(Data d1);因为d1是形参,在创建形参过程中,需要调用拷贝构造函数,这样会继续这样,无限递归,因此使用拷贝构造函数是传参需要是引用。
3:类中如果没有定义拷贝构造函数,系统会默认缺省的拷贝构造函数。


三:析构函数:完成清理,(动态开辟的free,调用文件时的close)
1:析构函数名称是在类明的前面加上~,比如 class AA,析构函数名就是~AA();
2:没有返回值;
3:一个类有且只有一个析构函数;若类中没有定义,系统会自动生成缺省的构造函数;
4:对象生命周期结束时,c++编译器系统会自动调用;
5:注意析构函数不是删除对象,而是做一些清理工作;
注:运算符重载:为了增强程序可读性,c++支持重载
      五个不能重载的运算符:①.*   ②::  ③sizeof  ④?:(三目运算符) ⑤.


四:赋值运算符重载:多次操作运算符
1:赋值运算符重载是对一个已存在的对象进行拷贝赋值;
2:operator+合法的运算符    构成函数名
3:运算符的重载不改变运算符的优先性


3:整理隐含的this指针等等,及对运算符重载背后做的事情。
this指针:一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。
同一个类的不同对象,调用类中函数时,看起来是d1.display();
d2.display();其实有隐含的this指针,d1.display(&d1);d2.display(&d2);
赋值运算符重载后边的this指针用法:
Data d1,d2,d3;
d1 = d2 = d3;
实际就是d1.operator = (d2.operator = d3);
d2.operator = d3;也就是data& operator=(this,const data& d3);只不过这个this是默认隐含的。








阅读全文
0 0