类与对象

类在C++中十分的重要,所以必须重点掌握好它。 

首先,我们要知道类基于面向对象的三大特性:封装、继承、多态

那么,什么是类和对象呢?

类:像是一种自定义类型,如C中的struct,是对一件事物的抽象,具体的描述事物的属性和功能。不占用内存

对象:是类的实例化, 是具体的,占用内存

 

以下介绍的是类其中的一个特性------封装。

封装:就是类+限定符。在类的限定符有三个-----public(公有),protected(保护),private(私有),若未说明,默认类中的成员是private的。而只有public中的成员可以被类外所访问,protected和private中的成员不可以。因为C++要兼容C,所以由上可知struct中的成员是public的。

类的成员的有两种----成员变量(对象的属性),成员函数(对象的方法)。与C中struct种不同,class中既可以定义变量,也可以定义函数。这就体现了类的快捷。

那么,一个类中要是既有成员变量,又有成员函数怎么计算一个类的对象的大小?我们知道变量的大小可以求出,而函数的大小好像并没有这个说法,所以规定类的大小----只算成员变量的大小(依据内存对其)。那么,一个空类或者一个没有成员变量的类的大小,规定其大小为一个字节

 

在类中有两个十分重要的知识点:this指针和默认成员函数

  • 类的this指针:了解this指针,我们看一下在日期类中,在每个成员函数中,都有一个指针,它是隐藏着的,称为this指针,它指向当前对象,也就是当前对象的首地址,通过this指针,你可以访问到当前对象的成员变量和成员函数(除了在类中有static修饰的函数外)。这在之后会讲在类中用static修饰的函数和变量意味着什么。

       那么,什么是当前对象?在下面中的例子中,解释了当前对象就是,你再哪个对象中调用了类中的函数,函数中的this指针就是那个对象。下例中,在d1中调用了>函数,所以this指针中的内容就是d1中的内容。

       我们还需要关于this指针的几个重点:1.this是常量指针,故它的值不能被修改。2.this指针只能在成员函数中才能使用。3.被static修饰的成员函数不能使用this指针。

  • class Date
    {
    public:
    	void SetDate(int year, int month, int day)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    	bool operator>(const Date& d)
    	{
    		if (this->_year > d._year ||
    			(this->_year == d._year&&this->_month > d._month) ||
    			(this->_year == d._year&&this->_month == d._month&&this->_day > d._day))
    			return true;
    		else
    			return false;
    	}
    
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    
    int main()
    {
    	Date d1, d2;
    	d1.SetDate(1900, 1, 1);
    	d2.SetDate(2018, 11, 8);
    	if (d1 > d2)
    		cout << "d1>d2" << endl;
    	else
    		cout << "d1<d2" << endl;
    	system("pause");
    	return 0;
    }

    类的默认成员函数:

        1.构造函数:构造函数用于解决对象的初始化问题,下列用到了参数缺省和初始化列表。都是十分简单的操作。以下是构造函数需要注意的几点:1.构造函数以类同名。2.构造函数与其他函数不一样,不需要被调用。例:d1(2018,11,8)。

Date (int year = 1900, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{	
	}

      2.析构函数:当一个对象的生命周期结束时,C++编译系统会调用一个成员函数(析构函数)。析构函数在对象销毁时调用(释放资源)。若没有显式定义析构函数,系统会生成默认的析构函数。尤其创建对象时在堆上开辟了空间(malloc、realloc、calloc),为了避免内存泄漏等问题,必须将开辟的空间归还,这就是析构函数的作用。

class Date
{
public:
	~Date()
	{}
private:
	int _year;
	int _month;
	int _day;
};

      3.拷贝构造函数:默认的构造函数,创建对象时用已存在的对象来初始化,其实相当于一个构造函数的重载,构造函数的参数只有一个(类类型),且必须使用引用传参,否则会引发无穷递归调用。

Date (const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

      4.运算符重载:运算符重载的特征为----operator+运算符。本质上是函数重载,且重载不改变操作对象的个数、当运算符重载后,其优先级和结合性不会被改变。

bool operator>(const Date& d)
	{
		Date d1(*this);
		if (d1._year > d._year ||
			(d1._year == d._year&&d1._month > d._month) ||
			(d1._year == d._year&&d1._month == d._month&&d1._day > d._day))
			return true;
		else
			return false;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值