面向过程和面向对象初步认识
2.类的引入
3.类的定义
4.类的访问限定符及封装
5.类的作用域
6.类的实例化
7.类的对象大小的计算
8.类成员函数的this指针
类与对象
面向过程和面向对象初步认识
- 面向过程
c语言就是面向过程的编程语言,他关注每一步,分析出解决问题步骤,通过函数来实现。 - 面向对象
c++则是面向对象的,故名思想,他关注是一个整体,这个整体的功能,他可以做什么,有什么熟悉。讲一件事情拆分成不同的对象,关注不同对象之间的联系和交互。
类的引入
类与结构体非常相似,只不过在c语言中只能定义变量,而在c++中类内部,还能定义函数。在c++中,这种即可以定义函数又可以变量的自定义类型,更喜欢用class来定义。
比如
#include<iostream>
using namespace std;
class Student
{
void PrintfMessage()
{
cout << name <<" " << age << endl;
}
char name[20];
int age;
};
int main()
{
Student s;
s = { "ls",23 };
s.PrintfMessage();
return 0;
}
类的定义
与定义结构体非常相似,其中class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。
类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。
类有2种定义方式:
定义和声明都写在类中,如果函数定义写在类中,编译器可能会将其当成内联函数处理。
class Student
{
//声明和定义都写在类中
//成员函数
void PrintfMessage()
{
cout << name << " " << age << endl;
}
//成员变量
char name[20];
int age;
};
声明写在类中,定义放在其他.cpp文件中。
//Student.h
#include<iostream>
using namespace std;
class Student
{
//声明和定义都写在类中
//成员函数
public:
void PrintfMessage();
//成员变量
public:
char* _name;
int _age;
};
//student.cpp
#include"Student.h"
void Student::PrintfMessage()//Student::——用来
{
cout << _name << " " << _age << endl;
}
常用第二种方式
类的访问限定符及封装
访问限定符
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
访问限定符分为:1.public(公开)、protected(保护)、private(私有)
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- class的默认访问权限为private,struct为public(因为struct要兼容C)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域
如上的代码,告诉编译器这个函数或者变量是哪个类的
编译器在寻找一个变量时,是现在本身的作用域查找—>全局—>类域
类的实例化
用类类型创建对象的过程,称为类的实例化(如:Student s1)
- 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
- 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
- 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
(我感觉还是和c语言的自定义类型,非常相似。定义了一个类型,拿着自己写的类型去定义变量,只不过这个变量比较特殊,有许多的功能,哈哈)
类的对象模型
如何计算类对象的大小
问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?
这个首先考虑对象是怎么保存的?
只保存成员变量,成员函数存放在公共的代码段
所以一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。
this指针
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
this指针的特性
1.this指针的类型:类类型* const
2.只能在“成员函数”的内部使用
3.this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
void Student::PrintfMessage()
{
cout << this->_name << " " <<this-> _age << endl;//在编译器中,this->是隐藏的
}
4.this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递
面试题
1.C++中struct和class的区别是什么?
C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是的成员默认访问方式是private。
-
this指针存在哪里?
栈中,因为this指针是形参。
-
this指针可以为空吗?
应该不可以(存疑,我去去翻一下)