CPP类和对象

来源:互联网 发布:嵌入式软件开发招聘 编辑:程序博客网 时间:2024/05/22 06:39

一、类和对象的基础知识

1.类的定义

在C++中用类来描述对象,使用关键词class来定义类。

class Date//类名{public://公有的private://私有的};

2.访问限定符

访问限定符有public(共有的)、private(私有的)、protect(保护的),在类定义中没有指定访问限定符,默认为private。

3.面向对象封装性

可以对一个对象进行封装处理,把它的一部分属性和功能对外界屏蔽,也就是说从外界是看不到的、甚至不可知的。

封装性指两方面含义:(1)将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间互相独立,互不干扰;

                    (2)将对象中某些部分隐蔽其内部细节,只留下少量借口接口,以便与外界联系,接受外界的消息。

4.对象的大小计算

每个对象的大小为类中所有成员变量的大小之和,但需要遵循内存对齐。


二、四个默认成员函数

1.构造函数

(1)构造函数的函数名与类名相同;

(2)构造函数无返回值;

(3)对象构造时系统自动调用相应的构造函数;

(4)构造函数可以重载;

(5)构造函数可以在类内/类外定义;

(6)无参的构造函数和全缺的构造函数只能有一个。

//构造函数#include <iostream>#include <stdlib.h>using namespace std;class Date{public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Display(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;};int main(){Date d1(1900, 1, 1);d1.Display();system("pause");return 0;}

2.拷贝构造函数

(1)创建对象时使用同类进行初始化,是特殊的构造函数;

(2)拷贝构造函数其实是一个构造函数的重载;

(3)拷贝构造函数的参数必须使用引用传参,使用传值方式会引发无穷递归调用;

(4)若为显示定义,系统会默认缺省的拷贝构造函数。缺省的拷贝构造函数会依次拷贝类成员进行初始化。

//拷贝构造函数#include <iostream>#include <stdlib.h>using namespace std;
class Date{public: Date(int year, int month, int day) {  _year = year;  _month = month;  _day = day; }
 Date(const Date& d) {  _year =d._year;  _month =d._month;  _day = d._day; } void Display() {  cout << _year << "-" << _month << "-" << _day << endl; }private: int _year; int _month; int _day;};
int main(){ Date d1(1900, 1, 1); Date d2 = d1; d1.Display(); d2.Display(); system("pause"); return 0;}

3.析构函数

(1)析构函数无参数,无返回值;

(2)析构函数不能重载;

(3)析构函数完成的清理工作,并不是释放空间;

(4)系统会自动生成析构函数;

(5)析构函数在类名加上字符~。

//析构函数class Date{public:~Date(int year, int month, int day){_year = year;    _month = month;_day = day;}private:int _year;int _month;int _day;};

4.运算符重载

(1)增强程序的可读性;

(2)运算符重载后不能改变运算符的优先级和结合性;

(3)有5个不支持运算符重载:sizeof/::/?:/./.*

(4)拷贝构造函数是创建的对象,使用一个已有对象来初始化准备创建的对象,赋值运算符的重载是对一个已存在的对象进行拷贝赋值。

//赋值运算符重载#include <iostream>#include <stdlib.h>using namespace std;class Date{public:Date(){}Date& operator=(const Date& d){if (_year != d._year){this->_year = d._year;this->_month = d._month;this->_day = d._day;}return *this;}private:int _year;int _month;int _day;};int main(){Date d1;Date d2;d2 = d1;system("pause");return 0;}


三、隐含的this指针 

1. 每个成员函数都有一个指针形参,名字是固定的,称为this指针,this指针是隐式的;(构造函数比较特殊,没有隐含this形参)
2. 编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作实参传递给成员函数的第一个形参this指针;
3. this指针是成员函数隐含指针形参,是编译器自己处理的,我们不能在成员函数的形参中添加this指针的参数定义,也不能在调用时显示传递对象的地址给this指针。

//隐含的this指针void Display(){cout << _year << endl;}void Display(Date* this){cout << this->_year << endl;}