前言
今天,我们来学习类和对象的上半部分,加油哦。
一.面向过程和面向对象初步认识
C语言是面向过程的,关注的是过程。
C++是面向对象的,关注的是对象。
二.类的引入
C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。
代码如下:
struct Student
{
void SetStudentInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintStudentInfo()
{
cout<<_name<<" "<<_gender<<" "<<_age<<endl;
}
char _name[20];
char _gender[3];
int _age;//这里的成员变量为声明
};
int main()
{
Student s;
s.SetStudentInfo("Peter", "男", 18);
return 0;
}
struct也可以用class替换,两个的区别我们往下再讲到。
类的定义
class className
{
//类体:由成员函数和成员变量组成
};//注意一定要加分号
类的两种定义方式
- 声明和定义全放在类体中,注意;成员函数如果再类中定义,编译器可能会将其当成内联函数处理。
代码如下:
class Person
{
public:
void showInfo()
{
cout<<_name<<"-"<<_sex<<"-"<<endl;
}
public:
char* _name;
char* _sex;
int _age;
}
- 声明放在h.文件中,类的定义放在.cpp中
一般期望采用第二种方式
类的访问限定符
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
说明:
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。
- class的默认访问权限为private,struct为public(因为struct要兼容C)。
封装
面向对象的三大特性:封装、继承、多态。
现阶段,我们只了解类的封装特性。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。(封装本质上是一种管理)
如何计算类对象的大小
这个时候有的学生就在想了,那这个类的大小该如何计算,是只算类成员变量或者是只算成员函数,异或是两个都算?接下来我们就来看看计算机到底如何存储?
我们先来看下例子:
//在32位编译器中
class A1
{
public:
void SetStudent(char name,int age,char sex);
public:
int _age;
char _name[4];
}
这个时候,我们看到如果是只看成员变量的话,类的大小为8;只看成员函数的话,类的大小是未知的,而且如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间,这样的话,就不需要看两者都算了,但是为了严谨,还是运算看下。
这样看来,编译器采取的是只算成员变量的大小。
结论:一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。
三.this指针
在这里先让我们定义一个日期类Date
class Date
{
public :
void Display ()
{
cout <<_year<< "-" <<_month << "-"<< _day <<endl;
}
void SetDate(int year , int month , int day)
{
_year = year;
_month = month;
_day = day;
}
private :
int _year ; // 年
int _month ; // 月
int _day ; // 日
};
int main()
{
Date d1, d2;
d1.SetDate(2018,5,1);
d2.SetDate(2018,7,1);
d1.Display();
d2.Display();
return 0;
看完了这个类后,有的同学就会问了Date类中有SetDate与Display两个成员函数,函数体中没有关于不同对象的区分,那当d1调用SetDate函数时,该函数是如何知道应该设置d1对象,而不是设置s2对象呢?
这个时候C++就通过引入this函数来解决这类的问题,C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
this指针的特性
- this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this
形参。所以对象中不存储this指针。 - this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户
传递
总结
今天的类与对象的初步学习就到这里,过几天,我就会更新中(有可能也会高产),都看到这里,不关注一下嘛?只要动动你的小手指。