类和对象基础知识(上篇)

类和对象基础知识(上篇),第1张

主要介绍了类和对象的初阶知识

文章目录
    • 面向过程到面向对象的改变
    • 类的定义
      • 声明和定义分离
      • 声明和定义都在类体中
    • 类的访问限定符及封装
      • 访问限定符
      • 封装
    • 类的作用域
    • 类的实例化
    • 计算类对象的大小
    • this指针
      • this指针的特性
      • `this`存在哪?
      • `this`指针可以为空吗?

面向过程到面向对象的改变

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

类的定义
struct classname
{
	//成员函数 & 成员变量
	
};//分号注意

class classname
{
	//成员函数 & 成员变量
	
};//分号注意

C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是的成员默认访问方式是private

声明和定义分离

主要都是这种方式

声明和定义都在类体中

类的访问限定符及封装 访问限定符

访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

class的默认访问权限为privatestructpublic(因为C++ 的struct要兼容C) ,虽然是这样,但是还是建议明确访问限定,不用默认的

公有 public
public修饰的成员在类外可以直接被访问

私有 private
protectedprivate修饰的成员在类外不能直接被访问(此处protectedprivate是类似的)

保护 protected

封装

面向对象的三大特性:封装、继承、多态
将数据和 *** 作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
封装本质上是一种管理

类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用::作用域解析符指明成员属于哪个类域

void Student::ShowInfo()
{
	cout << _name << "-" << _age << "-" << _sex << endl;
}
类的实例化

定义:用类类型创建对象的过程,称为类的实例化

一个类可以实例化出多个对象,实例化出的对象占用空间,存储了类的成员变量。
举个例子,实例化相当于现实生活中的按照图纸盖出房子,而就是图纸。图纸只是设计,建筑才占空间。

计算类对象的大小

类中有对象和方法,那么怎么算大小呢?
其实类大小,实际上就是成员变量大小之和,函数单独放在公共代码段。

注意:如果是空类,空类并不是0空间,编译器给了空类1字节空间来标识这个类,也就是占位

this指针

由于函数里面并没有区分不同对象,那么如果有一个类s1想调用函数,那这个函数是怎么知道是s1想调用呢?
C++使用了tihs指针解决了这个问题:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的 *** 作,都是通过该指针去访问。只不过所有的 *** 作对用户是透明的,即用户不需要来传递,编译器自动完成。

this指针的特性
  1. this指针的类型:类类型* const
  2. 友元函数没有 this 指针,因为友元不是类的成员。
  3. 只能在“成员函数”的内部使用(可以显式使用,但是一般不用)
  4. 不能显式的去传实参给this
this存在哪?

一般存在栈上,VS2019是存在ecx寄存器上。

this指针可以为空吗?

以下函数调用会发生什么?

class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
void Show()
{
cout<<"Show()"<<endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->PrintA();
p->Show();
}

调用完发现,PrintA函数会崩溃,而Show正常,
所以只要不解引用就没事。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1329773.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存