类的重载,隐含的this,运算符重载

1.类:是c++中最重要的特征。

             类的定义:用关键字class +类名

           类和对象:类是框架,不是具体的实例,而对象则是具体的实例化体现。示例:

2.数据抽象和封装

          类背后蕴含的是基本思想是数据抽象和封装。

          数据抽象是一种依赖接口和实现分离的编程和设计技术。类是抽象的,对象是实例化的。类的设计者必须关系这个类的实现,而使用者则关心这个类的接口,不用关心类是怎样具体实现的。

          封装是一项将低层次的元素组合起来形成新的,高层次实体的技术。函数是封装的一种形式:函数的执行的细节行为被封装在这个函数本身中,而被封装的元素隐藏了它的实现细节。同样地,类也是一个封装的实体:他代表若干成员的聚集,大多数良好设计的类类型隐藏了该类型的成员。(c++primer)


3.类的默认成员函数及其运算符的重载

          在一个空类里面,即使我们什么都不定义,也会默认生成六个成员函数:构造函数,拷贝构造,析构函数,赋值运算符重载,取地址操作符重载,const修饰的取地址操作符重载。下面我们用日期类来示例:

class Date
{
public:
	//构造
	Date(int year = 2017, int mouth = 1, int day = 1)
	{
		this->_year = year;
		this->_mouth = mouth;
		this->_day = day;
	}
	//拷贝构造
	Date(const Date& other)
	{
		this->_year = other._year;
		this->_mouth = other._mouth;
		this->_day = other._day;
	}
	//赋值运算符重载
	Date& operator=(const Date& other)
	{
		if (this != &other)
		{
			this->_year = other._year;
			this->_mouth = other._mouth;
			this->_day = other._day;
		}
		return *this;
	}
	//打印日期
	void Show()
	{
		cout << _year << "-" << _mouth << "-" << _day << " " << endl;
	}

protected:
	int _year;
	int _mouth;
	int _day;
};

上面的我们的用的是缺省参数的构造。下面我们对重载运算符及this指针来进行说明:

下面通过另外一个函数调用来进一步理解this指针


重载运算符在实际中是非常必要的,因为我们在生活中大多数不是编译器已有的基本类型,如果不重载运算符,我们是无法对这种类型进行运算的,一般编译器会报错,或者即使编译通过了也不是你想要的结果。


4.类类型大小的计算

          类类型大小的计算:因为类是抽象的,所以在计算类类型大小时,我们不考虑成员函数的大小,只考虑成员变量的大小,但是当有虚函数的时候,我们需要计算虚表指针的大小。而我们在计算大小时,要注意对齐。下面代码具体分析:

class A
{

};

class B
{

protected:
	int b1;
	char b2;
};

class C
{
public:
	virtual void Fun()
	{
		cout << "virtual function" << endl;
	}
protected:
	int c1;
	char c2;

};
int main()
{
	A a;
	cout << "class A    : "<<sizeof(a) << endl;

	B b;
	cout << "class B    : " << sizeof(b) << endl;

	C c;
	cout << "class C    : " << sizeof(c) << endl;

	return 0;
}

上路结果产生的原因:

如有错误,谢谢你的指出,我会改正,毕竟是一个学习的过程。





猜你喜欢

转载自blog.csdn.net/skinwhite/article/details/78162055