面向对象编程的核心是“类”,有了类我们才能实例化对象,以至于用对象解决问题。
那么到底什么是类和对象呢?顾名思义,类就是种类,对象就是某一种类的一个个体。
形象的说,学生就是一个类,而具体的人就是对象。
再形象具体一点,我们把“××大学××院系××专业××班级的学生”作为一个类的话,
那么”这个班级里的一个学生某某“就是类的实例化对象。
抽象的说,类是一群对象的共同属性与共有动作的集合,用类就可以描述某些对象的特性。
而我们所提到的共同属性与共有动作,即为类中的成员变量与成员函数。
由此是否联想到了C语言中的结构体了?但类更高级的地方就在于可以容纳成员的动作了。(该比较是针对C语言中的结构体)。
以下是一个简单的”haha类“,其成员都具有p,q的共同属性,都可以执行add的动作,甚至由于p,q已经是自身的固有属性了,在进行add动作时(调用函数时),可以直接使用。
类中变量就是类的属性,类中函数也称类的方法。
其格式与C语言中的struct差不多(结尾' ; '不要忘)。
有个方便是不用再typedef了,haha就是类的名字。
补充:定义在类⾯的成员函数默认为inline。
class haha
{
public:
int add(int x,int y)
{
cin >> p;
int pq = p + q;
return x + y;
}
private:
int p;
int q = 10;
};
haha类中有两个奇怪的public和private看不懂,其实他们就是类的访问限定符,用于限制外部对于类中成员的使用,还有第三个访问限定符是protected.
【1】public修饰的成员在类外可以直接被访问;
protected和private修饰的成员在类外不能直接被访问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。
【2】访问限定符的作用域自':'起,到下一个访问限定符的名字终。
【3】class定义时若不带限定符,则默认private;而struct(C++)则默认为public。
【4】⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。
之前的文章有介绍过”域“的概念,那时就有提到”类域“。定义类的属性与方法的作用域就是类域。
在类外定义成员或访问成员时,用::来指向。
作为域,其效果与命名空间域相同,都会影响编译器的查找规则,即使得编译器在遇到类中的成员时,会优先访问其所在类域进行查找,而不会去全局作用域或局部作用域中浪费时间,还找不到,然后报错。
实例化对象中的实例化是一个动词,意为--用类来申请内存空间。
“申请内存空间”是不是很熟悉?在C语言学习中,我们说:创建变量的本质是申请内存空间。
实例化可大概理解为:用类创建一个对象 == 用数据类型创建一个变量。
上述为什么提到内存空间?因为实例化出的对象是有具体的内存空间的,而类中的成员是没有空间的,实例化的对象所获得的空间正可用于存储其类中的成员变量。
形象的理解:类是一个设计图,对象是通过设计图所造出的object。
或者说,类是一个房子的设计图,设计图有实际空间能住人吗?那肯定是由设计图建造的房子,有物理空间的房子能住人啊。
请回忆起:C语言在结构体的内存大小中学习的内存对齐。
要算一个对象的内存大小,要关注对象所在类中的成员变量,不需要考虑成员函数。
【1】对齐数默认为8,需与成员变量类型的字节数比较,取较小值。
对齐数 = 默认值 与成员变量大小的 较小值
【2】从0以及对齐数的整数倍开始算(第⼀个成员在与结构体偏移量为0的地址处。其他成员变量要对⻬到对⻬数的整数倍的地址处。)
【3】最终内存大小 = 最大对齐数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍
【4】如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。
class hehe
{};
由hehe实例化的对象的大小是0吗? ------>当然不是,而是1。因为还是需要一个字节来证明hehe类的存在的。
为什么对象不存储成员函数的内存呢?那这些成员函数即(指令)存到哪里去了?
this指针说白了就是实例化的对象自己的指针。作用可简单概括为--区分不同对象。
当对象在调用其方法时,C++会隐式的传送对象自己的指针,即将this指针作为参数传给函数。这样当两个同类对象在调用自己的函数时,函数才知道到底处理谁。C++只有在函数体内部才能显示使用该指针。
haha h1;
haha h2;
h1.add(1,2);
h2.add(3,4);
基础介绍,轻喷。。